tr.d 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. Translation translation;
  48. switch(lang){
  49. case Language.uk:
  50. translation = tr_uk.translations[text_key];
  51. break;
  52. //case Language.en:
  53. // translation = tr_en.translations[text_key];
  54. // break;
  55. default :
  56. translation = tr_en.translations[text_key];
  57. }
  58. if( (plural_num > 0) && (args.length < translation.arg_count) ){
  59. args = [ to!string(plural_num) ] ~ args;
  60. }
  61. if(args.length != translation.arg_count){
  62. return translation.text[0];
  63. }
  64. if( (translation.text.length > 1) && (plural_num > 0) ){
  65. auto text = plural(plural_num, translation.text);
  66. return format_args(text, args);
  67. }else{
  68. return (args.empty) ? translation.text[0] : format_args(translation.text[0], args);
  69. }
  70. }