提交 a1c9a8aa 编写于 作者: B Bob Van Landuyt

Merge branch 'i18n-Two_Factor_Authentication-of-user-profile' into 'master'

Externalize strings of Two-Factor Authentication page in user profile

See merge request gitlab-org/gitlab-ce!28749
...@@ -17,7 +17,7 @@ class Profiles::AccountsController < Profiles::ApplicationController ...@@ -17,7 +17,7 @@ class Profiles::AccountsController < Profiles::ApplicationController
if unlink_provider_allowed?(provider) if unlink_provider_allowed?(provider)
identity.destroy identity.destroy
else else
flash[:alert] = "You are not allowed to unlink your primary login account" flash[:alert] = _("You are not allowed to unlink your primary login account")
end end
redirect_to profile_account_path redirect_to profile_account_path
......
...@@ -18,7 +18,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController ...@@ -18,7 +18,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
two_factor_authentication_reason( two_factor_authentication_reason(
global: lambda do global: lambda do
flash.now[:alert] = flash.now[:alert] =
s_('The global settings require you to enable Two-Factor Authentication for your account.') _('The global settings require you to enable Two-Factor Authentication for your account.')
end, end,
group: lambda do |groups| group: lambda do |groups|
flash.now[:alert] = groups_notification(groups) flash.now[:alert] = groups_notification(groups)
...@@ -27,7 +27,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController ...@@ -27,7 +27,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
unless two_factor_grace_period_expired? unless two_factor_grace_period_expired?
grace_period_deadline = current_user.otp_grace_period_started_at + two_factor_grace_period.hours grace_period_deadline = current_user.otp_grace_period_started_at + two_factor_grace_period.hours
flash.now[:alert] = flash.now[:alert] + s_(" You need to do this before %{grace_period_deadline}.") % { grace_period_deadline: l(grace_period_deadline) } flash.now[:alert] = flash.now[:alert] + _(" You need to do this before %{grace_period_deadline}.") % { grace_period_deadline: l(grace_period_deadline) }
end end
end end
...@@ -44,7 +44,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController ...@@ -44,7 +44,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
render 'create' render 'create'
else else
@error = s_('Invalid pin code') @error = _('Invalid pin code')
@qr_code = build_qr_code @qr_code = build_qr_code
setup_u2f_registration setup_u2f_registration
render 'show' render 'show'
......
%p.slead %p.slead
Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one - lose_2fa_message = _('Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %{b_start}will%{b_end} lose access to your account.') % { b_start:'<b>', b_end:'</b>' }
time each to regain access to your account. Please save them in a safe place, or you = lose_2fa_message.html_safe
%b will
lose access to your account.
.codes.card .codes.card
%ul %ul
...@@ -11,5 +9,5 @@ ...@@ -11,5 +9,5 @@
%span.monospace= code %span.monospace= code
.d-flex .d-flex
= link_to 'Proceed', profile_account_path, class: 'btn btn-success append-right-10' = link_to _('Proceed'), profile_account_path, class: 'btn btn-success append-right-10'
= link_to 'Download codes', "data:text/plain;charset=utf-8,#{CGI.escape(@codes.join("\n"))}", download: "gitlab-recovery-codes.txt", class: 'btn btn-default' = link_to _('Download codes'), "data:text/plain;charset=utf-8,#{CGI.escape(@codes.join("\n"))}", download: "gitlab-recovery-codes.txt", class: 'btn btn-default'
- page_title 'Recovery Codes', 'Two-factor Authentication' - page_title _('Recovery Codes'), _('Two-factor Authentication')
%h3.page-title Two-factor Authentication Recovery codes %h3.page-title
= _('Two-factor Authentication Recovery codes')
%hr %hr
= render 'codes' = render 'codes'
- page_title 'Two-factor Authentication', 'Account' - page_title _('Two-factor Authentication'), _('Account')
.alert.alert-success .alert.alert-success
Congratulations! You have enabled Two-factor Authentication! = _('Congratulations! You have enabled Two-factor Authentication!')
= render 'codes' = render 'codes'
- page_title 'Two-Factor Authentication', 'Account' - page_title _('Two-Factor Authentication'), _('Account')
- add_to_breadcrumbs("Two-Factor Authentication", profile_account_path) - add_to_breadcrumbs(_('Two-Factor Authentication'), profile_account_path)
- @content_class = "limit-container-width" unless fluid_layout - @content_class = "limit-container-width" unless fluid_layout
.js-two-factor-auth{ 'data-two-factor-skippable' => "#{two_factor_skippable?}", 'data-two_factor_skip_url' => skip_profile_two_factor_auth_path } .js-two-factor-auth{ 'data-two-factor-skippable' => "#{two_factor_skippable?}", 'data-two_factor_skip_url' => skip_profile_two_factor_auth_path }
.row.prepend-top-default .row.prepend-top-default
.col-lg-4 .col-lg-4
%h4.prepend-top-0 %h4.prepend-top-0
Register Two-Factor Authenticator = _('Register Two-Factor Authenticator')
%p %p
Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA). = _('Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA).')
.col-lg-8 .col-lg-8
- if current_user.two_factor_otp_enabled? - if current_user.two_factor_otp_enabled?
%p %p
You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication. = _("You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication.")
%p %p
If you lose your recovery codes you can generate new ones, invalidating all previous codes. = _('If you lose your recovery codes you can generate new ones, invalidating all previous codes.')
%div %div
= link_to 'Disable two-factor authentication', profile_two_factor_auth_path, = link_to _('Disable two-factor authentication'), profile_two_factor_auth_path,
method: :delete, method: :delete,
data: { confirm: "Are you sure? This will invalidate your registered applications and U2F devices." }, data: { confirm: _('Are you sure? This will invalidate your registered applications and U2F devices.') },
class: 'btn btn-danger append-right-10' class: 'btn btn-danger append-right-10'
= form_tag codes_profile_two_factor_auth_path, {style: 'display: inline-block', method: :post} do |f| = form_tag codes_profile_two_factor_auth_path, {style: 'display: inline-block', method: :post} do |f|
= submit_tag 'Regenerate recovery codes', class: 'btn' = submit_tag _('Regenerate recovery codes'), class: 'btn'
- else - else
%p %p
Install a soft token authenticator like <a href="https://freeotp.github.io/">FreeOTP</a> - help_link_start = '<a href="%{url}" target="_blank">' % { url: help_page_path('user/profile/account/two_factor_authentication') }
or Google Authenticator from your application repository and scan this QR code. - register_2fa_token = _('Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}.') % { free_otp_link:'<a href="https://freeotp.github.io/">FreeOTP</a>', help_link_start:help_link_start, help_link_end:'</a>' }
More information is available in the #{link_to('documentation', help_page_path('user/profile/account/two_factor_authentication'))}. = register_2fa_token.html_safe
.row.append-bottom-10 .row.append-bottom-10
.col-md-4 .col-md-4
= raw @qr_code = raw @qr_code
.col-md-8 .col-md-8
.account-well .account-well
%p.prepend-top-0.append-bottom-0 %p.prepend-top-0.append-bottom-0
Can't scan the code? = _("Can't scan the code?")
%p.prepend-top-0.append-bottom-0 %p.prepend-top-0.append-bottom-0
To add the entry manually, provide the following details to the application on your phone. = _('To add the entry manually, provide the following details to the application on your phone.')
%p.prepend-top-0.append-bottom-0 %p.prepend-top-0.append-bottom-0
Account: = _('Account: %{account}') % { account: @account_string }
= @account_string
%p.prepend-top-0.append-bottom-0 %p.prepend-top-0.append-bottom-0
Key: = _('Key: %{key}') %{ key: current_user.otp_secret.scan(/.{4}/).join(' ') }
= current_user.otp_secret.scan(/.{4}/).join(' ')
%p.two-factor-new-manual-content %p.two-factor-new-manual-content
Time based: Yes = _('Time based: Yes')
= form_tag profile_two_factor_auth_path, method: :post do |f| = form_tag profile_two_factor_auth_path, method: :post do |f|
- if @error - if @error
.alert.alert-danger .alert.alert-danger
= @error = @error
.form-group .form-group
= label_tag :pin_code, nil, class: "label-bold" = label_tag :pin_code, _('Pin code'), class: "label-bold"
= text_field_tag :pin_code, nil, class: "form-control", required: true = text_field_tag :pin_code, nil, class: "form-control", required: true
.prepend-top-default .prepend-top-default
= submit_tag 'Register with two-factor app', class: 'btn btn-success' = submit_tag _('Register with two-factor app'), class: 'btn btn-success'
%hr %hr
.row.prepend-top-default .row.prepend-top-default
.col-lg-4 .col-lg-4
%h4.prepend-top-0 %h4.prepend-top-0
Register Universal Two-Factor (U2F) Device = _('Register Universal Two-Factor (U2F) Device')
%p %p
Use a hardware device to add the second factor of authentication. = _('Use a hardware device to add the second factor of authentication.')
%p %p
As U2F devices are only supported by a few browsers, we require that you set up a = _("As U2F devices are only supported by a few browsers, we require that you set up a two-factor authentication app before a U2F device. That way you'll always be able to log in - even when you're using an unsupported browser.")
two-factor authentication app before a U2F device. That way you'll always be able to
log in - even when you're using an unsupported browser.
.col-lg-8 .col-lg-8
- if @u2f_registration.errors.present? - if @u2f_registration.errors.present?
= form_errors(@u2f_registration) = form_errors(@u2f_registration)
...@@ -74,7 +70,8 @@ ...@@ -74,7 +70,8 @@
%hr %hr
%h5 U2F Devices (#{@u2f_registrations.length}) %h5
= _('U2F Devices (%{length})') % { length: @u2f_registrations.length }
- if @u2f_registrations.present? - if @u2f_registrations.present?
.table-responsive .table-responsive
...@@ -85,16 +82,16 @@ ...@@ -85,16 +82,16 @@
%col{ width: "20%" } %col{ width: "20%" }
%thead %thead
%tr %tr
%th Name %th= _('Name')
%th Registered On %th= s_('2FADevice|Registered On')
%th %th
%tbody %tbody
- @u2f_registrations.each do |registration| - @u2f_registrations.each do |registration|
%tr %tr
%td= registration.name.presence || "<no name set>" %td= registration.name.presence || _("<no name set>")
%td= registration.created_at.to_date.to_s(:medium) %td= registration.created_at.to_date.to_s(:medium)
%td= link_to "Delete", profile_u2f_registration_path(registration), method: :delete, class: "btn btn-danger float-right", data: { confirm: "Are you sure you want to delete this device? This action cannot be undone." } %td= link_to _('Delete'), profile_u2f_registration_path(registration), method: :delete, class: "btn btn-danger float-right", data: { confirm: _('Are you sure you want to delete this device? This action cannot be undone.') }
- else - else
.settings-message.text-center .settings-message.text-center
You don't have any U2F devices registered yet. = _("You don't have any U2F devices registered yet.")
...@@ -340,6 +340,9 @@ msgstr "" ...@@ -340,6 +340,9 @@ msgstr ""
msgid "2FA enabled" msgid "2FA enabled"
msgstr "" msgstr ""
msgid "2FADevice|Registered On"
msgstr ""
msgid "3 days" msgid "3 days"
msgstr "" msgstr ""
...@@ -382,6 +385,9 @@ msgstr "" ...@@ -382,6 +385,9 @@ msgstr ""
msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address." msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
msgstr "" msgstr ""
msgid "<no name set>"
msgstr ""
msgid "<strong>%{changedFilesLength} unstaged</strong> and <strong>%{stagedFilesLength} staged</strong> changes" msgid "<strong>%{changedFilesLength} unstaged</strong> and <strong>%{stagedFilesLength} staged</strong> changes"
msgstr "" msgstr ""
...@@ -496,6 +502,9 @@ msgstr "" ...@@ -496,6 +502,9 @@ msgstr ""
msgid "Account and limit" msgid "Account and limit"
msgstr "" msgstr ""
msgid "Account: %{account}"
msgstr ""
msgid "Active" msgid "Active"
msgstr "" msgstr ""
...@@ -1102,6 +1111,9 @@ msgstr "" ...@@ -1102,6 +1111,9 @@ msgstr ""
msgid "Are you sure you want to cancel editing this comment?" msgid "Are you sure you want to cancel editing this comment?"
msgstr "" msgstr ""
msgid "Are you sure you want to delete this device? This action cannot be undone."
msgstr ""
msgid "Are you sure you want to delete this list?" msgid "Are you sure you want to delete this list?"
msgstr "" msgstr ""
...@@ -1153,9 +1165,15 @@ msgstr "" ...@@ -1153,9 +1165,15 @@ msgstr ""
msgid "Are you sure? Removing this GPG key does not affect already signed commits." msgid "Are you sure? Removing this GPG key does not affect already signed commits."
msgstr "" msgstr ""
msgid "Are you sure? This will invalidate your registered applications and U2F devices."
msgstr ""
msgid "Artifacts" msgid "Artifacts"
msgstr "" msgstr ""
msgid "As U2F devices are only supported by a few browsers, we require that you set up a two-factor authentication app before a U2F device. That way you'll always be able to log in - even when you're using an unsupported browser."
msgstr ""
msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{commit_url} ):" msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{commit_url} ):"
msgstr "" msgstr ""
...@@ -1737,6 +1755,9 @@ msgstr "" ...@@ -1737,6 +1755,9 @@ msgstr ""
msgid "Can't find variable: ZiteReader" msgid "Can't find variable: ZiteReader"
msgstr "" msgstr ""
msgid "Can't scan the code?"
msgstr ""
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
...@@ -2807,6 +2828,9 @@ msgstr "" ...@@ -2807,6 +2828,9 @@ msgstr ""
msgid "Confirmation required" msgid "Confirmation required"
msgstr "" msgstr ""
msgid "Congratulations! You have enabled Two-factor Authentication!"
msgstr ""
msgid "Connect" msgid "Connect"
msgstr "" msgstr ""
...@@ -3520,6 +3544,9 @@ msgstr "" ...@@ -3520,6 +3544,9 @@ msgstr ""
msgid "Disable shared Runners" msgid "Disable shared Runners"
msgstr "" msgstr ""
msgid "Disable two-factor authentication"
msgstr ""
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""
...@@ -3601,6 +3628,9 @@ msgstr "" ...@@ -3601,6 +3628,9 @@ msgstr ""
msgid "Download asset" msgid "Download asset"
msgstr "" msgstr ""
msgid "Download codes"
msgstr ""
msgid "Download export" msgid "Download export"
msgstr "" msgstr ""
...@@ -5108,6 +5138,9 @@ msgstr "" ...@@ -5108,6 +5138,9 @@ msgstr ""
msgid "If this was a mistake you can leave the %{source_type}." msgid "If this was a mistake you can leave the %{source_type}."
msgstr "" msgstr ""
msgid "If you lose your recovery codes you can generate new ones, invalidating all previous codes."
msgstr ""
msgid "If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>." msgid "If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>."
msgstr "" msgstr ""
...@@ -5288,6 +5321,9 @@ msgstr "" ...@@ -5288,6 +5321,9 @@ msgstr ""
msgid "Install Runner on Kubernetes" msgid "Install Runner on Kubernetes"
msgstr "" msgstr ""
msgid "Install a soft token authenticator like %{free_otp_link} or Google Authenticator from your application repository and scan this QR code. More information is available in the %{help_link_start}documentation%{help_link_end}."
msgstr ""
msgid "Instance Statistics" msgid "Instance Statistics"
msgstr "" msgstr ""
...@@ -5567,6 +5603,9 @@ msgstr "" ...@@ -5567,6 +5603,9 @@ msgstr ""
msgid "Key (PEM)" msgid "Key (PEM)"
msgstr "" msgstr ""
msgid "Key: %{key}"
msgstr ""
msgid "Kubernetes" msgid "Kubernetes"
msgstr "" msgstr ""
...@@ -6940,6 +6979,9 @@ msgstr "" ...@@ -6940,6 +6979,9 @@ msgstr ""
msgid "Pick a name" msgid "Pick a name"
msgstr "" msgstr ""
msgid "Pin code"
msgstr ""
msgid "Pipeline" msgid "Pipeline"
msgstr "" msgstr ""
...@@ -7315,6 +7357,9 @@ msgstr "" ...@@ -7315,6 +7357,9 @@ msgstr ""
msgid "Private projects can be created in your personal namespace with:" msgid "Private projects can be created in your personal namespace with:"
msgstr "" msgstr ""
msgid "Proceed"
msgstr ""
msgid "Profile" msgid "Profile"
msgstr "" msgstr ""
...@@ -8119,6 +8164,9 @@ msgstr "" ...@@ -8119,6 +8164,9 @@ msgstr ""
msgid "Recent searches" msgid "Recent searches"
msgstr "" msgstr ""
msgid "Recovery Codes"
msgstr ""
msgid "Reference:" msgid "Reference:"
msgstr "" msgstr ""
...@@ -8130,6 +8178,9 @@ msgstr[1] "" ...@@ -8130,6 +8178,9 @@ msgstr[1] ""
msgid "Regenerate key" msgid "Regenerate key"
msgstr "" msgstr ""
msgid "Regenerate recovery codes"
msgstr ""
msgid "Regex pattern" msgid "Regex pattern"
msgstr "" msgstr ""
...@@ -8139,15 +8190,24 @@ msgstr "" ...@@ -8139,15 +8190,24 @@ msgstr ""
msgid "Register / Sign In" msgid "Register / Sign In"
msgstr "" msgstr ""
msgid "Register Two-Factor Authenticator"
msgstr ""
msgid "Register U2F device" msgid "Register U2F device"
msgstr "" msgstr ""
msgid "Register Universal Two-Factor (U2F) Device"
msgstr ""
msgid "Register and see your runners for this group." msgid "Register and see your runners for this group."
msgstr "" msgstr ""
msgid "Register and see your runners for this project." msgid "Register and see your runners for this project."
msgstr "" msgstr ""
msgid "Register with two-factor app"
msgstr ""
msgid "Registry" msgid "Registry"
msgstr "" msgstr ""
...@@ -8957,6 +9017,9 @@ msgstr "" ...@@ -8957,6 +9017,9 @@ msgstr ""
msgid "Sherlock Transactions" msgid "Sherlock Transactions"
msgstr "" msgstr ""
msgid "Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %{b_start}will%{b_end} lose access to your account."
msgstr ""
msgid "Show all activity" msgid "Show all activity"
msgstr "" msgstr ""
...@@ -10302,6 +10365,9 @@ msgstr "" ...@@ -10302,6 +10365,9 @@ msgstr ""
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
msgid "Time based: Yes"
msgstr ""
msgid "Time before an issue gets scheduled" msgid "Time before an issue gets scheduled"
msgstr "" msgstr ""
...@@ -10504,6 +10570,9 @@ msgstr "" ...@@ -10504,6 +10570,9 @@ msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}." msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "" msgstr ""
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
msgid "To define internal users, first enable new users set to external" msgid "To define internal users, first enable new users set to external"
msgstr "" msgstr ""
...@@ -10717,6 +10786,15 @@ msgstr "" ...@@ -10717,6 +10786,15 @@ msgstr ""
msgid "Twitter" msgid "Twitter"
msgstr "" msgstr ""
msgid "Two-Factor Authentication"
msgstr ""
msgid "Two-factor Authentication"
msgstr ""
msgid "Two-factor Authentication Recovery codes"
msgstr ""
msgid "Two-factor Authentication has been disabled for this user" msgid "Two-factor Authentication has been disabled for this user"
msgstr "" msgstr ""
...@@ -10726,6 +10804,9 @@ msgstr "" ...@@ -10726,6 +10804,9 @@ msgstr ""
msgid "Type" msgid "Type"
msgstr "" msgstr ""
msgid "U2F Devices (%{length})"
msgstr ""
msgid "U2F only works with HTTPS-enabled websites. Contact your administrator for more details." msgid "U2F only works with HTTPS-enabled websites. Contact your administrator for more details."
msgstr "" msgstr ""
...@@ -10906,6 +10987,12 @@ msgstr "" ...@@ -10906,6 +10987,12 @@ msgstr ""
msgid "Use <code>%{native_redirect_uri}</code> for local tests" msgid "Use <code>%{native_redirect_uri}</code> for local tests"
msgstr "" msgstr ""
msgid "Use a hardware device to add the second factor of authentication."
msgstr ""
msgid "Use an one time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use group milestones to manage issues from multiple projects in the same milestone." msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr "" msgstr ""
...@@ -11466,6 +11553,9 @@ msgstr "" ...@@ -11466,6 +11553,9 @@ msgstr ""
msgid "You are going to transfer %{project_full_name} to another owner. Are you ABSOLUTELY sure?" msgid "You are going to transfer %{project_full_name} to another owner. Are you ABSOLUTELY sure?"
msgstr "" msgstr ""
msgid "You are not allowed to unlink your primary login account"
msgstr ""
msgid "You are now impersonating %{username}" msgid "You are now impersonating %{username}"
msgstr "" msgstr ""
...@@ -11577,6 +11667,9 @@ msgstr "" ...@@ -11577,6 +11667,9 @@ msgstr ""
msgid "You do not have permission to leave this %{namespaceType}." msgid "You do not have permission to leave this %{namespaceType}."
msgstr "" msgstr ""
msgid "You don't have any U2F devices registered yet."
msgstr ""
msgid "You don't have any active chat names." msgid "You don't have any active chat names."
msgstr "" msgstr ""
...@@ -11706,6 +11799,9 @@ msgstr "" ...@@ -11706,6 +11799,9 @@ msgstr ""
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}" msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr "" msgstr ""
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr ""
msgid "YouTube" msgid "YouTube"
msgstr "" msgstr ""
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册