Автор Гілка: Помилки в перекладах  (Прочитано 78174 раз)

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3646
  • Карма: +3/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Re: Помилки в перекладах
« Відповідей #90 : 2025-01-19 21:52:53 »
@yurchor відносно
Цитата
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
по діфам на GTK сайті четверта форма з'явилась зі зміною на trans-uk@lists.fedoraproject.org
а звідки у федори з'явилась четверта форма?
Єдиний варіант використання, що я знайшов, це пропуск чисел за рахунок викидання printf аргументів, приклад:
Цитата
msgid_plural "Files in the trash are permanently deleted after %d days"
msgstr[0] "Файли у Смітнику буде остаточно вилучено за %d день"
msgstr[3] "Файли у Смітнику буде остаточно вилучено за день"
Але якщо брати взагалі (не тільки цей приклад), то невідповідність printf аргументів, то чревато крешами.
Тому мабуть якась інша потреба була в цій 4й формі.
Мій виклад проблеми. На усіх інших ресурсах з цим погодилися.

https://docs.linux.org.ua/%D0%9F%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8/%D0%9A%D0%BE%D1%80%D0%BE%D1%82%D0%BA%D0%B8%D0%B9_%D0%B4%D0%BE%D0%B2%D1%96%D0%B4%D0%BD%D0%B8%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_KDE/
Try to reach you before winter comes
Always a place for you in my heart
You're not alone
All used up
I'd give anything to talk to you

Відсутній yvs115

  • Дописувач
  • **
  • дописів: 90
  • Карма: +2/-0
Re: Помилки в перекладах
« Відповідей #91 : 2025-01-20 01:18:45 »
Проблему я розумію (точніше те що переклад "надіслати байт" виглядає краще ніж "надіслати 1 байт"), але..
це з точки зору перекладу і перекладача.

Подивіться на це з точки зору кодування, нп що може відбуватися коли нехтуються c-printf аргументи
#include <stdio.h>

int main() {
    printf("\n%s:\n", "Option1");
    printf("за %d день чи за %d день\n", 1, 21);
    printf("за день чи за %d день\n", 1, 21);

    printf("\n%s:\n", "Option2");
    printf("за %d день, за '%s' день\n", 1, "другий");
    printf("за день, за '%s' день\n", 1, "другий");

    return 0;
}

при виконанні видасть
% ./test

Option1:
за 1 день чи за 21 день
за день чи за 1 день

Option2:
за 1 день, за 'другий' день
segmentation fault (core dumped)
%

Тобто в першому варіанті отримано неправильний результат, у другому - креш.

У випадку крупних фреймворків (як GTK чи KDE) з купою запобіжників в лібах, скоріш усього креши не відбудуться, хоча некоректний результат все ж таки думаю іноді буде.
Такий трюк із с-format аргументами буде працювати у випадку якщо аргумент рівно один (як у прикладі вище з nautilus FileManager),
хоча і в цьому випадку невідомо як така паттерн використовується далі - напряму в printf чи як частина іншої паттерн де можуть бути ще додаткові параметри (що теж іноді іноді зустрічається в програмах).

Тобто з точки зору перекладача - це додаткова можливість покращити переклад,
тоді як з точки зору кодера - це можлива додаткова точка збою в софті.

update: як на мене, то можливість нехтування с-printf аргументом(-ами) мала б бути врахована в gettext чи навіть у самому софті.
« Змінено: 2025-01-20 01:54:44 від yvs115 »

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3646
  • Карма: +3/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Re: Помилки в перекладах
« Відповідей #92 : 2025-01-20 14:36:10 »
update: як на мене, то можливість нехтування с-printf аргументом(-ами) мала б бути врахована в gettext чи навіть у самому софті.
Все там враховано. Приклади, фактично, з підручника з gettext.
Try to reach you before winter comes
Always a place for you in my heart
You're not alone
All used up
I'd give anything to talk to you

Відсутній yvs115

  • Дописувач
  • **
  • дописів: 90
  • Карма: +2/-0
Re: Помилки в перекладах
« Відповідей #93 : 2025-01-20 20:12:38 »
> Все там враховано. Приклади, фактично, з підручника з gettext.
>
   я такого не зустрічав, думаю як би був такий null singular - то в першу чергу його б заюзали англійською

  ngettext з некоректним результатом внаслідок нехтуванням c-printf аргументами:
% cat po/uk.po
msgid ""
msgstr ""
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : "
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

#, c-format
msgid "in %d day"
msgid_plural "in %d days"
msgstr[0] "за %d день"
msgstr[1] "за %d дні"
msgstr[2] "за %d днів"
msgstr[3] "за день"

% cat test_n.c
#include <stdio.h>
#include <stdlib.h>
#include <libintl.h>
#include <locale.h>

#define PACKAGE_NAME "test_n"

int main(int argc, char **argv) {
    setlocale(LC_ALL, "");
    bindtextdomain(PACKAGE_NAME, "/usr/local/share/locale");
    textdomain(PACKAGE_NAME);
    //
    if (argc > 2) {
        int n1 = atoi(argv[1]);
        int n2 = atoi(argv[2]);
        char format[1024];
        snprintf(format, sizeof(format), "%s, %s\n",
          ngettext("in %d day", "in %d days", n1),
          ngettext("in %d day", "in %d days", n2));
        printf(format, n1, n2);
    }
    //
    return 0;
}

% ./test_n 21 22
за 21 день, за 22 дні

% ./test_n 1 22
за день, за 1 дні

p.s. навіть не кажучи що софт іноді викорстовують в скриптах, і якщо прогою очікується число десь, то там має бути саме число - а не щось інше (навіть якщо те інше виглядає краще в перекладі)

Update: знайшов що gettext дока каже
Цитата
because in many languages the translators want to replace the ‘%d’ with an explicit
word in the singular case, just like “one” in English, and C format strings cannot
consume the second argument but skip the first argument. Instead, you have to
reorder the arguments so that ‘n’ comes last:
printf(ngettext("%2$d file removed from directory %1$s", "%2$d files removed from directory %1$s", n), dir, n);
Тобто у випадках з більш ніж одним аргументом, треба робити їх перетасовку.
В простих випадках коли відомо як буде використано формат в коді - то можливо (тобто дивитись код щоб нічого не поламати і зробити відповідний reordering),
в більш складних треба кожного разу читати відповідний код як то використовується (є сумніви що транслятори будуть продивлятись код щоб зробити складний варіант робочим).

Плюс до того що в інших трансляціях (включно англійську) додаткова null форма не використовується як загальне правило.
Тому правило яке працює в окремих випадках краще не використовувати як загальне.

Imho of course
« Змінено: 2025-01-20 21:24:25 від yvs115 »

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3849
  • Карма: +12/-0
  • Програміст
Re: Помилки в перекладах
« Відповідей #94 : 2025-01-21 16:08:41 »
Я перекладаю Gnu Savane. Там є множинна форма повідомлень. Я використовую "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n".

Мені потрібно переходити на 4 чи 5 форм (жодного, один, *1, *[234], *)? Я навіть там де в оригіналі пише словами один, два, три, ставлю цифру, бо мені так подобається.
[Fedora Linux]

Відсутній yvs115

  • Дописувач
  • **
  • дописів: 90
  • Карма: +2/-0
Re: Помилки в перекладах
« Відповідей #95 : 2025-01-21 17:09:27 »
То як подивитися, нульова форма може покращити переклади
нп "Надіслати листа" замість "Надіслати 1 лист".
Але не як загальне правило з використанням 4ї форми.

В цілому теж - три форми якщо казати взагалі, з деякими виключеннями нп такими останім часом
- не використовувати локалізацію в скриптах (якщо не має можливості її відключити)
- не використовувати взагалі c-format в коді з підвищеними правами (нп ping в деяких linuxes, де для локалізації має бути достатньо звичайних літерал повідомлень)
« Змінено: 2025-01-21 17:11:27 від yvs115 »

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3646
  • Карма: +3/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Re: Помилки в перекладах
« Відповідей #96 : 2025-01-21 20:49:42 »
Я перекладаю Gnu Savane. Там є множинна форма повідомлень. Я використовую "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n".

Мені потрібно переходити на 4 чи 5 форм (жодного, один, *1, *[234], *)? Я навіть там де в оригіналі пише словами один, два, три, ставлю цифру, бо мені так подобається.
Ні, звичайно. Це для випадків без замінника (усюди множина, окрім четвертої форми) або для випадків, де немає замінника в однині.

Загалом, треба робити за стандартом CLDR (там теж чотири форми), але якщо не хочеться, і немає помилки, то нічого страшного у трьох формах теж немає.
Try to reach you before winter comes
Always a place for you in my heart
You're not alone
All used up
I'd give anything to talk to you

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3646
  • Карма: +3/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Re: Помилки в перекладах
« Відповідей #97 : 2025-01-21 20:54:30 »
Я перекладаю Gnu Savane. Там є множинна форма повідомлень. Я використовую "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n".

Мені потрібно переходити на 4 чи 5 форм (жодного, один, *1, *[234], *)? Я навіть там де в оригіналі пише словами один, два, три, ставлю цифру, бо мені так подобається.
Друкарські помилки:

запитажмо -> запитаємо
зареєстрованіу
поточе -> поточне
розсики -> листування
Try to reach you before winter comes
Always a place for you in my heart
You're not alone
All used up
I'd give anything to talk to you

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3849
  • Карма: +12/-0
  • Програміст
Re: Помилки в перекладах
« Відповідей #98 : 2025-01-21 21:04:23 »
CLDR трохи заскладне для простого перекладу:

NameTypeCategoryExamplesMinimalRules
Ukrainiancardinalone1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … 1 деньv = 0 and  i % 10 = 1 and  i % 100 != 11
few2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … 2 дніv = 0 and  i % 10 = 2..4 and  i % 100 != 12..14
many0, 5~19, 100, 1000, 10000, 100000, 1000000, … 5 днівv = 0 and  i % 10 = 0 or v = 0 and  i % 10 = 5..9 or v = 0 and  i % 100 = 11..14
other0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, … 1,5 дня
ordinalfew3, 23, 33, 43, 53, 63, 73, 83, 103, 1003, … 3-я дивізія, 3-є колоn % 10 = 3 and   n % 100 != 13
other0~2, 4~16, 100, 1000, 10000, 100000, 1000000, … 2-а дивізія, 2-е коло
rangen/an/aNot available.
« Змінено: 2025-01-21 21:16:46 від Володимир Лісівка »
[Fedora Linux]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3849
  • Карма: +12/-0
  • Програміст
Re: Помилки в перекладах
« Відповідей #99 : 2025-01-21 21:12:46 »
Друкарські помилки:

запитажмо -> запитаємо
зареєстрованіу
поточе -> поточне
розсики -> листування

Виправив, дякую.
[Fedora Linux]

Відсутній yvs115

  • Дописувач
  • **
  • дописів: 90
  • Карма: +2/-0
Re: Помилки в перекладах
« Відповідей #100 : 2025-02-14 13:16:18 »
Автор звіту написав, що у найновішій версії все виправили. Гаразд, будемо чекати на оновлення. Дякую за консультацію.

не виправили, з Ubuntu шукають когонебудь щоб виправили
Preparing to move %'d file
Preparing to move %'d files

Current Ukrainian[0]: Підготовлення до переміщення #x27;d файлу
Current Ukrainian[1]: Підготовлення до переміщення #x27;d файлів
Current Ukrainian[2]: Підготовлення до переміщення #x27;d файлів

Відсутній yvs115

  • Дописувач
  • **
  • дописів: 90
  • Карма: +2/-0
Re: Помилки в перекладах
« Відповідей #101 : 2025-02-14 13:21:46 »
Певно питання з gtk форуму дійшло до убунту і там знайшли цю typo помилку
Цитата
... I was looking at https://discourse.gnome.org/t/nautilus-ukrainian-translation-is-broken-i-am-triaged-it-until-48-alpha-from-flatpak-and-it-is-working-there. Could a member of ... to fix the issue?
« Змінено: 2025-02-14 13:26:48 від yvs115 »