Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Devise uses the wrong locale for some flash messages #5247

Closed
collimarco opened this issue May 26, 2020 · 21 comments · Fixed by #5567
Closed

Devise uses the wrong locale for some flash messages #5247

collimarco opened this issue May 26, 2020 · 21 comments · Fixed by #5567

Comments

@collimarco
Copy link

collimarco commented May 26, 2020

Environment

  • Ruby 2.6
  • Rails 6.0
  • Devise 4.7

Current behavior

Currently I use this code as suggested by the Rails guide:

  # application_controller.rb

  around_action :switch_locale

  def switch_locale(&action)
    locale = params[:locale] || I18n.default_locale
    I18n.with_locale(locale, &action)
  end

This works perfectly for the application... but not for all Devise messages! Some are translated, others are not. Devise keeps using the default language for some messages (even if the translated YML files are present).

Possibly related:
#145
#5246

In order to reproduce the issue:

  1. try login with an invalid password
  2. you get an error message (flash) in the wrong language (i.e. Devise seems to use the default_locale set in the environment files, not the current one set in application controller)

If you log in successfully, instead, the flash message is in the correct language (the language set in application controller).

I have also tried to copy the official YML file from Devise and translate it, but I have the same issue: some translations appear, other do not.

Expected behavior

Devise should always use the current locale.

@alu0100921038
Copy link

cool, seems like im not the only one haha

@gingerlime
Copy link

I think it's a pretty common issue unfortunately. See #3052 (comment)

I think the best solution is to set the locale in a middleware rather than in the application controller, and also ensure that this middleware is loaded before warden, so it sets the locale before the warden middleware sets any flash messages. #4823 (comment)

@excid3
Copy link
Contributor

excid3 commented Jul 16, 2020

The Rails guides were updated to use around_action but it wasn't for threadsafety. There's discussion here about it: rails/rails#34356

It's safe to use:

before_action :set_locale

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end

@dssjoblom
Copy link

I'm having this same problem. First I tried before_action :set_locale which seemed to work for a while, but then stopped working, I'm unsure why. Changing it to prepend_before_action :set_locale works for the time being, but I'm uncertain whether this is the final or correct way to solve the problem. The middleware is in my case not an issue, as the Locale middleware is not used.

@dssjoblom
Copy link

dssjoblom commented Aug 26, 2020

Update: it seems as if prepend_before_action is the correct solution. The actions without prepend are in this order:

verify_signed_out_user
allow_params_authentication!
require_no_authentication
assert_is_devise_resource!
75720
set_xhr_redirected_to
set_request_method_cookie
verify_authenticity_token
staging_basic_auth
set_gon_controller
ensure_signup_complete
check_terms_agreement
clear_search_mode
configure_permitted_parameters
set_locale

, several of which are devise related, and will by default be executed before set_locale.

@carlosantoniodasilva
Copy link
Member

@dssjoblom that's right, you need to make sure set_locale is called before anything Devise related there, as it may set a flash message by that time. So prepend_before_action or around_action should generally be preferable.

That said, the issue originally described here with I18n.with_locale exists, I have a possible reproduction and fix in the works (it happens because I18n is set back to the default locale before leaving the controller, and Devise's failure app runs afterwards so it has no awareness of the I18n locale set by the controller.). For the time being, using I18n.locale = should work.

@sam-kim
Copy link

sam-kim commented Sep 29, 2020

@carlosantoniodasilva Do you have any suggestions other than using I18n.locale=? We would like to keep using I18n.with_locale to avoid any leak issues and may go the route of customizing the devise failure app but wanted to check to see if there was something in the works here.

@carlosantoniodasilva
Copy link
Member

@sam-kim I have a WIP/possible fix here: https://github.com/heartcombo/devise/compare/ca-fix-i18n-locale-failure-app, haven't been able to wrap it up yet, but if you'd like to give it a shot let me know how it goes. Other than that, no ideas off the top of my head.

@sam-kim
Copy link

sam-kim commented Sep 29, 2020

Looks like that worked perfectly! Thank you for that and the quick response 😃

@carlosantoniodasilva
Copy link
Member

Cool, thanks for confirming. I'll try to wrap that up and push to master soon.

@unosk
Copy link

unosk commented Oct 8, 2020

@carlosantoniodasilva I tried the above fix.
But I think there are two more things that need to be fixed.

keys = (auth_keys.respond_to?(:keys) ? auth_keys.keys : auth_keys).map { |key| scope_class.human_attribute_name(key) }

human_attribute_name(key, locale: warden_options[:locale])

throw :warden, scope: scope, message: record.inactive_message

throw :warden, scope: scope, message: record.inactive_message, locale: locale: I18n.locale

@carlosantoniodasilva
Copy link
Member

Thanks @unosk! Definitely agree on the first one, I was actually thinking about wrapping the failure app with I18n.with_locale, although that might be a bit more of a breaking change I guess for people using I18n, but perhaps better overall. (and maybe even more expected.)

I'll have to check on the second one, but at a glance seems reasonable. 👍

@carlosantoniodasilva
Copy link
Member

Cross posting 70828da#commitcomment-46435559 for my future reference:

Thank you! I'm using Rails 6.0 with Devise 4.7.3 and I introduced I18n as it is recommended in the Rails I18n guide, with around_action :switch_locale in ApplicationController. I also followed the advice from https://github.com/heartcombo/devise/wiki/How-To:--Redirect-with-locale-after-authentication-failure .

Excerpt from routes:
image

The i18n always works fine when a route is called directly, no matter whether a user is logged-in, not logged in, or visiting the login page. See this set of tests:
i18n.feature.txt

The only scenario that fails is "Locale persists after Devise redirects as Forbidden", so when a non-logged in user tries to access a page that is limited to logged-in users and Devise redirects to the login page.

After some tinkering today, namely inserting

locale = helpers.get_locale_from_path(session[:user_return_to])
I18n.locale = locale if locale

into SessionsController 'new' method, the login page displays in the correct language, too, but the flash message "You need to sign in or sign up before continuing." (line 21 of the test file) still shows in the wrong language. And on the whole this solution seems quite hacky - shouldn't Devise support i18n out of the box??

@pil0u
Copy link

pil0u commented May 25, 2021

I am working on a new Rails app, I just installed devise-i18n and generated :en and :fr views.

This is my application_controller.rb, taken from Rails i18n API guide, for which error messages seem to be sent with the default locale:

class ApplicationController < ActionController::Base
  around_action :switch_locale

  def switch_locale(&action)
    locale = params[:locale] || I18n.default_locale
    I18n.with_locale(locale, &action)
  end

  def default_url_options
    { locale: I18n.locale }
  end
end

This is the application_controller.rb that seems to solve the problem:

class ApplicationController < ActionController::Base
  before_action :switch_locale

  def switch_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end

  def default_url_options
    { locale: I18n.locale }
  end
end

I am very new to i18n, but my current feelings are:

  • having an error message in the wrong language (or any message at all) is really bad UX
  • not using with_locale could lead to leakage issues

What should I do? What is the Rails/Ruby/Devise/i18n way to handle this?

@carlosantoniodasilva
Copy link
Member

carlosantoniodasilva commented May 25, 2021

@pil0u using I18n.with_locale is definitely the ideal here for the long run, but I believe using I18n.locale = shouldn't be a problem if it's always set before requests. See this paragraph from the I18n Guide:

I18n.locale can leak into subsequent requests served by the same thread/process if it is not consistently set in every controller.

You could try my branch: https://github.com/heartcombo/devise/compare/ca-fix-i18n-locale-failure-app (which I haven't been able to wrap up, but just updated it on top of current master), and see if that works for you while still using I18n.with_locale as recommended. I'll try to work on it next, see if I can get all the tests in place to push a fix for this to master.

@grk
Copy link

grk commented Aug 27, 2021

@carlosantoniodasilva just ran into this exact issue and I think your branch has the correct approach to solving this. Did you make any further progress, or perhaps found a better solution?

@nov
Copy link

nov commented Sep 28, 2022

I also had the same issue, and resulted in new rack middleware which handles query param, cookie and HTTP_ACCEPT_LANGUAGE header in this order, then store explicitly requested locale in cookie.
https://github.com/nov/rack-locale_memorable

ps.
Rack::Locale wasn't enough for our use-case since it does handle only HTTP_ACCEPT_LANGUAGE header.

carlosantoniodasilva added a commit that referenced this issue Mar 3, 2023
A common usage of I18n with different locales is to create some around
callbcak in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
carlosantoniodasilva added a commit that referenced this issue Mar 7, 2023
A common usage of I18n with different locales is to create some around
callbcak in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
@carlosantoniodasilva
Copy link
Member

Hey all, I finally have a PR up with this change: #5567, if anyone wants to give it a shot, let me know if you run into any issues.

carlosantoniodasilva added a commit that referenced this issue Mar 17, 2023
A common usage of I18n with different locales is to create some around
callbcak in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
carlosantoniodasilva added a commit that referenced this issue Mar 30, 2023
A common usage of I18n with different locales is to create some around
callbcak in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
carlosantoniodasilva added a commit that referenced this issue Jun 27, 2023
A common usage of I18n with different locales is to create some around
callbcak in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
@FelixNumworks
Copy link

FelixNumworks commented Oct 4, 2023

The source of the problem, in my case, was located in the require_no_authentication method within app/controllers/devise_controller.rb.

This issue arises because require_no_authentication utilizes the prepend_before_action filter, while I am calling set_locale using the before_action filter, as demonstrated in this example.

I addressed the problem by calling set_locale directly within the require_no_authentication method:

if authenticated && resource = warden.user(resource_name)
  # Since 'require_no_authentication' uses 'prepend_before_action' while 'set_locale'
  # uses 'before_action', the flash message may display with the incorrect locale.
  # To fix this, ensure the locale is correctly set before displaying the flash message.
  set_locale
  set_flash_message! :alert, 'already_authenticated', scope: 'devise.failure' # This line was also tweaked a bit
  redirect_to after_sign_in_path_for(resource)
end

It may not be the cleanest way to fix this, but it has the advantage of making very few modifications to the original codebase.

EDIT: This is the exact same solution

carlosantoniodasilva added a commit that referenced this issue Oct 12, 2023
A common usage of I18n with different locales is to create some around
callbcak in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
@carlosantoniodasilva
Copy link
Member

@FelixNumworks not sure there's much we can do over there, but if you use an around_action instead of before_action I think it should work.

Alternatively, setting the locale yourself and calling super like it was suggested in the issue might be fine too. I don't know if there's much else Devise can do since setting the locale is app specific.

carlosantoniodasilva added a commit that referenced this issue Oct 12, 2023
A common usage of I18n with different locales is to create some around
callback in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
carlosantoniodasilva added a commit that referenced this issue Oct 12, 2023
A common usage of I18n with different locales is to create some around
callback in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
carlosantoniodasilva added a commit that referenced this issue Oct 13, 2023
A common usage of I18n with different locales is to create some around
callback in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
carlosantoniodasilva added a commit that referenced this issue Oct 13, 2023
A common usage of I18n with different locales is to create some around
callback in the application controller that sets the locale for the
entire action, via params/url/user/etc., which ensure the locale is
respected for the duration of that action, and resets at the end.

Devise was not respecting the locale when the authenticate failed and
triggered the failure app, because that happens in a warden middleware
right up in the change, by that time the controller around callback had
already reset the locale back to its default, and the failure app would
just translate flash messages using the default locale.

Now we are passing the current locale down to the failure app via warden
options, and wrapping it with an around callback, which makes the
failure app respect the set I18n locale by the controller at the time
the authentication failure is triggered, working as expected. (much more
like a normal controller would.)

I chose to introduce a callback in the failure app so we could wrap the
whole `respond` action processing rather than adding individual `locale`
options to the `I18n.t` calls, because that should ensure other possible
`I18n.t` calls from overridden failure apps would respect the set locale
as well, and makes it more like one would implement in a controller. I
don't recommend people using callbacks in their own failure apps though,
as this is not going to be documented as a "feature" of failures apps,
it's considered "internal" and could be refactored at any point.

It is possible to override the locale with the new `i18n_locale` method,
which simply defaults to the passed locale from the controller.

Closes #5247
Closes #5246

Related to: #3052, #4823, and possible others already closed.
Related to warden: (may be closed there afterwards)
wardencommunity/warden#180
wardencommunity/warden#170
@dph-jan
Copy link

dph-jan commented Aug 15, 2024

I've just upgraded from devise 4.7.3 to 4.9.4 and while this issue seems to be mostly resolved, I have noticed that the unconfirmed message still isn't localized for me. I've generated the new english locale file using rails g devise:install and am using a customized version of a German locale file from https://github.com/heartcombo/devise/wiki/I18n
I've also checked that the files are used by adjusting the strings in the file. When clicking on a link that requires sign-in while having set the locale to de (default is en), I correctly get the German unauthenticated error. Then, when trying to login with an unconfirmed email, I get the English unconfirmed error.

I'm on Ruby 2.7.8 / Rails 6.0

I'm using the around_action callback with I18n.with_locale(locale, &action) to set the locale in the application controller.

This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging a pull request may close this issue.