Lang.txt 2.6 KB

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