123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
- class Locale < ApplicationModel
- has_many :knowledge_base_locales, inverse_of: :system_locale, dependent: :restrict_with_error,
- class_name: 'KnowledgeBase::Locale', foreign_key: :system_locale_id
- =begin
- returns the records of all locales that are to be synchronized
- =end
- def self.to_sync
- # read used locales based on env, e. g. export Z_LOCALES='en-us:de-de'
- return Locale.where(active: true, locale: ENV['Z_LOCALES'].split(':')) if ENV['Z_LOCALES']
- return Locale.where(active: true, locale: %w[en-us de-de]) if Rails.env.test?
- Locale.where(active: true)
- end
- =begin
- sync locales from config/locales.yml
- =end
- def self.sync
- file = Rails.root.join('config/locales.yml')
- return false if !File.exist?(file)
- data = YAML.load_file(file)
- to_database(data)
- true
- end
- # Default system locale
- #
- # @example
- # Locale.default
- def self.default
- Setting.get('locale_default') || 'en-us'
- end
- private_class_method def self.to_database(data)
- ActiveRecord::Base.transaction do
- data.each do |locale|
- exists = Locale.find_by(locale: locale['locale'])
- if exists
- exists.update!(locale.symbolize_keys!)
- else
- Locale.create!(locale.symbolize_keys!)
- end
- end
- end
- end
- # Returns ICU language code for usage with TwitterCldr gem
- # Not all locales are supported, so nil can be returned as well!
- #
- # One-liner to filter which locales are not supported by said gem:
- #
- # Locale.all.select { |locale| !TwitterCldr.supported_locale? locale.language_code }
- def cldr_language_code
- case locale
- when 'es-ca' # Catalin, looks like it should be ca-es instead?
- 'ca'
- when 'sr-cyrl-rs'
- 'sr-Cyrl-ME'
- when 'sr-latn-rs'
- 'sr-Latn-ME'
- else
- split = locale.split('-')
- split.second&.upcase!
- joined = split.join('-')
- if TwitterCldr.supported_locale? joined
- joined
- elsif TwitterCldr.supported_locale? split.first
- split.first
- end
- end
- end
- # Returns Postgres database collation names
- #
- # One-liner to verify that locales exist on a given Postgres server:
- #
- # Locale.all.select { |locale| ApplicationModel.connection.execute("SELECT * FROM pg_collation WHERE collname = '#{locale.postgres_collation_name}';").none? }
- def postgres_collation_name
- case locale
- when 'es-ca' # Catalan, looks like it should be ca-es instead?
- 'ca-x-icu'
- when 'no-no' # Norwegian, nn vs no?
- 'nn-NO-x-icu'
- when 'zh-cn' # China uses simplified
- 'zh-Hans-x-icu'
- when 'zh-tw' # Taiwan uses traditional
- 'zh-Hant-x-icu'
- when 'sr-cyrl-rs'
- 'sr-Cyrl-ME-x-icu'
- when 'sr-latn-rs'
- 'sr-Latn-ME-x-icu'
- else
- split = locale.split('-')
- split.second&.upcase!
- "#{split.join('-')}-x-icu"
- end
- end
- end
|