2
0

Lang.txt 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. MODULE HostLang;
  2. (* THIS IS TEXT COPY OF Lang.odc *)
  3. (* DO NOT EDIT *)
  4. (*
  5. A. V. Shiryaev, 2012.10
  6. LANG environment variable support
  7. Dialog.LanguageHook implementation
  8. *)
  9. IMPORT Dialog, Libc := LinLibc, Codecs := EncCodecs;
  10. CONST
  11. defLang = "";
  12. defCountry = "";
  13. defEnc = "ASCII";
  14. TYPE
  15. LanguageHook = POINTER TO RECORD (Dialog.LanguageHook) END;
  16. VAR
  17. lang-: Dialog.Language;
  18. enc-: Codecs.Encoding;
  19. PROCEDURE ParseLang (OUT lang, country, enc: ARRAY OF CHAR);
  20. VAR env: Libc.PtrSTR;
  21. i, j: INTEGER;
  22. PROCEDURE Default;
  23. BEGIN
  24. lang := defLang;
  25. country := defCountry;
  26. enc := defEnc
  27. END Default;
  28. PROCEDURE IsValidEncChar (x: SHORTCHAR): BOOLEAN;
  29. BEGIN
  30. RETURN ((x >= 'A') & (x <= 'Z')) OR ((x >= '0') & (x <= '9')) OR (x = '-') OR (x = '_')
  31. OR ((x >= 'a') & (x <= 'z'))
  32. END IsValidEncChar;
  33. BEGIN
  34. env := Libc.getenv("LANG");
  35. IF env # NIL THEN
  36. IF env$ = "C" THEN
  37. lang := ""; country := ""; enc := "ASCII"
  38. ELSE
  39. i := 0;
  40. WHILE (i < 2) & (env[i] >= 'a') & (env[i] <= 'z') & (i < LEN(lang) - 1) DO
  41. lang[i] := env[i];
  42. INC(i)
  43. END;
  44. IF (i = 2) & (env[i] = '_') & (i < LEN(lang)) THEN
  45. lang[i] := 0X;
  46. INC(i);
  47. j := 0;
  48. WHILE (i < 5) & (env[i] >= 'A') & (env[i] <= 'Z') & (j < LEN(country) - 1) DO
  49. country[j] := env[i];
  50. INC(j); INC(i)
  51. END;
  52. IF (i = 5) & (env[i] = '.') & (j < LEN(country)) THEN
  53. country[j] := 0X;
  54. INC(i);
  55. j := 0;
  56. WHILE IsValidEncChar(env[i]) & (j < LEN(enc) - 1) DO
  57. enc[j] := env[i];
  58. INC(j); INC(i)
  59. END;
  60. IF (env[i] = 0X) & (j < LEN(enc)) THEN
  61. enc[j] := 0X
  62. ELSE Default
  63. END
  64. ELSE Default
  65. END
  66. ELSE Default
  67. END
  68. END
  69. ELSE Default
  70. END
  71. END ParseLang;
  72. PROCEDURE (hook: LanguageHook) SetLanguage (
  73. lang: Dialog.Language; persistent: BOOLEAN; OUT ok: BOOLEAN
  74. );
  75. BEGIN
  76. ok := (lang = "") OR (LEN(lang$) = 2);
  77. (*
  78. IF ok & persistent THEN HostRegistry.WriteString("language", lang) END
  79. *)
  80. END SetLanguage;
  81. PROCEDURE (hook: LanguageHook) GetPersistentLanguage (OUT l: Dialog.Language);
  82. VAR res: INTEGER; s: ARRAY 32 OF CHAR;
  83. BEGIN
  84. (*
  85. HostRegistry.ReadString("language", s, res);
  86. IF res = 0 THEN
  87. ASSERT((s = "") OR (LEN(s$) = 2), 100);
  88. lang := s$
  89. ELSE lang := ""
  90. END
  91. *)
  92. l := lang
  93. END GetPersistentLanguage;
  94. PROCEDURE Init;
  95. VAR
  96. languageHook: LanguageHook;
  97. country: ARRAY 3 OF CHAR;
  98. BEGIN
  99. ParseLang(lang, country, enc);
  100. NEW(languageHook); Dialog.SetLanguageHook(languageHook); Dialog.ResetLanguage
  101. END Init;
  102. BEGIN
  103. Init
  104. END HostLang.