This is a documentation for Board Game Arena: play board games online !
Транслатионс
Усинг БГА Студио, тхе гаме yоу цреате ис реадy то бе транслатед то еацх лангуаге бy тхе БГА цоммунитy. То маке тхис поссибле, yоу онлy неед то специфy wхицх стринг муст бе транслатед анд хоw то цомбине тхем.
Хоw транслатион wоркс?
Wхен девелопинг yоур гаме, алл стрингс муст бе ин Енглисх. Стрингс муст бе цохерент wитх тхе Енглисх версион оф тхе гаме.
Бефоре тхе релеасе оф тхе гаме, БГА теам wилл до тхе Френцх транслатион оф тхе гаме.
Афтер тхе релеасе оф тхе гаме, тхе БГА плаyерс цоммунитy wилл транслате тхе гаме ин еверy лангуаге.
Wхат схоулд бе транслатед?
Еверy теxт тхат цан бе висибле бy тхе плаyер wхен тхе гаме ис руннинг нормаллy. Тхис инцлудес тоолтипс, теxтс он цардс, еррор мессагес, ...
Тхис доес НОТ инцлуде еррор мессагес тхат аре нот суппосед то хаппенед (унеxпецтед еррорс).
Фоцус он транслатинг нотифицатионс
Усуаллy, транслатинг а wебсите ис симпле: yоу јуст цалл а фунцтион он еверy стринг yоу хаве то транслате, анд тхе стринг ис транслатед ин тхе плаyер'с лангуаге. Он Боард Гаме Арена, тхис ис еxацтлy тхе саме wитх тхе "_( стринг )" фунцтион.
Хоwевер, тхере ис оне дифференце он БГА: нотифицатионс. Тхе сервер ис сендинг нотифицатионс то плаyерс, анд мост оф тхе тиме тхе нотифицатионс аре тхе саме фор еверy плаyерс, но маттер wхат лангуаге еацх плаyер ис усинг. Тхис ис wхy нотифицатионс аре транслатед он цлиент сиде ин тхе пропер лангуаге, евен иф тхе стрингс аре дефинед он сервер сиде.
WАРНИНГ: хоw то маке суре yоур стрингс wилл бе транслатед
Фор еацх гаме, оур транслатион тоол ис доинг а фулл сцан оф тхе цоде, лоокинг фор транслатор маркерс лике "_()" ор "цлиентранслате()"... (сее белоw тхе лист оф транслатион маркерс).
Иф yоур оригинал стринг ис нот "пхyсицаллy" инсиде оне оф тхис маркер, ит wон'т бе транслатед.
// Examples: the following strings will be translated: var mystring_translated = _("my string"); // JS $mystring_translated = self::_("my string"); // PHP $mystring_translated = sprintf( _("my string with an %s argument"), $argument ); // PHP // Examples: the following strings WILL NOT be translated: $my_string = "my string"; $not_translated = self::_( $my_string ); // The original string is not bordered by a translator marker => no translation $not_translated = self::_( sprintf( "my string with a %s argument", $argument ) ); // Same thing
Хоw то нот маке транслаторс цразy ;)
- Wхен yоу неед тхе саме стринг тwице, трy то реусе еxацтлy тхе саме стринг (wитх тхе саме цасе) то минимизе тхе нумбер оф стрингс.
- До нот марк ас транслатабле а гаме елемент тхат доес нот хаве то бе транслатед (еx: иф тхе наме оф а монстер он а цард ис "Ззззз", маyбе тхере'с но неед то транслате ит).
- Wордс доес нот цоме ин тхе саме ордер ин еацх лангуаге. Тхус, wхен yоу хаве то транслате а стринг wитх ан аргумент, до нот wрите сометхинг лике:
_("First part of the string, ").$argument.' '._("second part of the string")
Wрите инстеад:
sprintf( _("First part of the string, %s second part of the string"), $argument )
(ор тхе еqуивалент "дојо.стринг.субституте" ин Јавасцрипт)
- Wхен транслаторс аре гоинг то транслате yоур гаме, тхе мост диффицулт таск фор тхем ис то гет тхе цонтеxт оф тхе стринг то бе транслатед. Тхе море тхе стринг ис а схорт инсигнифицант стринг, тхе море диффицулт ис тхе таск фор тхем. Ас а руле оф тхумб, трy то авоид инсигнифицант схорт стрингс.
- Тхе БГА транслатион полицy ис то бе флеxибле он граммар... Wе префер то wрите "плаyер гетс 1 цоин(с)" тхан wрите тwо версионс оф тхе саме стринг фор плурал анд сингулар - ит редуцес тхе нумбер оф стрингс то транслате.
- Инстеад оф wритинг нице стрингс лике "Wитх тхе еффецт оф ЗЗЗ, плаyер XXX гетс а неw YYY", wхицх ис верy диффицулт то транслате, wрите стрингс лике "ЗЗЗ: XXX гетс YYY".
Он цлиент сиде (Јавасцрипт)
Он цлиент сиде, тхингс аре qуите симпле: yоу јуст хаве то усе тхе "_()" фунцтион фор алл стрингс yоу wант то транслате.
Еxамплес:
// Get a string in player's language: var translated = _("original english string"); // Get a string in player's language with parameter: var translated = dojo.string.substitute( "You can pick ${p} cards and discard ${d}", { p: 2, d: 4 } );
WАРНИНГ: ин Јавасцрипт стрингс то транслате, yоу схоулд невер усе '\н', '\т' ор суцх, ас ит wилл бреак тхе транслатион бундле анд ресулт ин алл тхе Јавасцрипт транслатион то фаил. Ин анy цасе, тхе стрингс wилл ресулт ин ХТМЛ цоде, анд суцх цхарацтер цодес wон'т хаве анy импацт он тхе ХТМЛ рендеринг. Yоу схоулд усе ХТМЛ маркуп инстеад.
Он сервер сиде (ПХП)
Он ПХП сиде, yоу цан усе 3 дифферент фунцтионс то специфy тхат а стринг муст бе транслатед.
цлиенттранслате( "мy стринг то транслате" ):
Тхис фунцтион ис транспарент: ит wилл ретурн тхе оригинал Енглисх стринг wитхоут анy цханге. Ит'с онлy пурпосе ис то марк тхис стринг ас "муст бе транслатед", анд то маке суре тхе транслатед версион оф тхе стринг wилл бе аваилабле он цлиент сиде.
Ин генерал, yоу усе цлиенттранслате:
- Он yоур статес.инц.пхп, фор фиелд "десцриптион" анд "десцриптионмyтурн".
"description" => clienttranslate('${card_name}: ${actplayer} must discard 4 identical energies'),
- Он "материал.инц.пхп", wхен дефининг теxтс фор гаме материал тхат муст бе дисплаyед он цлиент сиде.
$this->card_types = array( 1 => array( 'name' => clienttranslate("Amulet of Air"), // Thus, we can use "_( card_name )" on Javascript side.
- Wхен сендинг а нотифицатион wитх "нотифyАллПлаyерс" ор "нотифyПлаyер", фор тхе гаме лог стринг анд алл гаме лог аргументс тхат неед а транслатион.
// A game log string with no argument: self::notifyAllPlayers( 'pickLibraryCards', clienttranslate("Everyone draw cards from his library"), array() );
Транслатинг аргументс ис а литтле бит море цомплеx. Ит ис усинг тхе "и18н" специал аргумент ас белоw:
// In the following example, we translate the game log itself, but also the "card_name" argument: self::notifyAllPlayers( 'winPoints', clienttranslate('${card_name}: ${player_name} gains ${points} point(s)'), array( 'i18n' => array( 'card_name' ), // <===== We specify here that "card_name" argument must be transate 'player_id' => $player_id, 'player_name' => self::getActivePlayerName(), 'points' => $points, 'card_name' => $this->card_types[8]['name'] // <==== Here, we provide original English string. ) );
селф::_( "мy стринг то транслате" ):
Тхис фунцтион ретурнс а стринг транслатед ин тхе лангуаге оф ЦУРРЕНТ усер (ие: плаyер wхо сенд тхе реqуест то тхе сервер) (бе царефул, тхис ис НОТ тхе ацтиве плаyер).
Мост оф тхе тиме, yоу дон'т неед то транслате стрингс он сервер сиде, еxцепт он тхе фоллоwинг 3 ситуатионс:
- Wхен тхроwинг ан еxцептион бецаусе тхе плаyер дид а форбидден мове.
// This will display a translatable red message to the player that just do some wrong action: throw new BgaUserException( self::_('You must choose 3 cards') ); // ... notice the use of BgaUserException that signals that this exception is "expected". In theory, all exception that are expected should be translated.
- Ин "yоургаме.виеw.пхп", wхен цреатинг тхе лабелс фор тхе гаме интерфаце усед ин yоур темплате (.тпл) филе.
$this->tpl['CARDS_FOR_YEAR_2'] = self::_("Your cards for year II");
- Евентуаллy, ин yоур материал.инц.пхп, иф фор еxампле yоу неед то усе соме стринг елементс ин yоур еxцептионс.
// In material.inc.php, $this->energies[n]['nametr'] has been created with the self::_() method. This we can do this: throw new BgaUserException( self::_("To execute this action you need more: ").' '.$this->energies[$resource_id]['nametr'] );
- Евентуаллy, ин yоур "гетАллДатас" ПХП метход, ас тхе дата ретурн бy тхис метход ис усед онлy бy цуррент усер.
тотранслате( "мy стринг то транслате" ):
Тхис фунцтион wоркс еxацтлy лике 'цлиенттранслате', еxцепт ит теллс БГА тхат тхе стринг ис нот неедед он цлиент сиде.
Yоу схоулд нот усе тхис фунцтион, еxцепт он тхе фоллоwинг цасес:
- Статистицс наме ин статс.инц.пхп
- Оптион намес анд оптион валуес наме ин гамеоптионс.инц.пхп