Commit 49d63fea authored by David O'Regan's avatar David O'Regan

Merge branch '352645-mlunoe-update-upload-license-to-activate-license' into 'master'

Feat(Licensing): update upload to activate

See merge request gitlab-org/gitlab!80904
parents 5a330773 36b4b17e
...@@ -315,9 +315,7 @@ export default { ...@@ -315,9 +315,7 @@ export default {
<gl-dropdown-item v-if="hasMissingBoards" class="no-pointer-events"> <gl-dropdown-item v-if="hasMissingBoards" class="no-pointer-events">
{{ {{
s__( s__('IssueBoards|Some of your boards are hidden, add a license to see them again.')
'IssueBoards|Some of your boards are hidden, activate a license to see them again.',
)
}} }}
</gl-dropdown-item> </gl-dropdown-item>
</div> </div>
......
...@@ -268,7 +268,7 @@ sudo gitlab-rake gitlab:geo:check ...@@ -268,7 +268,7 @@ sudo gitlab-rake gitlab:geo:check
GitLab Geo is available ... no GitLab Geo is available ... no
Try fixing it: Try fixing it:
Upload a new license that includes the GitLab Geo feature Add a new license that includes the GitLab Geo feature
For more information see: For more information see:
https://about.gitlab.com/features/gitlab-geo/ https://about.gitlab.com/features/gitlab-geo/
GitLab Geo is enabled ... Exception: PG::UndefinedTable: ERROR: relation "geo_nodes" does not exist GitLab Geo is enabled ... Exception: PG::UndefinedTable: ERROR: relation "geo_nodes" does not exist
......
...@@ -20,7 +20,7 @@ The steps below should be followed in the order they appear. **Make sure the Git ...@@ -20,7 +20,7 @@ The steps below should be followed in the order they appear. **Make sure the Git
If you installed GitLab using the Omnibus packages (highly recommended): If you installed GitLab using the Omnibus packages (highly recommended):
1. [Install GitLab Enterprise Edition](https://about.gitlab.com/install/) on the nodes that will serve as the **secondary** site. Do not create an account or log in to the new **secondary** site. 1. [Install GitLab Enterprise Edition](https://about.gitlab.com/install/) on the nodes that will serve as the **secondary** site. Do not create an account or log in to the new **secondary** site.
1. [Upload the GitLab License](../../../user/admin_area/license.md) on the **primary** site to unlock Geo. The license must be for [GitLab Premium](https://about.gitlab.com/pricing/) or higher. 1. [Add the GitLab License](../../../user/admin_area/license.md) on the **primary** site to unlock Geo. The license must be for [GitLab Premium](https://about.gitlab.com/pricing/) or higher.
1. [Set up the database replication](database.md) (`primary (read-write) <-> secondary (read-only)` topology). 1. [Set up the database replication](database.md) (`primary (read-write) <-> secondary (read-only)` topology).
1. [Configure fast lookup of authorized SSH keys in the database](../../operations/fast_ssh_key_lookup.md). This step is required and needs to be done on **both** the **primary** and **secondary** sites. 1. [Configure fast lookup of authorized SSH keys in the database](../../operations/fast_ssh_key_lookup.md). This step is required and needs to be done on **both** the **primary** and **secondary** sites.
1. [Configure GitLab](../replication/configuration.md) to set the **primary** and **secondary** sites. 1. [Configure GitLab](../replication/configuration.md) to set the **primary** and **secondary** sites.
......
...@@ -35,7 +35,7 @@ Learn how to install, configure, update, and maintain your GitLab instance. ...@@ -35,7 +35,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Installing GitLab on Amazon Web Services (AWS)](../install/aws/index.md): Set up GitLab on Amazon AWS. - [Installing GitLab on Amazon Web Services (AWS)](../install/aws/index.md): Set up GitLab on Amazon AWS.
- [Geo](geo/index.md): Replicate your GitLab instance to other geographic locations as a read-only fully operational version. - [Geo](geo/index.md): Replicate your GitLab instance to other geographic locations as a read-only fully operational version.
- [Disaster Recovery](geo/disaster_recovery/index.md): Quickly fail-over to a different site with minimal effort in a disaster situation. - [Disaster Recovery](geo/disaster_recovery/index.md): Quickly fail-over to a different site with minimal effort in a disaster situation.
- [Add License](../user/admin_area/license.md): Upload a license at install time to unlock features that are in paid tiers of GitLab. - [Add License](../user/admin_area/license.md): Add a license at install time to unlock features that are in paid tiers of GitLab.
### Configuring GitLab ### Configuring GitLab
...@@ -68,7 +68,7 @@ Learn how to install, configure, update, and maintain your GitLab instance. ...@@ -68,7 +68,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Elasticsearch](../integration/elasticsearch.md): Enable Elasticsearch to - [Elasticsearch](../integration/elasticsearch.md): Enable Elasticsearch to
empower Advanced Search. Use when you deal with a huge amount of data. empower Advanced Search. Use when you deal with a huge amount of data.
- [External Classification Policy Authorization](../user/admin_area/settings/external_authorization.md) - [External Classification Policy Authorization](../user/admin_area/settings/external_authorization.md)
- [Upload a license](../user/admin_area/license.md): Upload a license to unlock - [Add a license](../user/admin_area/license.md): Add a license to unlock
features that are in paid tiers of GitLab. features that are in paid tiers of GitLab.
- [Admin Area](../user/admin_area/index.md): for self-managed instance-wide - [Admin Area](../user/admin_area/index.md): for self-managed instance-wide
configuration and maintenance. configuration and maintenance.
......
...@@ -827,7 +827,7 @@ to request additional material: ...@@ -827,7 +827,7 @@ to request additional material:
Geo is the solution for widely distributed development teams. Geo is the solution for widely distributed development teams.
- [Omnibus GitLab](https://docs.gitlab.com/omnibus/) - Everything you need to know - [Omnibus GitLab](https://docs.gitlab.com/omnibus/) - Everything you need to know
about administering your GitLab instance. about administering your GitLab instance.
- [Upload a license](../../user/admin_area/license.md): - [Add a license](../../user/admin_area/license.md):
Activate all GitLab Enterprise Edition functionality with a license. Activate all GitLab Enterprise Edition functionality with a license.
- [Pricing](https://about.gitlab.com/pricing/): Pricing for the different tiers. - [Pricing](https://about.gitlab.com/pricing/): Pricing for the different tiers.
......
...@@ -50,7 +50,7 @@ installation. ...@@ -50,7 +50,7 @@ installation.
## License ## License
- [Upload a license](../user/admin_area/license.md) or [start a free trial](https://about.gitlab.com/free-trial/): - [Add a license](../user/admin_area/license.md) or [start a free trial](https://about.gitlab.com/free-trial/):
Activate all GitLab Enterprise Edition functionality with a license. Activate all GitLab Enterprise Edition functionality with a license.
- [Pricing](https://about.gitlab.com/pricing/): Pricing for the different tiers. - [Pricing](https://about.gitlab.com/pricing/): Pricing for the different tiers.
......
...@@ -153,13 +153,13 @@ See the [quarterly subscription reconciliation section](../quarterly_reconciliat ...@@ -153,13 +153,13 @@ See the [quarterly subscription reconciliation section](../quarterly_reconciliat
### How cloud licensing works ### How cloud licensing works
#### Activate your license #### Add your license
1. When you purchase a GitLab self-managed plan, an activation code is generated. 1. When you purchase a GitLab self-managed plan, an activation code is generated.
This activation code is sent to the email address associated with the Customers Portal account. This activation code is sent to the email address associated with the Customers Portal account.
1. In GitLab, on the top bar, select **Menu > Admin**. 1. In GitLab, on the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Subscription** and paste the activation code in the text field. 1. On the left sidebar, select **Subscription** and paste the activation code in the text field.
1. Select **Activate**. 1. Select **Add license**.
The page displays the details of the subscription. The page displays the details of the subscription.
...@@ -256,7 +256,7 @@ To subscribe to GitLab through a GitLab self-managed installation: ...@@ -256,7 +256,7 @@ To subscribe to GitLab through a GitLab self-managed installation:
1. Go to the [Customers Portal](https://customers.gitlab.com/) and purchase a GitLab self-managed plan. 1. Go to the [Customers Portal](https://customers.gitlab.com/) and purchase a GitLab self-managed plan.
1. After purchase, a license file is sent to the email address associated to the Customers Portal account, 1. After purchase, a license file is sent to the email address associated to the Customers Portal account,
which must be [uploaded to your GitLab instance](../../user/admin_area/license.md#upload-your-license). which must be [add to your GitLab instance](../../user/admin_area/license.md#activate-gitlab-ee-with-a-license-file-or-key).
NOTE: NOTE:
If you're purchasing a subscription for an existing **Free** GitLab self-managed If you're purchasing a subscription for an existing **Free** GitLab self-managed
...@@ -380,7 +380,7 @@ To add seats to a subscription: ...@@ -380,7 +380,7 @@ To add seats to a subscription:
The following items are emailed to you: The following items are emailed to you:
- A payment receipt. You can also access this information in the Customers Portal under [**View invoices**](https://customers.gitlab.com/receipts). - A payment receipt. You can also access this information in the Customers Portal under [**View invoices**](https://customers.gitlab.com/receipts).
- A new license. [Upload this license](../../user/admin_area/license.md#upload-your-license) to your instance to use it. - A new license. [Add this license](../../user/admin_area/license.md#activate-gitlab-ee-with-an-activation-code) to your instance to use it.
### Renew a subscription ### Renew a subscription
...@@ -400,8 +400,8 @@ You can hover your mouse on the **Renew** button to see the date when it will be ...@@ -400,8 +400,8 @@ You can hover your mouse on the **Renew** button to see the date when it will be
1. In the first box, enter the total number of user licenses you'll need for the upcoming year. Be sure this number is at least **equal to, or greater than** the number of billable users in the system at the time of performing the renewal. 1. In the first box, enter the total number of user licenses you'll need for the upcoming year. Be sure this number is at least **equal to, or greater than** the number of billable users in the system at the time of performing the renewal.
1. Enter the number of [users over license](#users-over-license) in the second box for the user overage incurred in your previous subscription term. 1. Enter the number of [users over license](#users-over-license) in the second box for the user overage incurred in your previous subscription term.
1. Review your renewal details and complete the payment process. 1. Review your renewal details and complete the payment process.
1. A license for the renewal term is available for download on the [Manage Purchases](https://customers.gitlab.com/subscriptions) page on the relevant subscription card. Select **Copy license to clipboard** or **Download license** to get a copy. 1. An activation code for the renewal term is available on the [Manage Purchases](https://customers.gitlab.com/subscriptions) page on the relevant subscription card. Select **Copy activation code** to get a copy.
1. [Upload](../../user/admin_area/license.md#upload-your-license) your new license to your instance. 1. [Add your new license](../../user/admin_area/license.md#activate-gitlab-ee-with-an-activation-code) to your instance.
An invoice is generated for the renewal and available for viewing or download on the [View invoices](https://customers.gitlab.com/receipts) page. If you have difficulty during the renewal process, contact our [support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293) for assistance. An invoice is generated for the renewal and available for viewing or download on the [View invoices](https://customers.gitlab.com/receipts) page. If you have difficulty during the renewal process, contact our [support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293) for assistance.
...@@ -421,10 +421,10 @@ The following is emailed to you: ...@@ -421,10 +421,10 @@ The following is emailed to you:
- A payment receipt. You can also access this information in the Customers Portal under - A payment receipt. You can also access this information in the Customers Portal under
[**View invoices**](https://customers.gitlab.com/receipts). [**View invoices**](https://customers.gitlab.com/receipts).
- A new license. - A new activation code for your license.
[Upload the new license](../../user/admin_area/license.md#upload-your-license) to your instance. [Add the new license](../../user/admin_area/license.md#activate-gitlab-ee-with-an-activation-code) to your instance.
The new tier takes effect when the new license is uploaded. The new tier takes effect when the new license is activated.
## Add or change the contacts for your subscription ## Add or change the contacts for your subscription
...@@ -447,7 +447,7 @@ an expiration message is displayed to all administrators. ...@@ -447,7 +447,7 @@ an expiration message is displayed to all administrators.
For GitLab self-managed instances, you have a 14-day grace period For GitLab self-managed instances, you have a 14-day grace period
before this occurs. before this occurs.
- To resume functionality, upload a new license. - To resume functionality, acticate a new license.
- To fall back to Free features, delete the expired license. - To fall back to Free features, delete the expired license.
## Contact Support ## Contact Support
......
...@@ -91,8 +91,8 @@ The steps can be summed up to: ...@@ -91,8 +91,8 @@ The steps can be summed up to:
sudo gitlab-ctl reconfigure sudo gitlab-ctl reconfigure
``` ```
1. Now go to the GitLab admin panel of your server (`/admin/license/new`) and 1. Now go to the GitLab admin panel of your server (`/admin/subscription`) and
upload your license file. [add your license](../../user/admin_area/license.md#activate-gitlab-ee-with-an-activation-code).
1. After you confirm that GitLab is working as expected, you may remove the old 1. After you confirm that GitLab is working as expected, you may remove the old
Community Edition repository: Community Edition repository:
......
...@@ -30,7 +30,7 @@ The Admin Area is made up of the following sections: ...@@ -30,7 +30,7 @@ The Admin Area is made up of the following sections:
| **{hook}** System Hooks | Configure [system hooks](../../system_hooks/system_hooks.md) for many events. | | **{hook}** System Hooks | Configure [system hooks](../../system_hooks/system_hooks.md) for many events. |
| **{applications}** Applications | Create system [OAuth applications](../../integration/oauth_provider.md) for integrations with other services. | | **{applications}** Applications | Create system [OAuth applications](../../integration/oauth_provider.md) for integrations with other services. |
| **{slight-frown}** Abuse Reports | Manage [abuse reports](review_abuse_reports.md) submitted by your users. | | **{slight-frown}** Abuse Reports | Manage [abuse reports](review_abuse_reports.md) submitted by your users. |
| **{license}** License | Upload, display, and remove [licenses](license.md). | | **{license}** License | Add, display, and remove [licenses](license.md). |
| **{cloud-gear}** Kubernetes | Create and manage instance-level [Kubernetes clusters](../instance/clusters/index.md). | | **{cloud-gear}** Kubernetes | Create and manage instance-level [Kubernetes clusters](../instance/clusters/index.md). |
| **{push-rules}** Push rules | Configure pre-defined Git [push rules](../project/repository/push_rules.md) for projects. Also, configure [merge requests approvers rules](merge_requests_approvals.md). | | **{push-rules}** Push rules | Configure pre-defined Git [push rules](../project/repository/push_rules.md) for projects. Also, configure [merge requests approvers rules](merge_requests_approvals.md). |
| **{location-dot}** Geo | Configure and maintain [Geo nodes](geo_nodes.md). | | **{location-dot}** Geo | Configure and maintain [Geo nodes](geo_nodes.md). |
......
...@@ -39,26 +39,24 @@ To activate your instance with an activation code: ...@@ -39,26 +39,24 @@ To activate your instance with an activation code:
1. On the left sidebar, select **Subscription**. 1. On the left sidebar, select **Subscription**.
1. Enter the activation code in **Activation code**. 1. Enter the activation code in **Activation code**.
1. Read and accept the terms of service. 1. Read and accept the terms of service.
1. Select **Activate**. 1. Select **Add license**.
## Activate GitLab EE with a license file ## Activate GitLab EE with a license file or key
If you receive a license file from GitLab (for example, for a trial), you can If you receive a license file from GitLab (for example, for a trial), you can
upload it to your instance or add it during installation. The license file is upload it to your instance or add it during installation. The license file is
a base64-encoded ASCII text file with a `.gitlab-license` extension. a base64-encoded ASCII text file with a `.gitlab-license` extension.
## Upload your license
The first time you sign in to your GitLab instance, a note with a The first time you sign in to your GitLab instance, a note with a
link to the **Upload license** page should be displayed. link to the **Add license** page should be displayed.
Otherwise, to upload your license: Otherwise, to add your license:
1. Sign in to GitLab as an administrator. 1. Sign in to GitLab as an administrator.
1. On the top bar, select **Menu > Admin**. 1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > General**. 1. On the left sidebar, select **Settings > General**.
1. In the **License file** area, select **Upload a license**. 1. In the **License file** area, select **Add a license**.
1. Upload a license: 1. Add a license:
- For a file, either: - For a file, either:
- Select **Upload `.gitlab-license` file**, then **Choose File** and - Select **Upload `.gitlab-license` file**, then **Choose File** and
select the license file from your local machine. select the license file from your local machine.
...@@ -66,7 +64,7 @@ Otherwise, to upload your license: ...@@ -66,7 +64,7 @@ Otherwise, to upload your license:
- For plain text, select **Enter license key** and paste the contents in - For plain text, select **Enter license key** and paste the contents in
**License key**. **License key**.
1. Select the **Terms of Service** checkbox. 1. Select the **Terms of Service** checkbox.
1. Select **Upload License**. 1. Select **Add license**.
## Add your license during installation ## Add your license during installation
...@@ -91,7 +89,7 @@ You can import a license file when you install GitLab. ...@@ -91,7 +89,7 @@ You can import a license file when you install GitLab.
WARNING: WARNING:
These methods only add a license at the time of installation. To renew or upgrade These methods only add a license at the time of installation. To renew or upgrade
a license, upload the license in the **Admin Area** in the web user interface. a license, add the license in the **Admin Area** in the web user interface.
## What happens when your license expires ## What happens when your license expires
...@@ -103,13 +101,13 @@ and issue creation. Your instance becomes read-only and ...@@ -103,13 +101,13 @@ and issue creation. Your instance becomes read-only and
an expiration message displays to all administrators. You have a 14-day grace period an expiration message displays to all administrators. You have a 14-day grace period
before this occurs. before this occurs.
To resume functionality, [upload a new license](#upload-your-license). To resume functionality, [activate a new license](#activate-gitlab-ee-with-an-activation-code).
To go back to Free features, [delete all expired licenses](#remove-a-license-file). To go back to Free features, [delete all expired licenses](#remove-a-license).
## Remove a license file ## Remove a license
To remove a license file from a self-managed instance: To remove a license from a self-managed instance:
1. On the top bar, select **Menu > Admin**. 1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Subscription**. 1. On the left sidebar, select **Subscription**.
...@@ -124,17 +122,17 @@ To view your license details: ...@@ -124,17 +122,17 @@ To view your license details:
1. On the top bar, select **Menu > Admin**. 1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Subscription**. 1. On the left sidebar, select **Subscription**.
You can upload and view more than one license, but only the latest license in You can add and view more than one license, but only the latest license in
the current date range is the active license. the current date range is the active license.
When you upload a future-dated license, it doesn't take effect until its applicable date. When you add a future-dated license, it doesn't take effect until its applicable date.
You can view all active subscriptions in the **Subscription history** table. You can view all active subscriptions in the **Subscription history** table.
You can also [export](../../subscriptions/self_managed/index.md) your license usage information to a CSV file. You can also [export](../../subscriptions/self_managed/index.md) your license usage information to a CSV file.
NOTE: NOTE:
In GitLab 13.6 and earlier, a banner about an expiring license may continue to display In GitLab 13.6 and earlier, a banner about an expiring license may continue to display
when you upload a new license. This happens when the start date of the new license when you add a new license. This happens when the start date of the new license
is in the future and the expiring one is still active. is in the future and the expiring one is still active.
The banner disappears after the new license becomes active. The banner disappears after the new license becomes active.
...@@ -142,18 +140,18 @@ The banner disappears after the new license becomes active. ...@@ -142,18 +140,18 @@ The banner disappears after the new license becomes active.
### No Subscription area in the Admin Area ### No Subscription area in the Admin Area
You cannot upload your license because there is no **Subscription** area. You cannot add your license because there is no **Subscription** area.
This issue might occur if: This issue might occur if:
- You're running GitLab Community Edition. Before you upload your license, you - You're running GitLab Community Edition. Before you add your license, you
must [upgrade to Enterprise Edition](../../update/index.md#community-to-enterprise-edition). must [upgrade to Enterprise Edition](../../update/index.md#community-to-enterprise-edition).
- You're using GitLab.com. You cannot upload a self-managed license to GitLab.com. - You're using GitLab.com. You cannot add a self-managed license to GitLab.com.
To use paid features on GitLab.com, [purchase a separate subscription](../../subscriptions/gitlab_com/index.md). To use paid features on GitLab.com, [purchase a separate subscription](../../subscriptions/gitlab_com/index.md).
### Users exceed license limit upon renewal ### Users exceed license limit upon renewal
GitLab displays a message prompting you to purchase GitLab displays a message prompting you to purchase
additional users. This issue occurs if you upload a license that does not have enough additional users. This issue occurs if you add a license that does not have enough
users to cover the number of users in your instance. users to cover the number of users in your instance.
To fix this issue, purchase additional seats to cover those users. To fix this issue, purchase additional seats to cover those users.
...@@ -167,8 +165,8 @@ rules apply: ...@@ -167,8 +165,8 @@ rules apply:
- If the users over license are more than 10% of the users in the license file, - If the users over license are more than 10% of the users in the license file,
you cannot apply the license without purchasing more users. you cannot apply the license without purchasing more users.
For example, if you purchase a license for 100 users, you can have 110 users when you activate For example, if you purchase a license for 100 users, you can have 110 users when you add
your license. However, if you have 111 users, you must purchase more users before you can activate your license. However, if you have 111 users, you must purchase more users before you can add
the license. the license.
### Cannot activate instance due to connectivity error ### Cannot activate instance due to connectivity error
...@@ -177,7 +175,7 @@ In GitLab 14.1 and later, to activate your subscription with an activation code, ...@@ -177,7 +175,7 @@ In GitLab 14.1 and later, to activate your subscription with an activation code,
your GitLab instance must be connected to the internet. your GitLab instance must be connected to the internet.
If you have an offline or airgapped environment, If you have an offline or airgapped environment,
[upload a license file](license.md#activate-gitlab-ee-with-a-license-file) instead. [activate GitLab EE with a license file or key](license.md#activate-gitlab-ee-with-a-license-file-or-key) instead.
If you have questions or need assistance activating your instance, If you have questions or need assistance activating your instance,
[contact GitLab Support](https://about.gitlab.com/support/#contact-support). [contact GitLab Support](https://about.gitlab.com/support/#contact-support).
...@@ -55,8 +55,6 @@ export const detailsLabels = { ...@@ -55,8 +55,6 @@ export const detailsLabels = {
export const removeLicense = __('Remove license'); export const removeLicense = __('Remove license');
export const removeLicenseConfirm = __('Are you sure you want to remove the license?'); export const removeLicenseConfirm = __('Are you sure you want to remove the license?');
export const removeLicenseButtonLabel = __('Remove license'); export const removeLicenseButtonLabel = __('Remove license');
export const uploadLicense = __('Upload license');
export const uploadLicenseFile = s__('SuperSonics|Upload a license file');
export const billableUsersTitle = s__('SuperSonics|Billable users'); export const billableUsersTitle = s__('SuperSonics|Billable users');
export const maximumUsersTitle = s__('SuperSonics|Maximum users'); export const maximumUsersTitle = s__('SuperSonics|Maximum users');
export const usersInSubscriptionTitle = s__('SuperSonics|Users in subscription'); export const usersInSubscriptionTitle = s__('SuperSonics|Users in subscription');
......
...@@ -781,7 +781,7 @@ class License < ApplicationRecord ...@@ -781,7 +781,7 @@ class License < ApplicationRecord
message << "#{number_with_delimiter(user_count)} active #{"user".pluralize(user_count)}," message << "#{number_with_delimiter(user_count)} active #{"user".pluralize(user_count)},"
message << "exceeding this license's limit of #{number_with_delimiter(restricted_user_count)} by" message << "exceeding this license's limit of #{number_with_delimiter(restricted_user_count)} by"
message << "#{number_with_delimiter(overage_count)} #{"user".pluralize(overage_count)}." message << "#{number_with_delimiter(overage_count)} #{"user".pluralize(overage_count)}."
message << "Please upload a license for at least" message << "Please add a license for at least"
message << "#{number_with_delimiter(user_count)} #{"user".pluralize(user_count)} or contact sales at https://about.gitlab.com/sales/" message << "#{number_with_delimiter(user_count)} #{"user".pluralize(user_count)} or contact sales at https://about.gitlab.com/sales/"
self.errors.add(:base, message.join(' ')) self.errors.add(:base, message.join(' '))
......
...@@ -6,4 +6,4 @@ ...@@ -6,4 +6,4 @@
.settings-content .settings-content
- link_start = '<a href="%{url}" data-qa-selector="license_upload_link">'.html_safe % { url: new_admin_license_path } - link_start = '<a href="%{url}" data-qa-selector="license_upload_link">'.html_safe % { url: new_admin_license_path }
%p %p
= s_('%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } = s_('%{link_start}Add a license%{link_end} that you have received from GitLab Inc.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
- page_title _("Upload License") - page_title _("Add License")
- eula_url = "https://#{ApplicationHelper.promo_host}/terms/#subscription" - eula_url = "https://#{ApplicationHelper.promo_host}/terms/#subscription"
- eula_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: eula_url } - eula_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: eula_url }
%h3.page-title= _('Upload License') %h3.page-title= _('Add License')
%p.light %p.light
- if License.current - if License.current
...@@ -23,8 +23,6 @@ ...@@ -23,8 +23,6 @@
- @license.errors.full_messages.each do |msg| - @license.errors.full_messages.each do |msg|
%li= msg %li= msg
.form-group .form-group
.form-check .form-check
= radio_button_tag :license_type, :file, @license.data.blank?, class: 'form-check-input' = radio_button_tag :license_type, :file, @license.data.blank?, class: 'form-check-input'
...@@ -44,9 +42,6 @@ ...@@ -44,9 +42,6 @@
= f.label :data, _('License key'), class: 'gl-sr-only' = f.label :data, _('License key'), class: 'gl-sr-only'
= f.text_area :data, class: "form-control license-key-field", data: { qa_selector: 'license_key_field' }, rows: 20 = f.text_area :data, class: "form-control license-key-field", data: { qa_selector: 'license_key_field' }, rows: 20
%hr %hr
%h4.gl-font-base= _("Terms of service") %h4.gl-font-base= _("Terms of service")
...@@ -57,4 +52,4 @@ ...@@ -57,4 +52,4 @@
= _('Unless otherwise agreed to in writing with GitLab, by clicking "Upload License" you agree that your use of GitLab Software is subject to the %{eula_link_start}Terms of Service%{eula_link_end}.').html_safe % { eula_link_start: eula_link_start, eula_url: eula_url, eula_link_end: '</a>'.html_safe } = _('Unless otherwise agreed to in writing with GitLab, by clicking "Upload License" you agree that your use of GitLab Software is subject to the %{eula_link_start}Terms of Service%{eula_link_end}.').html_safe % { eula_link_start: eula_link_start, eula_url: eula_url, eula_link_end: '</a>'.html_safe }
.form-actions .form-actions
= f.submit 'Upload License', class: 'gl-button btn btn-confirm', data: { qa_selector: 'license_upload_button' }, disabled: true, id: 'js-upload-license' = f.submit 'Add license', class: 'gl-button btn btn-confirm', data: { qa_selector: 'license_upload_button' }, disabled: true, id: 'js-upload-license'
...@@ -13,4 +13,4 @@ ...@@ -13,4 +13,4 @@
= payload.body = payload.body
.gl-alert-actions .gl-alert-actions
= link_to s_('SubscriptionBanner|Export license usage file'), admin_license_usage_export_path(format: :csv), class: 'btn gl-alert-action gl-button btn-confirm' = link_to s_('SubscriptionBanner|Export license usage file'), admin_license_usage_export_path(format: :csv), class: 'btn gl-alert-action gl-button btn-confirm'
= link_to s_('SubscriptionBanner|Upload new license'), new_admin_license_path, class: 'btn gl-alert-action gl-button btn-default' = link_to s_('SubscriptionBanner|Add new license'), new_admin_license_path, class: 'btn gl-alert-action gl-button btn-default'
...@@ -13,4 +13,4 @@ ...@@ -13,4 +13,4 @@
= payload.body = payload.body
.gl-alert-actions .gl-alert-actions
= link_to s_('SubscriptionBanner|Export license usage file'), admin_license_usage_export_path(format: :csv), class: 'btn gl-alert-action gl-button btn-confirm' = link_to s_('SubscriptionBanner|Export license usage file'), admin_license_usage_export_path(format: :csv), class: 'btn gl-alert-action gl-button btn-confirm'
= link_to s_('SubscriptionBanner|Upload new license'), new_admin_license_path, class: 'btn gl-alert-action gl-button btn-default' = link_to s_('SubscriptionBanner|Add new license'), new_admin_license_path, class: 'btn gl-alert-action gl-button btn-default'
...@@ -32,14 +32,14 @@ module Gitlab ...@@ -32,14 +32,14 @@ module Gitlab
'You have more active users than are allowed by your license. GitLab must now reconcile your ' \ 'You have more active users than are allowed by your license. GitLab must now reconcile your ' \
'subscription. To complete this process, export your license usage file and email it to ' \ 'subscription. To complete this process, export your license usage file and email it to ' \
'%{renewal_service_email}. A new license will be emailed to the email address registered in the ' \ '%{renewal_service_email}. A new license will be emailed to the email address registered in the ' \
'%{customers_dot}. You can upload this license to your instance.' '%{customers_dot}. You can add this license to your instance.'
).html_safe % { renewal_service_email: renewal_service_email, customers_dot: customers_dot_url } ).html_safe % { renewal_service_email: renewal_service_email, customers_dot: customers_dot_url }
else else
_( _(
'You have more active users than are allowed by your license. Before %{date} GitLab ' \ 'You have more active users than are allowed by your license. Before %{date} GitLab ' \
'must reconcile your subscription. To complete this process, export your license usage file and email ' \ 'must reconcile your subscription. To complete this process, export your license usage file and email ' \
'it to %{renewal_service_email}. A new license will be emailed to the email address registered in ' \ 'it to %{renewal_service_email}. A new license will be emailed to the email address registered in ' \
'the %{customers_dot}. You can upload this license to your instance.' 'the %{customers_dot}. You can add this license to your instance.'
).html_safe % { date: formatted_date, renewal_service_email: renewal_service_email, customers_dot: customers_dot_url } ).html_safe % { date: formatted_date, renewal_service_email: renewal_service_email, customers_dot: customers_dot_url }
end end
end end
......
...@@ -35,14 +35,14 @@ module Gitlab ...@@ -35,14 +35,14 @@ module Gitlab
_( _(
'Your subscription is now expired. To renew, export your license usage file and email it to ' \ 'Your subscription is now expired. To renew, export your license usage file and email it to ' \
'%{renewal_service_email}. A new license will be emailed to the email address registered in the ' \ '%{renewal_service_email}. A new license will be emailed to the email address registered in the ' \
'%{customers_dot}. You can upload this license to your instance. To use Free tier, remove your ' \ '%{customers_dot}. You can add this license to your instance. To use Free tier, remove your ' \
'current license.' 'current license.'
).html_safe % { renewal_service_email: renewal_service_email, customers_dot: customers_dot_url } ).html_safe % { renewal_service_email: renewal_service_email, customers_dot: customers_dot_url }
else else
_( _(
'To renew, export your license usage file and email it to %{renewal_service_email}. ' \ 'To renew, export your license usage file and email it to %{renewal_service_email}. ' \
'A new license will be emailed to the email address registered in the %{customers_dot}. ' \ 'A new license will be emailed to the email address registered in the %{customers_dot}. ' \
'You can upload this license to your instance.' 'You can add this license to your instance.'
).html_safe % { renewal_service_email: renewal_service_email, customers_dot: customers_dot_url } ).html_safe % { renewal_service_email: renewal_service_email, customers_dot: customers_dot_url }
end end
end end
......
...@@ -25,7 +25,7 @@ module SystemCheck ...@@ -25,7 +25,7 @@ module SystemCheck
def show_error def show_error
try_fixing_it( try_fixing_it(
'Upload a new license that includes the GitLab Geo feature' 'Add a new license that includes the GitLab Geo feature'
) )
for_more_information('https://about.gitlab.com/features/gitlab-geo/') for_more_information('https://about.gitlab.com/features/gitlab-geo/')
......
...@@ -409,8 +409,8 @@ RSpec.describe 'Admin updates EE-only settings' do ...@@ -409,8 +409,8 @@ RSpec.describe 'Admin updates EE-only settings' do
end end
context 'License file link' do context 'License file link' do
it 'provides a link to upload License file' do it 'provides a link to add a License file' do
expect(page).to have_link(text: 'Upload a license', href: new_admin_license_path) expect(page).to have_link(text: 'Add a license', href: new_admin_license_path)
end end
end end
end end
......
...@@ -15,24 +15,28 @@ RSpec.describe "Admin uploads license", :js do ...@@ -15,24 +15,28 @@ RSpec.describe "Admin uploads license", :js do
visit(new_admin_license_path) visit(new_admin_license_path)
end end
it 'has the correct title' do
expect(page.title).to have_content("Add License")
end
it 'has unselected EULA checkbox by default' do it 'has unselected EULA checkbox by default' do
expect(page).to have_unchecked_field('accept_eula') expect(page).to have_unchecked_field('accept_eula')
end end
it 'has disabled button "Upload license" by default' do it 'has disabled button "Add license" by default' do
expect(page).to have_button('Upload License', disabled: true) expect(page).to have_button('Add license', disabled: true)
end end
it 'redirects to current Subscription terms' do it 'redirects to current Subscription terms' do
expect(page).to have_link('Terms of Service', href: "https://#{ApplicationHelper.promo_host}/terms/#subscription") expect(page).to have_link('Terms of Service', href: "https://#{ApplicationHelper.promo_host}/terms/#subscription")
end end
it 'enables button "Upload license" when EULA checkbox is selected' do it 'enables button "Add license" when EULA checkbox is selected' do
expect(page).to have_button('Upload License', disabled: true) expect(page).to have_button('Add license', disabled: true)
check('accept_eula') check('accept_eula')
expect(page).to have_button('Upload License', disabled: false) expect(page).to have_button('Add license', disabled: false)
end end
end end
...@@ -115,6 +119,6 @@ RSpec.describe "Admin uploads license", :js do ...@@ -115,6 +119,6 @@ RSpec.describe "Admin uploads license", :js do
def attach_and_upload(path) def attach_and_upload(path)
attach_file("license[data_file]", path, make_visible: true) attach_file("license[data_file]", path, make_visible: true)
check("accept_eula") check("accept_eula")
click_button("Upload License") click_button("Add license")
end end
end end
...@@ -223,9 +223,9 @@ RSpec.describe 'Admin views Subscription', :js do ...@@ -223,9 +223,9 @@ RSpec.describe 'Admin views Subscription', :js do
end end
context 'when uploading a license file' do context 'when uploading a license file' do
it 'does not show a link to upload a license file' do it 'does not show a link to activate a license file' do
page.within(find('#content-body', match: :first)) do page.within(find('#content-body', match: :first)) do
expect(page).not_to have_link('Upload a license file', href: new_admin_license_path) expect(page).not_to have_link('Activate a license', href: new_admin_license_path)
end end
end end
end end
......
...@@ -39,7 +39,7 @@ RSpec.describe 'Multiple Issue Boards', :js do ...@@ -39,7 +39,7 @@ RSpec.describe 'Multiple Issue Boards', :js do
click_button board.name click_button board.name
expect(page).not_to have_content('Some of your boards are hidden, activate a license to see them again.') expect(page).not_to have_content('Some of your boards are hidden, add a license to see them again.')
end end
it 'shows a license warning when group has more than one board' do it 'shows a license warning when group has more than one board' do
...@@ -50,7 +50,7 @@ RSpec.describe 'Multiple Issue Boards', :js do ...@@ -50,7 +50,7 @@ RSpec.describe 'Multiple Issue Boards', :js do
click_button board.name click_button board.name
expect(page).to have_content('Some of your boards are hidden, activate a license to see them again.') expect(page).to have_content('Some of your boards are hidden, add a license to see them again.')
end end
end end
......
...@@ -140,7 +140,7 @@ RSpec.describe Gitlab::ManualQuarterlyCoTermBanner do ...@@ -140,7 +140,7 @@ RSpec.describe Gitlab::ManualQuarterlyCoTermBanner do
"You have more active users than are allowed by your license. Before #{next_reconciliation_date} " \ "You have more active users than are allowed by your license. Before #{next_reconciliation_date} " \
"GitLab must reconcile your subscription. To complete this process, export your license usage " \ "GitLab must reconcile your subscription. To complete this process, export your license usage " \
"file and email it to #{Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL}. A new license will " \ "file and email it to #{Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL}. A new license will " \
"be emailed to the email address registered in the Customers Portal. You can upload this license " \ "be emailed to the email address registered in the Customers Portal. You can add this license " \
"to your instance." "to your instance."
) )
end end
...@@ -167,7 +167,7 @@ RSpec.describe Gitlab::ManualQuarterlyCoTermBanner do ...@@ -167,7 +167,7 @@ RSpec.describe Gitlab::ManualQuarterlyCoTermBanner do
"You have more active users than are allowed by your license. GitLab must now reconcile your " \ "You have more active users than are allowed by your license. GitLab must now reconcile your " \
"subscription. To complete this process, export your license usage file and email it to " \ "subscription. To complete this process, export your license usage file and email it to " \
"#{Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL}. A new license will be emailed to the " \ "#{Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL}. A new license will be emailed to the " \
"email address registered in the Customers Portal. You can upload this license to your instance." "email address registered in the Customers Portal. You can add this license to your instance."
) )
end end
end end
......
...@@ -144,7 +144,7 @@ RSpec.describe Gitlab::ManualRenewalBanner do ...@@ -144,7 +144,7 @@ RSpec.describe Gitlab::ManualRenewalBanner do
expect(body).to eq( expect(body).to eq(
"To renew, export your license usage file and email it to " \ "To renew, export your license usage file and email it to " \
"#{Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL}. A new license will be emailed to the email " \ "#{Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL}. A new license will be emailed to the email " \
"address registered in the Customers Portal. You can upload this license to your instance." "address registered in the Customers Portal. You can add this license to your instance."
) )
end end
end end
...@@ -169,7 +169,7 @@ RSpec.describe Gitlab::ManualRenewalBanner do ...@@ -169,7 +169,7 @@ RSpec.describe Gitlab::ManualRenewalBanner do
expect(body).to eq( expect(body).to eq(
"Your subscription is now expired. To renew, export your license usage file and email it to " \ "Your subscription is now expired. To renew, export your license usage file and email it to " \
"#{Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL}. A new license will be emailed to the email " \ "#{Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL}. A new license will be emailed to the email " \
"address registered in the Customers Portal. You can upload this license to your instance. To use " \ "address registered in the Customers Portal. You can add this license to your instance. To use " \
"Free tier, remove your current license." "Free tier, remove your current license."
) )
end end
......
...@@ -33,7 +33,7 @@ RSpec.shared_examples 'invalid daily billable users count compared to limit set ...@@ -33,7 +33,7 @@ RSpec.shared_examples 'invalid daily billable users count compared to limit set
overage = billable_users_count - active_user_count overage = billable_users_count - active_user_count
error_message = "This GitLab installation currently has #{billable_users_count} active users, " \ error_message = "This GitLab installation currently has #{billable_users_count} active users, " \
"exceeding this license's limit of #{active_user_count} by #{overage} users. " \ "exceeding this license's limit of #{active_user_count} by #{overage} users. " \
"Please upload a license for at least #{billable_users_count} users" "Please add a license for at least #{billable_users_count} users"
expect(license.errors.full_messages.to_sentence).to include(error_message) expect(license.errors.full_messages.to_sentence).to include(error_message)
end end
...@@ -78,7 +78,7 @@ RSpec.shared_examples 'invalid prior historical max compared to limit set by lic ...@@ -78,7 +78,7 @@ RSpec.shared_examples 'invalid prior historical max compared to limit set by lic
error_message = "During the year before this license started, " \ error_message = "During the year before this license started, " \
"this GitLab installation had #{prior_active_user_count} active users, " \ "this GitLab installation had #{prior_active_user_count} active users, " \
"exceeding this license's limit of #{active_user_count} by #{overage} user. " \ "exceeding this license's limit of #{active_user_count} by #{overage} user. " \
"Please upload a license for at least #{prior_active_user_count} users" "Please add a license for at least #{prior_active_user_count} users"
expect(license.errors.full_messages.to_sentence).to include(error_message) expect(license.errors.full_messages.to_sentence).to include(error_message)
end end
......
...@@ -777,6 +777,9 @@ msgstr "" ...@@ -777,6 +777,9 @@ msgstr ""
msgid "%{linkStart}Learn more.%{linkEnd}" msgid "%{linkStart}Learn more.%{linkEnd}"
msgstr "" msgstr ""
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles." msgid "%{link_start}Learn more%{link_end} about roles."
msgstr "" msgstr ""
...@@ -786,9 +789,6 @@ msgstr "" ...@@ -786,9 +789,6 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready." msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "" msgstr ""
msgid "%{link_start}Upload a license%{link_end} file or enter the license key you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}" msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr "" msgstr ""
...@@ -2043,6 +2043,9 @@ msgstr "" ...@@ -2043,6 +2043,9 @@ msgstr ""
msgid "Add LICENSE" msgid "Add LICENSE"
msgstr "" msgstr ""
msgid "Add License"
msgstr ""
msgid "Add New Site" msgid "Add New Site"
msgstr "" msgstr ""
...@@ -20461,7 +20464,7 @@ msgstr "" ...@@ -20461,7 +20464,7 @@ msgstr ""
msgid "IssueBoards|No matching boards found" msgid "IssueBoards|No matching boards found"
msgstr "" msgstr ""
msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again." msgid "IssueBoards|Some of your boards are hidden, add a license to see them again."
msgstr "" msgstr ""
msgid "IssueBoards|Switch board" msgid "IssueBoards|Switch board"
...@@ -35354,10 +35357,10 @@ msgstr "" ...@@ -35354,10 +35357,10 @@ msgstr ""
msgid "Subscription successfully deleted." msgid "Subscription successfully deleted."
msgstr "" msgstr ""
msgid "SubscriptionBanner|Export license usage file" msgid "SubscriptionBanner|Add new license"
msgstr "" msgstr ""
msgid "SubscriptionBanner|Upload new license" msgid "SubscriptionBanner|Export license usage file"
msgstr "" msgstr ""
msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist." msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
...@@ -35738,9 +35741,6 @@ msgstr "" ...@@ -35738,9 +35741,6 @@ msgstr ""
msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription." msgid "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
msgstr "" msgstr ""
msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription" msgid "SuperSonics|Users in subscription"
msgstr "" msgstr ""
...@@ -38443,7 +38443,7 @@ msgstr "" ...@@ -38443,7 +38443,7 @@ msgstr ""
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab." msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr "" msgstr ""
msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance." msgid "To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr "" msgstr ""
msgid "To resolve this, try to:" msgid "To resolve this, try to:"
...@@ -39469,9 +39469,6 @@ msgstr "" ...@@ -39469,9 +39469,6 @@ msgstr ""
msgid "Upload File" msgid "Upload File"
msgstr "" msgstr ""
msgid "Upload License"
msgstr ""
msgid "Upload New File" msgid "Upload New File"
msgstr "" msgstr ""
...@@ -39490,9 +39487,6 @@ msgstr "" ...@@ -39490,9 +39487,6 @@ msgstr ""
msgid "Upload image" msgid "Upload image"
msgstr "" msgstr ""
msgid "Upload license"
msgstr ""
msgid "Upload new file" msgid "Upload new file"
msgstr "" msgstr ""
...@@ -42284,10 +42278,10 @@ msgstr "" ...@@ -42284,10 +42278,10 @@ msgstr ""
msgid "You have insufficient permissions to view shifts for this rotation" msgid "You have insufficient permissions to view shifts for this rotation"
msgstr "" msgstr ""
msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance." msgid "You have more active users than are allowed by your license. Before %{date} GitLab must reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr "" msgstr ""
msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance." msgid "You have more active users than are allowed by your license. GitLab must now reconcile your subscription. To complete this process, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance."
msgstr "" msgstr ""
msgid "You have no permissions" msgid "You have no permissions"
...@@ -42773,7 +42767,7 @@ msgstr "" ...@@ -42773,7 +42767,7 @@ msgstr ""
msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage." msgid "Your subscription has %{remaining_seats_count} out of %{total_seats_count} seats remaining. Even if you reach the number of seats in your subscription, you can continue to add users, and GitLab will bill you for the overage."
msgstr "" msgstr ""
msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can upload this license to your instance. To use Free tier, remove your current license." msgid "Your subscription is now expired. To renew, export your license usage file and email it to %{renewal_service_email}. A new license will be emailed to the email address registered in the %{customers_dot}. You can add this license to your instance. To use Free tier, remove your current license."
msgstr "" msgstr ""
msgid "Your subscription will expire in %{remaining_days} day." msgid "Your subscription will expire in %{remaining_days} day."
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment