спецификация на формат за аргумент 2, като в 'msgstr[0]', не съществува в 'msgid_plural'

Имам следния код:

public function bulk_updated_messages ( $bulk_messages = array(), $bulk_counts = array() ) {

    $bulk_messages[ $this->post_type ] = array(
        'updated'   => sprintf( _n( '%1$s %2$s updated.', '%1$s %3$s updated.', $bulk_counts['updated'], 'yosilose' ), $bulk_counts['updated'], $this->single, $this->plural ),
        'locked'    => sprintf( _n( '%1$s %2$s not updated, somebody is editing it.', '%1$s %3$s not updated, somebody is editing them.', $bulk_counts['locked'], 'yosilose' ), $bulk_counts['locked'], $this->single, $this->plural ),
        'deleted'   => sprintf( _n( '%1$s %2$s permanently deleted.', '%1$s %3$s permanently deleted.', $bulk_counts['deleted'], 'yosilose' ), $bulk_counts['deleted'], $this->single, $this->plural ),
        'trashed'   => sprintf( _n( '%1$s %2$s moved to the Trash.', '%1$s %3$s moved to the Trash.', $bulk_counts['trashed'], 'yosilose' ), $bulk_counts['trashed'], $this->single, $this->plural ),
        'untrashed' => sprintf( _n( '%1$s %2$s restored from the Trash.', '%1$s %3$s restored from the Trash.', $bulk_counts['untrashed'], 'yosilose' ), $bulk_counts['untrashed'], $this->single, $this->plural ),
    );

    return $bulk_messages;
}

И тогава в моя .po файл имам:

#, php-format
msgid "%1$s %2$s updated."
msgid_plural "%1$s %3$s updated."
msgstr[0] "%1$s %2$s actualizado/a."
msgstr[1] "%1$s %3$s actualizados/as."

Но когато се опитам да създам своя .mo файл с Poedit, получавам тази грешка:

a format specification for argument 2, as in 'msgstr[0]', doesn't exist in 'msgid_plural'

Не разбирам какво не е наред тук. Това ли е начинът, по който наричам "_n", или нещо в моя преведен низ?

Виждам, че това по някакъв начин е свързано с маркерите за позиция на sprintf... че poedit очевидно не харесва, че имам $3%s в msgid_plurals, а не в msgid... но не трябва ли просто да превежда низа "както е"? Ще предам преведените низове на sprintf по време на изпълнение, като вмъкна подходящите съществителни на място...


person yivi    schedule 19.11.2014    source източник


Отговори (1)


Не че Poedit не го харесва, това е инструментът gettext msgfmt — и вашият начин на правене на множествено число се проваля при проверките за разумност. Както забелязахте, причината е, че трябва да използвате едни и същи аргументи както в msgid, така и в msgid_plural. Просто го направи.

Ако се чудите защо, това е, защото вашият код пренебрегва възможността някои езици да имат повече (или по-малко!) от само две форми, единствено и множествено число. Славянските езици имат 3, арабският има 6, японският само 1. Вашият код никога не може да работи правилно с тези езици.

Както често се случва, ръководството за GNU gettext обсъжда този проблем в някои подробности: http://www.gnu.org/savannah-checkouts/gnu/gettext/manual/html_node/Plural-forms.html

person Václav Slavík    schedule 20.11.2014
comment
Опитвам се да направя нещата динамични и се замислям за това... :P Мислите ли, че нещо подобно би било правилният начин да постигна това, което искам? 'updated' =› sprintf( _n( '%1$s %2$s актуализиран.', '%1$s %2$s актуализиран.', $bulk_counts['updated'], 'yosilose' ), $bulk_counts ['updated'], _n($this-›single, $this-›plural, $bulk_counts['updated'] ) ), тествах го и работи, само се притеснявам, че това не е правилният или най-добрият начин за направете го... Много благодаря за цялата ви помощ. - person yivi; 20.11.2014
comment
Е, форматирането на коментарите е объркано. Но ако работи, мога да актуализирам въпроса си или да редактирам отговора ви за бъдещи търсещи. - person yivi; 20.11.2014
comment
@yivi Прочетете свързания раздел с ръководството, той обяснява какво е правилното нещо да направите и защо. Грешката ви е, че използвате %2$s като контейнер за подходяща дума на първо място — това не може да се изрази добре и дори ако успеете да работите донякъде, вашите преводачи ще ви намразят (и ще направят направени преводи). - person Václav Slavík; 20.11.2014
comment
@yivi Също така, никога не е добра идея да предавате нещо различно от низови литерали като аргументи на низ на _n (или на която и да е друга функция gettext). Никога, никога не правете това. Това прави действителните низове неизвличаеми. Наистина трябва да прочетете ръководството, то обяснява всички тези неща подробно — и то добре. - person Václav Slavík; 20.11.2014
comment
Да, прочетох документите, които сте свързали, благодаря. Отново, вероятно просто не го разбирам добре. Моите извинения. Сега разбирам, че предаването на нещо друго освен литерали към функциите gettext не е добра идея. Мисълта ми беше, че тъй като $2%s щеше да бъде заменено с друго извикване на _n(), със същото число като квантор като първото извикване на _n(); преводът щеше да проработи (и бъдещите преводачи нямаше да ми намразят червата). - person yivi; 20.11.2014
comment
Обикновено това трябва да работи. Имах такъв вид грешка, когато случайно промених %d на %s в превода. - person xavier bs; 04.09.2020