locale.rb 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Locale < ApplicationModel
  3. has_many :knowledge_base_locales, inverse_of: :system_locale, dependent: :restrict_with_error,
  4. class_name: 'KnowledgeBase::Locale', foreign_key: :system_locale_id
  5. =begin
  6. get locals to sync
  7. all:
  8. Locale.to_sync
  9. returns
  10. ['en-us', 'de-de', ...]
  11. =end
  12. def self.to_sync
  13. locales = Locale.where(active: true)
  14. if Rails.env.test?
  15. locales = Locale.where(active: true, locale: ['en-us', 'de-de'])
  16. end
  17. # read used locales based on env, e. g. export Z_LOCALES='en-us:de-de'
  18. if ENV['Z_LOCALES']
  19. locales = Locale.where(active: true, locale: ENV['Z_LOCALES'].split(':'))
  20. end
  21. locales
  22. end
  23. =begin
  24. sync locales from local if exists, otherwise from online
  25. all:
  26. Locale.sync
  27. =end
  28. def self.sync
  29. return true if load_from_file
  30. load
  31. end
  32. =begin
  33. load locales from online
  34. all:
  35. Locale.load
  36. =end
  37. def self.load
  38. data = fetch
  39. to_database(data)
  40. end
  41. =begin
  42. load locales from local
  43. all:
  44. Locale.load_from_file
  45. =end
  46. def self.load_from_file
  47. version = Version.get
  48. file = Rails.root.join('config', "locales-#{version}.yml")
  49. return false if !File.exist?(file)
  50. data = YAML.load_file(file)
  51. to_database(data)
  52. true
  53. end
  54. =begin
  55. fetch locales from remote and store them in local file system
  56. all:
  57. Locale.fetch
  58. =end
  59. def self.fetch
  60. version = Version.get
  61. url = 'https://i18n.zammad.com/api/v1/locales'
  62. result = UserAgent.get(
  63. url,
  64. {
  65. version: version,
  66. },
  67. {
  68. json: true,
  69. open_timeout: 8,
  70. read_timeout: 24,
  71. }
  72. )
  73. raise "Can't load locales from #{url}" if !result
  74. raise "Can't load locales from #{url}: #{result.error}" if !result.success?
  75. file = Rails.root.join('config', "locales-#{version}.yml")
  76. File.open(file, 'w') do |out|
  77. YAML.dump(result.data, out)
  78. end
  79. result.data
  80. end
  81. private_class_method def self.to_database(data)
  82. ActiveRecord::Base.transaction do
  83. data.each do |locale|
  84. exists = Locale.find_by(locale: locale['locale'])
  85. if exists
  86. exists.update!(locale.symbolize_keys!)
  87. else
  88. Locale.create!(locale.symbolize_keys!)
  89. end
  90. end
  91. end
  92. end
  93. end