diff --git a/Gemfile b/Gemfile index 4220429..f2dd7f1 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,6 @@ gem "cyberarm_engine" gem "sdl2-bindings" gem "libui", platforms: [:windows] gem "digest-crc" -gem "i18n" gem "ircparser" gem "rexml" gem "rubyzip" @@ -19,9 +18,9 @@ gem "win32-security", platforms: [:windows] # use `bundle _x.y.z_ COMMAND` to use this one... # NOTE: Releasy needs to be installed as a system gem i.e. `rake install` # NOTE: contents of the `gemhome` folder in the packaged folder need to be moved into the lib/ruby/gems\ folder -# group :windows_packaging do -# gem "bundler", "~>2.4.3" -# gem "rake" -# gem "ocran" -# gem "releasy"#, path: "../releasy" -# end \ No newline at end of file + group :windows_packaging do + gem "bundler", "~>2.4.3" + gem "rake" + gem "ocran" + gem "releasy"#, path: "../releasy" + end diff --git a/Gemfile.lock b/Gemfile.lock index 082e651..c29b13a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,17 +3,17 @@ GEM specs: base64 (0.3.0) concurrent-ruby (1.3.5) + cri (2.15.12) cyberarm_engine (0.24.5) gosu (~> 1.1) digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) event_emitter (0.2.6) - excon (1.3.0) + excon (1.3.2) logger - ffi (1.17.2-x64-mingw-ucrt) - ffi (1.17.2-x86_64-linux-gnu) - ffi-win32-extensions (1.0.4) - ffi + ffi (1.17.0) + ffi-win32-extensions (1.1.0) + ffi (>= 1.15.5, <= 1.17.0) fiddle (1.1.8) gosu (1.4.6) i18n (1.14.7) @@ -23,9 +23,16 @@ GEM fiddle logger (1.7.0) mutex_m (0.3.0) - rake (13.3.0) + ocran (1.3.17) + fiddle (~> 1.0) + rake (13.3.1) + releasy (0.2.4) + bundler (>= 1.2.1) + cri (~> 2.15.0) + ocran (~> 1.3.0) + rake (>= 0.9.2.2) rexml (3.4.4) - rubyzip (3.1.1) + rubyzip (3.2.2) sdl2-bindings (0.2.3) ffi (~> 1.15) websocket (1.2.11) @@ -42,16 +49,19 @@ GEM PLATFORMS x64-mingw-ucrt - x86_64-linux DEPENDENCIES base64 + bundler (~> 2.4.3) cyberarm_engine digest-crc excon i18n ircparser libui + ocran + rake + releasy rexml rubyzip sdl2-bindings @@ -60,4 +70,4 @@ DEPENDENCIES win32-security BUNDLED WITH - 2.6.8 + 2.4.22 diff --git a/lib/i18n.rb b/lib/i18n.rb new file mode 100644 index 0000000..9912dbb --- /dev/null +++ b/lib/i18n.rb @@ -0,0 +1,102 @@ +# The I18n gem is a real pain to work with when packaging with Ocra(n) +# and we're not using its 'advanced' features so emulate its API here. + +require "yaml" + +class I18n + class InvalidLocale < StandardError + end + + @locale = :en + @default_locale = :en + @load_path = [] + + @translations = {} + + def self.load_path + @load_path + end + + def self.default_locale + @default_locale.to_sym + end + + def self.default_locale=(locale) + @default_locale = locale.to_s + end + + def self.locale + @locale.to_sym + end + + def self.locale=(locale) + locale = locale.to_s + + raise InvalidLocale unless valid_locale?(locale) + + @locale = locale + end + + def self.t(symbol) + return symbol.to_s unless valid_locale?(@locale) + + @translations[@locale] || load_locale(@locale) + + translations = @translations[@locale] + return translations[symbol] if translations + + translation = @translations.dig(@default_locale, symbol) + return translation if translation + + return symbol.to_s + end + + def self.available_locales + @load_path.flatten.map { |f| File.basename(f, ".yml").to_s.downcase.to_sym } + end + + private + def self.load_locale(locale) + locale = locale.to_s + + return if @translations[locale] && !@translations[locale].empty? + + if (file = valid_locale?(locale)) + yaml = YAML.load_file(file) + + raise InvalidLocale unless yaml[locale] + + key = "" + hash = yaml[locale] + hash.each_pair do |key, v| + if v.is_a?(String) + @translations[locale] ||= {} + @translations[locale][key.to_sym] = v + else + load_locale_part(locale, key, v) + end + end + end + end + + def self.load_locale_part(locale, key, part) + locale = locale.to_s + + part.each_pair do |k, v| + if v.is_a?(String) + @translations[locale] ||= {} + @translations[locale]["#{key}.#{k}".to_sym] = v + else + load_locale_part(locale, "#{key}.#{k}", v) + end + end + end + + def self.valid_locale?(locale) + locale = locale.to_s + + @load_path.flatten.find do |file| + File.basename(file, ".yml").to_s.downcase.strip == locale + end + end +end diff --git a/lib/pages/settings.rb b/lib/pages/settings.rb index 04c232a..2a6e091 100644 --- a/lib/pages/settings.rb +++ b/lib/pages/settings.rb @@ -51,10 +51,16 @@ class W3DHub end end - stack(width: 128, max_height: 256, h_align: :center, margin_top: 16, fill: true) do + flow(width: 256, height: 64, h_align: :center, margin_top: 16) do button "Save", width: 1.0 do save_settings! end + + flow(fill: true) + + end + button("Clear package cache: #{W3DHub.format_size(Dir.glob("#{Store.settings[:package_cache_dir]}/**/**").map { |f| File.file?(f) ? File.size(f) : 0}.sum)}", **DANGEROUS_BUTTON) do + # TODO. end end end diff --git a/w3d_hub_linux_launcher.rb b/w3d_hub_linux_launcher.rb index 695f0fb..3c8a883 100644 --- a/w3d_hub_linux_launcher.rb +++ b/w3d_hub_linux_launcher.rb @@ -84,11 +84,11 @@ class W3DHub BLACK_IMAGE = Gosu::Image.from_blob(1, 1, "\x00\x00\x00\xff") end -require "i18n" require "websocket-client-simple" require "English" require "sdl2" +require_relative "lib/i18n" I18n.load_path << Dir["#{W3DHub::GAME_ROOT_PATH}/locales/*.yml"] I18n.default_locale = :en