diff --git a/Vendorfile b/Vendorfile index 0fe6e09b4..c29739ee6 100644 --- a/Vendorfile +++ b/Vendorfile @@ -41,4 +41,12 @@ folder 'vendor/assets' do file 'iD.js', 'dist/iD.js' end end + + folder 'jquery.uls' do + from 'https://github.com/wikimedia/jquery.uls.git' do + folder 'css' + folder 'src' + folder 'images' + end + end end diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 4991e82fb..cb9c8b0cf 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -14,6 +14,7 @@ //= require make-plural/cardinals //= require matomo //= require richtext +//= require uls { const application_data = $("head").data(); diff --git a/app/assets/javascripts/osm.js.erb b/app/assets/javascripts/osm.js.erb index a40ae6eb8..8fd8adc3d 100644 --- a/app/assets/javascripts/osm.js.erb +++ b/app/assets/javascripts/osm.js.erb @@ -28,6 +28,7 @@ OSM = { %>, DEFAULT_LOCALE: <%= I18n.default_locale.to_json %>, + AVAILABLE_LOCALES: <%= I18n.available_locales.map(&:to_s).to_json %>, LAYER_DEFINITIONS: <%= YAML.load_file(Rails.root.join("config/layers.yml")).to_json %>, LAYERS_WITH_MAP_KEY: <%= YAML.load_file(Rails.root.join("config/key.yml")).keys.to_json %>, diff --git a/app/assets/javascripts/uls.js b/app/assets/javascripts/uls.js new file mode 100644 index 000000000..71bcff565 --- /dev/null +++ b/app/assets/javascripts/uls.js @@ -0,0 +1,30 @@ +//= require src/jquery.uls.data +//= require src/jquery.uls.data.utils +//= require src/jquery.uls.lcd +//= require src/jquery.uls.languagefilter +//= require src/jquery.uls.core + +$(document).ready(function () { + function updateLanguage(language) { + Cookies.set("_osm_locale", language, { secure: true, path: "/", samesite: "lax" }); + + document.location.reload(); + } + + const languages = $.uls.data.getAutonyms(); + + for (const code in languages) { + if (!OSM.AVAILABLE_LOCALES.includes(code)) { + delete languages[code]; + } + } + + $(".uls-trigger").uls({ + onSelect: updateLanguage, + languages: languages + }); + + const application_data = $("head").data(); + + $(".uls-trigger").text(Cookies.get("_osm_locale") || application_data.locale); +}); diff --git a/app/assets/stylesheets/uls.scss b/app/assets/stylesheets/uls.scss new file mode 100644 index 000000000..54e49036e --- /dev/null +++ b/app/assets/stylesheets/uls.scss @@ -0,0 +1,42 @@ +/* + *= require css/jquery.uls + *= require css/jquery.uls.grid + *= require css/jquery.uls.lcd + */ + +.uls-menu { + z-index: 100000; + + h1 { + margin: 16px 0px; + } + + .row { + display: block; + + * { + width: auto; + max-width: none; + } + + li { + width: max-content; + } + } +} + +.uls-trigger { + cursor: pointer; + background-image: image-url('images/language.png'); + background-image: linear-gradient(transparent, transparent), image-url('images/language.svg'); +} + +.uls-icon-close { + background-image: image-url('images/close.png'); + background-image: linear-gradient(transparent, transparent), image-url('images/close.svg'); +} + +.uls-menu .uls-search-label { + background-image: image-rl('images/search.png'); + background-image: linear-gradient(transparent, transparent), image-url('images/search.svg'); +} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 25de71f20..e9d13aa74 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -192,6 +192,8 @@ class ApplicationController < ActionController::Base def preferred_languages @preferred_languages ||= if params[:locale] Locale.list(params[:locale]) + elsif request.cookies["_osm_locale"] + Locale.list(request.cookies["_osm_locale"]) elsif current_user current_user.preferred_languages else diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c6e2298ab..427147121 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -205,7 +205,11 @@ class UsersController < ApplicationController current_user.data_public = true current_user.description = "" if current_user.description.nil? current_user.creation_address = request.remote_ip - current_user.languages = http_accept_language.user_preferred_languages + current_user.languages = if request.cookies["_osm_locale"] + Locale.list(request.cookies["_osm_locale"]) + else + http_accept_language.user_preferred_languages + end current_user.terms_agreed = Time.now.utc current_user.tou_agreed = Time.now.utc current_user.terms_seen = true diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 69e323a99..7e7651b49 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -37,6 +37,7 @@ <% end -%> <% end %> +