tr.d 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import tr_en;
  2. import tr_uk;
  3. import std.array : empty;
  4. import std.conv : to;
  5. import std.format;
  6. enum TKey{
  7. hello,
  8. welcome,
  9. apples,
  10. apples_n_oranges,
  11. }
  12. struct Translation{
  13. string[] text;
  14. int arg_count;
  15. }
  16. enum Language{
  17. en,
  18. uk
  19. }
  20. string plural(int count, string[] txt){
  21. int n1 = count % 100; // get rem
  22. if(n1 > 4 && n1 < 20){
  23. return txt[2];
  24. }else{
  25. switch(count % 10){ // get rem
  26. case 0: return txt[2];
  27. case 1: return txt[0];
  28. case 2, 3, 4: return txt[1];
  29. default: return txt[2];
  30. }
  31. }
  32. }
  33. // plural(1, ["яблуко", "яблука", "яблук"]) => "яблуко"
  34. // plural(2, ["яблуко", "яблука", "яблук"]) => "яблука"
  35. // plural(5, ["яблуко", "яблука", "яблук"]) => "яблук"
  36. string format_args(string txt, string[] args){
  37. switch (args.length){
  38. case 0: return txt;
  39. case 1: return format(txt, args[0]);
  40. case 2: return format(txt, args[0], args[1]);
  41. case 3: return format(txt, args[0], args[1], args[2]);
  42. case 4: return format(txt, args[0], args[1], args[2], args[3]);
  43. default: return txt;
  44. }
  45. }
  46. string Tr(Language lang, TKey text_key, string[] args = [], int plural_num = 0){
  47. auto key = cast(int)text_key;
  48. Translation translation;
  49. switch(lang){
  50. case Language.uk:
  51. translation = tr_uk.translations[key];
  52. break;
  53. //case Language.en:
  54. // translation = tr_en.translations[key];
  55. // break;
  56. default :
  57. translation = tr_en.translations[key];
  58. }
  59. if( (plural_num > 0) && (args.length < translation.arg_count) ){
  60. args = [ to!string(plural_num) ] ~ args;
  61. }
  62. if(args.length != translation.arg_count){
  63. return translation.text[0];
  64. }
  65. if( (translation.text.length > 1) && (plural_num > 0) ){
  66. auto text = plural(plural_num, translation.text);
  67. return format_args(text, args);
  68. }else{
  69. return (args.empty) ? translation.text[0] : format_args(translation.text[0], args);
  70. }
  71. }