kargnas / laravel-ai-translator

Automatic translate your language files into many languages using AI like Claude, GPT and etc.
MIT License
89 stars 11 forks source link

Even more advanced pluralization #3

Closed kargnas closed 4 months ago

kargnas commented 4 months ago

English (original)

    'person_count_cap' => '1 Person|:count People',
    'person_count' => '1 person|:count people',
    'ball_count' => ':count ball|:count balls',

    // Basic singular and plural
    'book_simple' => 'There is one book|There are :count books',
    'book_complex' => '{0} There are no books|{1} There is one book|{2} There are two books|[3,10] There are :count books|[11,*] There are :count books',
    'book_distribution' => 'I have one book, Ahmed has two books, and the library has :count books',

    'years_passed' => '1 year passed|:count years passed', // an irregular noun in polish (rok->lata).
    'notifications_with_zero_value' => '{0} You don\'t have any notifications yet|[1,*]You have :count notifications', // not recommended way to define ranges (not applicable for some languages where based on the last digit)
    'notifications_without_zero' => 'You have :count notification|You have :count notifications', // recommended
    'notifications_empty' => 'You don\'t have any notifications yet', // a separated message when there are no notifications
    'person' => 'Person|People', // checking preserving letter capitalization
    'ball' => 'ball|balls', // a standard noun
    'trousers' => 'I have :count pants', // irregular (no singular) in EN and in PL as well
    'students' => 'student|students', // this is an exception - in PL there is only one plural version

Translated: Polish

  'person_count_cap' => '1 Osoba|:count Osoby|:count Osób',
  'person_count' => '1 osoba|:count osoby|:count osób',
  'ball_count' => ':count piłka|:count piłki|:count piłek',
  'book_simple' => 'Jest jedna książka|Są :count książki|Jest :count książek',
  'book_complex' => '{0} Nie ma książek|{1} Jest jedna książka|{2} Są dwie książki|[3,10] Są :count książki|[11,*] Jest :count książek',
  'book_distribution' => 'Ja mam jedną książkę, Ahmed ma dwie książki, a biblioteka ma :count książek',
  'years_passed' => 'Minął 1 rok|Minęły :count lata|Minęło :count lat',
  'notifications_with_zero_value' => '{0} Nie masz jeszcze żadnych powiadomień|[1,*]Masz :count powiadomienie|Masz :count powiadomienia|Masz :count powiadomień',
  'notifications_without_zero' => 'Masz :count powiadomienie|Masz :count powiadomienia|Masz :count powiadomień',
  'notifications_empty' => 'Nie masz jeszcze żadnych powiadomień',
  'person' => 'Osoba|Osoby|Osób',
  'ball' => 'piłka|piłki|piłek',
  'trousers' => 'Mam :count spodnie|Mam :count pary spodni|Mam :count par spodni',
  'students' => 'student|studenci|studentów',

Translated: Chinese


  'person_count_cap' => '{1} 一位人|[2,*] :count位人',
  'person_count' => '{1} 一位人|[2,*] :count位人',
  'ball_count' => '{1} 一个球|[2,*] :count个球',
  'book_simple' => '{1} 有一本书|[2,*] 有:count本书',
  'book_complex' => '{0} 没有书|{1} 有一本书|{2} 有两本书|[3,10] 有:count本书|[11,*] 有:count本书',
  'book_distribution' => '我有一本书,艾哈迈德有两本书,图书馆有:count本书',
  'years_passed' => '{1} 一年过去了|[2,*] :count年过去了',
  'notifications_with_zero_value' => '{0} 你还没有任何通知|[1,*] 你有:count条通知',
  'notifications_without_zero' => '{1} 你有一条通知|[2,*] 你有:count条通知',
  'notifications_empty' => '你还没有任何通知',
  'person' => '{1} 一个人|[2,*] :count个人',
  'ball' => '{1} 一个球|[2,*] :count个球',
  'trousers' => '{1} 我有一条裤子|[2,*] 我有:count条裤子',
  'students' => '{1} 一名学生|[2,*] :count名学生',

Translated: Korean

  'person_count_cap' => '{1} 한 명|[2,*] :count명',
  'person_count' => '{1} 한 명|[2,*] :count명',
  'ball_count' => '{1} 공 한 개|[2,*] 공 :count개',
  'book_simple' => '{1} 책이 한 권 있어요|[2,*] 책이 :count권 있어요',
  'book_complex' => '{0} 책이 없어요|{1} 책이 한 권 있어요|{2} 책이 두 권 있어요|[3,10] 책이 :count권 있어요|[11,*] 책이 :count권 있어요',
  'book_distribution' => '저는 책이 한 권 있고, 아흐메드는 두 권 있고, 도서관에는 :count권 있어요',
  'years_passed' => '{1} 1년이 지났어요|[2,*] :count년이 지났어요',
  'notifications_with_zero_value' => '{0} 아직 알림이 없어요|[1,*] :count개의 알림이 있어요',
  'notifications_without_zero' => '{1} :count개의 알림이 있어요|[2,*] :count개의 알림이 있어요',
  'notifications_empty' => '아직 알림이 없어요',
  'person' => '{1} 사람|[2,*] 사람들',
  'ball' => '{1} 공|[2,*] 공',
  'trousers' => '{1} 저는 바지 한 벌 있어요|[2,*] 저는 바지 :count벌 있어요',
  'students' => '{1} 학생|[2,*] 학생들',

Translated: Arabic

  'person_count_cap' => 'شخص واحد|شخصان|بضعة أشخاص|عدة أشخاص|العديد من الأشخاص|:count شخص',
  'person_count' => 'شخص واحد|شخصان|بضعة أشخاص|عدة أشخاص|العديد من الأشخاص|:count شخص',
  'ball_count' => 'كرة واحدة|كرتان|بضع كرات|عدة كرات|العديد من الكرات|:count كرة',
  'book_simple' => 'هناك كتاب واحد|هناك كتابان|هناك بضعة كتب|هناك عدة كتب|هناك العديد من الكتب|هناك :count كتاب',
  'book_complex' => 'لا توجد كتب|هناك كتاب واحد|هناك كتابان|هناك بضعة كتب|هناك عدة كتب|هناك العديد من الكتب|هناك :count كتاب',
  'book_distribution' => 'لدي كتاب واحد، ولدى أحمد كتابان، ولدى المكتبة كتاب واحد|لدي كتاب واحد، ولدى أحمد كتابان، ولدى المكتبة كتابان|لدي كتاب واحد، ولدى أحمد كتابان، ولدى المكتبة بضعة كتب|لدي كتاب واحد، ولدى أحمد كتابان، ولدى المكتبة عدة كتب|لدي كتاب واحد، ولدى أحمد كتابان، ولدى المكتبة العديد من الكتب|لدي كتاب واحد، ولدى أحمد كتابان، ولدى المكتبة :count كتاب',
  'years_passed' => 'مرت سنة واحدة|مرت سنتان|مرت بضع سنوات|مرت عدة سنوات|مرت العديد من السنوات|مرت :count سنة',
  'notifications_with_zero_value' => 'ليس لديك أي إشعارات حتى الآن|لديك إشعار واحد|لديك إشعاران|لديك بضعة إشعارات|لديك عدة إشعارات|لديك العديد من الإشعارات|لديك :count إشعار',
  'notifications_without_zero' => 'لديك إشعار واحد|لديك إشعاران|لديك بضعة إشعارات|لديك عدة إشعارات|لديك العديد من الإشعارات|لديك :count إشعار',
  'notifications_empty' => 'ليس لديك أي إشعارات حتى الآن',
  'person' => 'شخص|أشخاص|شخصان|بضعة أشخاص|العديد من الأشخاص|أشخاص',
  'ball' => 'كرة|كرات|كرتان|بضع كرات|العديد من الكرات|كرات',
  'trousers' => 'لدي :count بنطال|لدي :count بنطال|لدي :count بنطالان|لدي :count بناطيل|لدي :count بنطالات|لدي :count بنطال',
  'students' => 'طالب|طلاب|طالبان|بضعة طلاب|العديد من الطلاب|طلاب',
mgralikowski commented 4 months ago

Close to being ideal.

'notifications_with_zero_value' => '{0} Nie masz jeszcze żadnych powiadomień|[1,*]Masz :count powiadomienie|Masz :count powiadomienia|Masz :count powiadomień' this is technically invalid because the range [1,*] covers all possibilites, so those extra translations are completly rudundant. This is why I am going to avoid such complex structures.

'students' => 'student|studenci|studentów' the second translation studenci is invalid, because both plural variations are studentów e.g. 2 studentów, 10 studentów (it is an exception). The most expected result would be student|studentów but student|studentów|studentów would also be acceptable.

kargnas commented 4 months ago

@mgralikowski

'students' => 'student|studenci|studentów' the second translation studenci is invalid, because both plural variations are studentów e.g. 2 studentów, 10 studentów (it is an exception). The most expected result would be student|studentów but student|studentów|studentów would also be acceptable.

I think this part is hard to resolve for me cause I don't know how the exception works in Polish. I'm going to merge this, and please contribute and make a pull-request for the exception if you don't mind! You can specify some rules at $additionalRules on TranslateStrings.php.

mgralikowski commented 4 months ago

I don't know how the exception works in Polish.

No one knows by definition :)

Definitely, sth went wrong with a new prompt: 'years_passed' => 'Minął :count rok|Minęło :count {:count||lata, few,many} lat|Minęło :count {:count||lat, few,many} lat', 'trousers' => 'Mam {:count||spodnie, few,many} spodni',

edit: never mind, I didn't notice that I was using a Chatgpt, when I switched to the claude-3-5-sonnet-20240620 engine the result is almost perfect now.