From 6523fd09558838e1e4e563b218358d29637d75eb Mon Sep 17 00:00:00 2001 From: catborise Date: Wed, 4 Nov 2026 22:25:43 +0300 Subject: [PATCH] style(admin): the user form asks who, what role, what quota, then what more The create and edit pages of a user had one form for both, ordered for editing: permissions first, the name and password folded below them and the quota folded and closed at the end; a new user's name came last. Both pages now go Account (name, password, may sign in), Role, Quota, then Groups and permissions, each section with what it is for beside its fields. Template editor and Superuser become one Role choice with User: choosing Superuser hides the quota and permissions, which a superuser does not need (no quota check applies, every permission is theirs); it keeps the is_staff it had. The quota is always open: each limit takes a number from 0, or No limit, which is kept as -1 as before; memory is entered in GiB and kept in MiB, shown exactly so saving a user again changes nothing. The button says Create user or Save changes. --- .../tests/test_change_password_permission.py | 2 +- admin/forms.py | 75 +- admin/templates/admin/user_form.html | 262 ++++--- admin/tests/test_audit_rows.py | 2 +- admin/tests/test_user_create.py | 2 +- admin/tests/test_user_pages.py | 55 +- admin/tests/test_user_update_next.py | 2 +- admin/tests/test_views.py | 6 +- locale/tr/LC_MESSAGES/django.mo | Bin 190805 -> 190784 bytes locale/tr/LC_MESSAGES/django.po | 722 +++++++++--------- locale/zh/LC_MESSAGES/django.mo | Bin 178375 -> 178386 bytes locale/zh/LC_MESSAGES/django.po | 714 +++++++++-------- static/js/user_form.js | 11 + 13 files changed, 988 insertions(+), 865 deletions(-) create mode 100644 static/js/user_form.js diff --git a/accounts/tests/test_change_password_permission.py b/accounts/tests/test_change_password_permission.py index cc50e014..01bb1d43 100644 --- a/accounts/tests/test_change_password_permission.py +++ b/accounts/tests/test_change_password_permission.py @@ -42,7 +42,7 @@ class ChangePasswordPermissionTestCase(TestCase): def test_create_form_ticks_it_and_the_admin_choice_wins(self): self.assertIn(permission(), UserCreateForm().fields["user_permissions"].initial) - form = UserCreateForm(data={"username": "unticked", "password": "pw", "is_active": True}) + form = UserCreateForm(data={"username": "unticked", "password": "pw", "is_active": True, "role": "user"}) self.assertTrue(form.is_valid(), form.errors) self.assertFalse(can_change(form.save())) diff --git a/admin/forms.py b/admin/forms.py index aea6af32..e92d741c 100644 --- a/admin/forms.py +++ b/admin/forms.py @@ -1,3 +1,5 @@ +from decimal import ROUND_HALF_UP, Decimal + from django import forms from django.conf import settings from django.contrib.auth import password_validation @@ -64,6 +66,14 @@ class GroupForm(forms.ModelForm): class UserForm(UniqueEmailMixin, forms.ModelForm): + # one choice for is_staff and is_superuser: a superuser keeps the + # is_staff it had (it adds nothing to every permission) + role = forms.ChoiceField( + widget=forms.RadioSelect, + choices=[("user", _("User")), ("template_editor", _("Template editor")), ("superuser", _("Superuser"))], + initial="user", + ) + user_permissions = forms.ModelMultipleChoiceField( widget=forms.CheckboxSelectMultiple, queryset=Permission.objects.filter(content_type__model="permissionset"), @@ -87,12 +97,24 @@ class UserForm(UniqueEmailMixin, forms.ModelForm): "last_name", "email", "user_permissions", - "is_staff", "is_active", - "is_superuser", ] - labels = {"is_staff": _("Template editor")} - help_texts = {"is_staff": _("May change and delete the template VMs given to them")} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if self.instance.is_superuser: + self.initial["role"] = "superuser" + elif self.instance.is_staff: + self.initial["role"] = "template_editor" + + def clean(self): + cleaned = super().clean() + role = cleaned.get("role") + if role: + cleaned["is_superuser"] = self.instance.is_superuser = role == "superuser" + if role != "superuser": + self.instance.is_staff = role == "template_editor" + return cleaned def permission_rows(self): return permission_rows(self["user_permissions"]) @@ -152,16 +174,55 @@ class UserCreateForm(UserForm): "last_name", "email", "user_permissions", - "is_staff", "is_active", - "is_superuser", ] +# the quota's limits, with the unit each is entered in (memory in GiB, kept in MiB) +QUOTA_UNITS = {"max_instances": "", "max_cpus": "", "max_memory": "GiB", "max_disk_size": "GiB"} + + class UserAttributesForm(forms.ModelForm): + """The quota: each limit a number from 0 (none allowed) or No limit, + which is kept as -1; memory is entered in GiB and kept in MiB.""" + + max_instances = forms.IntegerField(label=_("VMs"), min_value=0, required=False) + max_cpus = forms.IntegerField(label=_("vCPUs"), min_value=0, required=False) + max_memory = forms.DecimalField(label=_("Memory"), min_value=0, required=False) + max_disk_size = forms.IntegerField(label=_("Disk"), min_value=0, required=False) + class Meta: model = UserAttributes - exclude = ["user", "can_clone_instances", "must_change_password"] + fields = list(QUOTA_UNITS) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + for name in QUOTA_UNITS: + limit = getattr(self.instance, name) # a new user's: the model's default + self.fields[f"{name}_unlimited"] = forms.BooleanField(label=_("No limit"), required=False, initial=limit == -1) + if limit == -1: + self.initial[name] = None + elif name == "max_memory": + # exact: a MiB count over 1024 always ends, so saving it again changes nothing + self.initial[name] = format(Decimal(limit) / 1024, "f") + else: + self.initial[name] = limit + + def clean(self): + cleaned = super().clean() + for name in QUOTA_UNITS: + if cleaned.get(f"{name}_unlimited"): + cleaned[name] = -1 + elif cleaned.get(name) is None: + if name not in self.errors: + self.add_error(name, _("Enter a limit or choose No limit.")) + elif name == "max_memory": + cleaned[name] = int((cleaned[name] * 1024).to_integral_value(ROUND_HALF_UP)) + return cleaned + + def quota_rows(self): + """Each limit's field, its No limit box and its unit, for the form page.""" + return [(self[name], self[f"{name}_unlimited"], unit) for name, unit in QUOTA_UNITS.items()] class AdminPasswordForm(AdminPasswordChangeForm): diff --git a/admin/templates/admin/user_form.html b/admin/templates/admin/user_form.html index 54d8e22a..392420b4 100644 --- a/admin/templates/admin/user_form.html +++ b/admin/templates/admin/user_form.html @@ -1,141 +1,177 @@ {% extends "base.html" %} {% load django_bootstrap5 %} -{% load bootstrap_icons %} {% load i18n %} +{% load static %} {% block title %}{{ title }}{% endblock %} {% block page_heading %}{{ title }}{% endblock page_heading %} -{% block content %} -{# what the user may do comes first; who they are and their quota fold away #} -{% if edited_user %} -
- {{ edited_user.username }} - {% if edited_user.email %}{{ edited_user.email }}{% endif %} -
{% trans "Last login" %} {{ edited_user.last_login|date:"Y-m-d H:i"|default:_("never") }}
-
-{% endif %} +{% block style %} + +{% endblock style %} +{% block content %} +{# who the user is, what they manage, what they may use, then what more they may do #}
{% csrf_token %} {% bootstrap_form_errors user_form type="non_fields" %} -
- - -
{% trans "Turn off to block the user while keeping the account." %}
-
- -

- {% if edited_user %}{% blocktrans with name=edited_user.username %}What can {{ name }} do?{% endblocktrans %}{% else %}{% trans "What can the user do?" %}{% endif %} -

-

{% trans "The permissions of the user's groups apply too." %}

- -
-
- -
-
- -
-
- -
- {% trans "Groups" %} -
- {% for box in user_form.groups %} - - {% empty %} - {% trans "There are no groups yet." %} - {% endfor %} -
- {% for error in user_form.groups.errors %}
{{ error }}
{% endfor %} -
- -
- {% trans "Own permissions" %} -

{% trans "Off grants nothing here; it takes away nothing a group grants." %}

-
- {% for box, help in user_form.permission_rows %} -
- - +
+
+
+

{% trans "Account" %}

+ {% if edited_user %} +

{% trans "Last login" %}: {{ edited_user.last_login|date:"Y-m-d H:i"|default:_("never") }}

+ {% else %} +

{% trans "What the user signs in with." %}

+ {% endif %} +
+
+
+
{% bootstrap_field user_form.username %}
+
+ {% if edited_user %} + {% trans "Password" %} +
+ {% if edited_user.has_usable_password %}{% trans "Set" %}{% else %}{% trans "Not set" %}{% endif %} + {% trans "Change password" %} +
+ {% else %} + {% bootstrap_field user_form.password %} + {% endif %} +
+
{% bootstrap_field user_form.first_name %}
+
{% bootstrap_field user_form.last_name %}
+
{% bootstrap_field user_form.email %}
- {% endfor %} +
+ + +
{% trans "Turn off to block the user while keeping the account." %}
+
+
- {% for error in user_form.user_permissions.errors %}
{{ error }}
{% endfor %} -
+ -
- - {% trans "Name and password" %} - {% if edited_user %} - - {{ edited_user.username }}{% if edited_user.email %} · {{ edited_user.email }}{% endif %} · - {% if edited_user.has_usable_password %}{% trans "password set" %}{% else %}{% trans "no password" %}{% endif %} - - {% endif %} - -
- {% bootstrap_field user_form.username %} - {% if user_form.password %}{% bootstrap_field user_form.password %}{% endif %} -
-
{% bootstrap_field user_form.first_name %}
-
{% bootstrap_field user_form.last_name %}
+
+
+
+

{% trans "Role" %}

+

{% trans "What the user manages." %}

- {% bootstrap_field user_form.email %} - {% if edited_user %} -
- {% trans "Password" %}: {% if edited_user.has_usable_password %}{% trans "Set" %}{% else %}{% trans "Not set" %}{% endif %} - {% trans "Change password" %} +
+ {% trans "Uses the VMs given to them, within their quota." as user_help %} + {% trans "May change and delete the template VMs given to them." as editor_help %} + {% trans "Manages the panel: every permission, no quota." as superuser_help %} +
+ {% for choice in user_form.role %} +
+ +
+ {% endfor %} +
+ {% for error in user_form.role.errors %}
{{ error }}
{% endfor %}
- {% endif %}
-
+ - {% with quota=attributes_form.instance %} -
- - {% trans "Quota" %} - - {% if quota.max_instances == -1 %}{% trans "any number of VMs" %}{% else %}{% blocktrans count count=quota.max_instances %}{{ count }} VM{% plural %}{{ count }} VMs{% endblocktrans %}{% endif %} · - {% if quota.max_cpus == -1 %}{% trans "any vCPUs" %}{% else %}{% blocktrans count count=quota.max_cpus %}{{ count }} vCPU{% plural %}{{ count }} vCPUs{% endblocktrans %}{% endif %} · - {% if quota.max_memory == -1 %}{% trans "any memory" %}{% else %}{{ quota.max_memory }} MiB{% endif %} · - {% if quota.max_disk_size == -1 %}{% trans "any disk size" %}{% else %}{{ quota.max_disk_size }} GiB{% endif %} - - -
-

{% trans "For each limit: -1 means no limit, 0 none allowed." %}

-
-
{% bootstrap_field attributes_form.max_instances show_help=False %}
-
{% bootstrap_field attributes_form.max_cpus show_help=False %}
-
{% bootstrap_field attributes_form.max_memory show_help=False %}
-
{% bootstrap_field attributes_form.max_disk_size show_help=False %}
+ {# user_form.js hides the sections a superuser does not need while Superuser is chosen #} + {% with superuser=user_form.role.value %} +

+ {% trans "A superuser has every permission and no quota: there is nothing more to set." %} +

+ +
+
+
+

{% trans "Quota" %}

+

{% trans "The most the user's VMs may have in total." %}

+
+
+
+ {% for field, unlimited, unit in attributes_form.quota_rows %} +
+ +
+ + {% if unit %}{{ unit }}{% endif %} + {% for error in field.errors %}
{{ error }}
{% endfor %} +
+
+ + +
+
+ {% endfor %} +
-
+ + +
+
+
+

{% trans "Groups and permissions" %}

+

{% trans "The permissions of the user's groups apply too." %}

+
+
+
+ {% trans "Groups" %} +
+ {% for box in user_form.groups %} + + {% empty %} + {% trans "There are no groups yet." %} + {% endfor %} +
+ {% for error in user_form.groups.errors %}
{{ error }}
{% endfor %} +
+
+ {% trans "Own permissions" %} +

{% trans "Off grants nothing here; it takes away nothing a group grants." %}

+
+ {% for box, help in user_form.permission_rows %} +
+ + +
+ {% endfor %} +
+ {% for error in user_form.user_permissions.errors %}
{{ error }}
{% endfor %} +
+
+
+
{% endwith %} -
+
{% trans "Cancel" %} - +
{% endblock content %} + +{% block script %} + +{% endblock script %} diff --git a/admin/tests/test_audit_rows.py b/admin/tests/test_audit_rows.py index 7c67df07..203ec222 100644 --- a/admin/tests/test_audit_rows.py +++ b/admin/tests/test_audit_rows.py @@ -6,7 +6,7 @@ from django.urls import reverse from logs.models import Logs -ATTRIBUTES = {"max_instances": 2, "max_cpus": 2, "max_memory": 2048, "max_disk_size": 20} +ATTRIBUTES = {"role": "user", "max_instances": 2, "max_cpus": 2, "max_memory": 2, "max_disk_size": 20} def rows(): diff --git a/admin/tests/test_user_create.py b/admin/tests/test_user_create.py index 36837479..38a77d12 100644 --- a/admin/tests/test_user_create.py +++ b/admin/tests/test_user_create.py @@ -11,7 +11,7 @@ from computes.models import Compute from instances.models import Instance RAW = "Raw-Passw0rd-in-the-form" -LIMITS = {"max_instances": 1, "max_cpus": 1, "max_memory": 1024, "max_disk_size": 4} +LIMITS = {"role": "user", "max_instances": 1, "max_cpus": 1, "max_memory": 1, "max_disk_size": 4} class UserCreateTests(TestCase): diff --git a/admin/tests/test_user_pages.py b/admin/tests/test_user_pages.py index bbfd8ada..8e6861f6 100644 --- a/admin/tests/test_user_pages.py +++ b/admin/tests/test_user_pages.py @@ -22,8 +22,8 @@ class UserPagesTests(TestCase): return [str(m) for m in get_messages(response.wsgi_request)] def form_data(self, user, **changes): - data = {"username": user.username, "is_active": "on", "is_superuser": "on" if user.is_superuser else "", - "max_instances": "2", "max_cpus": "2", "max_memory": "2048", "max_disk_size": "20", **changes} + data = {"username": user.username, "is_active": "on", "role": "superuser" if user.is_superuser else "user", + "max_instances": "2", "max_cpus": "2", "max_memory": "2", "max_disk_size": "20", **changes} return {key: value for key, value in data.items() if value != ""} def test_an_administrator_cannot_block_delete_or_demote_themselves(self): @@ -31,7 +31,7 @@ class UserPagesTests(TestCase): for response in (self.client.post(reverse("admin:user_block", args=[own])), self.client.post(reverse("admin:user_delete", args=[own]))): self.assertIn("You cannot block, delete or demote your own account", self.messages(response)) - for change in ({"is_superuser": ""}, {"is_active": ""}): + for change in ({"role": "user"}, {"is_active": ""}): response = self.client.post(reverse("admin:user_update", args=[own]), self.form_data(self.admin, **change)) self.assertContains(response, "You cannot block, delete or demote your own account") self.admin.refresh_from_db() @@ -44,33 +44,62 @@ class UserPagesTests(TestCase): def test_the_form_tells_the_password_state_and_links_its_page(self): page = html.fromstring(self.client.get(reverse("admin:user_update", args=[self.alice.pk])).content) text = " ".join(page.text_content().split()) - self.assertIn("Password: Set Change password", text) + self.assertIn("Password Set Change password", text) self.assertNotIn("No password set", text) self.assertEqual(page.xpath("//a[normalize-space()='Change password']/@href"), [reverse("admin:user_update_password", args=[self.alice.pk])]) self.assertEqual(page.xpath("//a[@href='../password/']"), []) - def test_staff_and_quotas_say_what_they_mean(self): + def test_roles_say_what_they_mean(self): page = self.client.get(reverse("admin:user_update", args=[self.alice.pk])).content.decode() self.assertIn("Template editor", page) self.assertIn("May change and delete the template VMs given to them", page) + self.assertIn("Manages the panel: every permission, no quota.", page) self.assertNotIn("log into this admin site", page) - self.assertIn("Max memory (MiB)", page) - self.assertIn("Max disk size (GiB)", page) - self.assertIn("-1 means no limit, 0 none allowed", page) def test_a_refused_choice_is_said_beside_its_field(self): url = reverse("admin:user_update", args=[self.alice.pk]) response = self.client.post(url, {"username": "up-alice", "is_active": "on", "groups": "99999", "user_permissions": "99999", - "max_instances": 1, "max_cpus": 1, "max_memory": 1, "max_disk_size": 1}) + "role": "user", "max_instances": 1, "max_cpus": 1, "max_memory": 1, "max_disk_size": 1}) page = html.fromstring(response.content) self.assertEqual(len(page.xpath("//fieldset//div[contains(@class, 'invalid-feedback')]")), 2) - def test_the_folded_quota_says_what_it_allows(self): - UserAttributes.objects.filter(user=self.alice).update(max_instances=-1, max_cpus=1, max_memory=2048, max_disk_size=-1) + def test_the_quota_shows_no_limit_and_memory_in_gib(self): + UserAttributes.objects.filter(user=self.alice).update(max_instances=-1, max_cpus=1, max_memory=1536, max_disk_size=-1) page = html.fromstring(self.client.get(reverse("admin:user_update", args=[self.alice.pk])).content) - (summary,) = [s for s in page.xpath("//summary") if "Quota" in s.text_content()] - self.assertEqual(" ".join(summary.text_content().split()), "Quota any number of VMs · 1 vCPU · 2048 MiB · any disk size") + shown = {box.get("name"): (box.get("value"), box.get("disabled") is not None) for box in page.xpath("//input[@type='number']")} + self.assertEqual(shown, {"max_instances": ("", True), "max_cpus": ("1", False), "max_memory": ("1.5", False), + "max_disk_size": ("", True)}) + self.assertEqual(page.xpath("//input[@checked][@data-no-limit]/@name"), ["max_instances_unlimited", "max_disk_size_unlimited"]) + + def test_a_new_user_starts_with_the_default_quota(self): + page = html.fromstring(self.client.get(reverse("admin:user_create")).content) + shown = {box.get("name"): box.get("value") for box in page.xpath("//input[@type='number']")} + self.assertEqual(shown, {"max_instances": "2", "max_cpus": "2", "max_memory": "2", "max_disk_size": "20"}) + self.assertEqual(page.xpath("//input[@name='role'][@checked]/@value"), ["user"]) + + def test_no_limit_is_kept_as_minus_one_and_gib_as_mib(self): + response = self.client.post(reverse("admin:user_update", args=[self.alice.pk]), + self.form_data(self.alice, max_cpus_unlimited="on", max_memory="0.75")) + self.assertRedirects(response, reverse("admin:user_list")) + quota = UserAttributes.objects.get(user=self.alice) + self.assertEqual((quota.max_instances, quota.max_cpus, quota.max_memory, quota.max_disk_size), (2, -1, 768, 20)) + + def test_a_limit_needs_a_number_or_no_limit(self): + for value in ("", "-1"): + with self.subTest(value=value): + response = self.client.post(reverse("admin:user_update", args=[self.alice.pk]), + self.form_data(self.alice, max_cpus=value) | {"max_cpus": value}) + self.assertEqual(response.status_code, 200) + self.assertEqual(len(html.fromstring(response.content).xpath("//input[@name='max_cpus'][contains(@class, 'is-invalid')]")), 1) + + def test_a_role_sets_staff_and_superuser(self): + url = reverse("admin:user_update", args=[self.alice.pk]) + for role, flags in (("template_editor", (True, False)), ("superuser", (True, True)), ("user", (False, False))): + with self.subTest(role=role): + self.assertRedirects(self.client.post(url, self.form_data(self.alice, role=role)), reverse("admin:user_list")) + self.alice.refresh_from_db() + self.assertEqual((self.alice.is_staff, self.alice.is_superuser), flags) def test_a_missing_users_profile_is_not_found(self): self.assertEqual(self.client.get(reverse("accounts:account", args=[99999])).status_code, 404) diff --git a/admin/tests/test_user_update_next.py b/admin/tests/test_user_update_next.py index 42910a31..1a24c093 100644 --- a/admin/tests/test_user_update_next.py +++ b/admin/tests/test_user_update_next.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import User from django.test import TestCase from django.urls import reverse -LIMITS = {"max_instances": 1, "max_cpus": 1, "max_memory": 1024, "max_disk_size": 4} +LIMITS = {"role": "user", "max_instances": 1, "max_cpus": 1, "max_memory": 1, "max_disk_size": 4} class UserUpdateNextTests(TestCase): diff --git a/admin/tests/test_views.py b/admin/tests/test_views.py index 63ef9bca..741a16c0 100644 --- a/admin/tests/test_views.py +++ b/admin/tests/test_views.py @@ -89,9 +89,10 @@ class AdminTestCase(TestCase): { "username": "test", "password": "test", + "role": "user", "max_instances": 1, "max_cpus": 1, - "max_memory": 1024, + "max_memory": 1, # GiB "max_disk_size": 4, }, ) @@ -114,9 +115,10 @@ class AdminTestCase(TestCase): reverse("admin:user_update", args=[user_id]), { "username": "utest", + "role": "user", "max_instances": 2, "max_cpus": 2, - "max_memory": 2048, + "max_memory": 2, # GiB "max_disk_size": 8, }, ) diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index 6df6e5f4c187e11bf6cfef02fb247ed886ffca6f..d5d439cadb6d2bcb9bc318250c46d25164befdd9 100644 GIT binary patch delta 42799 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 Wh`9fpwlz=m{HX0CV&hNRaqT}(MAm@- delta 42642 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 diff --git a/locale/tr/LC_MESSAGES/django.po b/locale/tr/LC_MESSAGES/django.po index f7992ffe..f5cac007 100644 --- a/locale/tr/LC_MESSAGES/django.po +++ b/locale/tr/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-11-04 11:55+0000\n" +"POT-Creation-Date: 2026-11-04 19:19+0000\n" "PO-Revision-Date: 2020-11-04 12:00+0000\n" "Last-Translator: catborise , 2020\n" "Language-Team: Turkish (https://www.transifex.com/catborise/teams/110663/tr/)\n" @@ -99,8 +99,8 @@ msgstr "bir yıl içinde" #: accounts/forms.py:96 accounts/templates/account.html:29 #: accounts/templates/api_token_list.html:19 #: accounts/templates/api_token_list.html:20 accounts/templates/profile.html:25 -#: admin/templates/admin/user_form.html:16 -#: admin/templates/admin/user_list.html:58 +#: admin/templates/admin/user_form.html:31 +#: admin/templates/admin/user_list.html:56 #: operations/templates/operations/jobs.html:15 #: operations/templatetags/operations.py:91 msgid "never" @@ -163,27 +163,25 @@ msgid "User Profile" msgstr "Kullanıcı Profili" #: accounts/templates/account.html:17 accounts/templates/profile.html:18 -#: admin/templates/admin/user_form.html:47 -#: admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:32 +#: admin/forms.py:73 admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:30 msgid "Superuser" msgstr "Süperkullanıcı" #: accounts/templates/account.html:19 accounts/templates/profile.html:20 -#: admin/forms.py:94 admin/templates/admin/user_form.html:40 -#: admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:34 +#: admin/forms.py:73 admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:32 msgid "Template editor" msgstr "Şablon düzenleyici" -#: accounts/templates/account.html:21 admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:41 instances/states.py:12 +#: accounts/templates/account.html:21 admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:39 instances/states.py:12 msgid "Blocked" msgstr "Engelli" #: accounts/templates/account.html:29 accounts/templates/profile.html:25 -#: admin/templates/admin/user_form.html:16 -#: admin/templates/admin/user_list.html:58 +#: admin/templates/admin/user_form.html:31 +#: admin/templates/admin/user_list.html:56 msgid "Last login" msgstr "Son oturum" @@ -204,7 +202,7 @@ msgid "User sections" msgstr "Kullanıcı bölümleri" #: accounts/templates/account.html:44 accounts/templates/account.html:52 -#: computes/templates/computes/list.html:30 +#: admin/forms.py:189 computes/templates/computes/list.html:30 #: computes/templates/computes/list.html:57 computes/templates/overview.html:46 msgid "VMs" msgstr "Sanal makineler" @@ -266,7 +264,7 @@ msgstr "Parola Değiştir" #: accounts/templates/accounts/change_password_form.html:25 #: accounts/templates/accounts/email_otp_form.html:25 #: admin/templates/admin/group_form.html:46 -#: admin/templates/admin/user_form.html:137 +#: admin/templates/admin/user_form.html:169 #: computes/templates/computes/form.html:45 #: console/templates/console-vnc.html:86 #: instances/templates/add_instance_cdrom.html:38 @@ -357,7 +355,7 @@ msgid "Enter username" msgstr "Kullanıcı adını girin" #: accounts/templates/accounts/otp_login.html:37 -#: accounts/templates/login.html:36 admin/templates/admin/user_form.html:106 +#: accounts/templates/login.html:36 admin/templates/admin/user_form.html:41 #: console/templates/console-vnc.html:82 instances/forms.py:28 #: instances/templates/instances/access_tab.html:53 msgid "Password" @@ -431,8 +429,8 @@ msgstr "%(name)s API anahtarı için işlemler" #: accounts/templates/ssh_key_list.html:13 #: admin/templates/admin/group_list.html:44 #: admin/templates/admin/tombstone_list.html:42 +#: admin/templates/admin/user_list.html:74 #: admin/templates/admin/user_list.html:76 -#: admin/templates/admin/user_list.html:78 #: instances/templates/create_flavors.html:11 #: instances/templates/instances/settings_tab.html:251 #: instances/templates/instances/settings_tab.html:315 @@ -634,11 +632,11 @@ msgstr "OTP QR kodu %(user)s kullanıcısına gönderildi" msgid "User email not set, failed to send QR code" msgstr "Kullanıcı e-postası girilmemiş, QR kod gönderimi başarısız" -#: admin/forms.py:18 +#: admin/forms.py:20 msgid "Change their own password on their profile page" msgstr "Profil sayfasında kendi parolasını değiştirme" -#: admin/forms.py:19 +#: admin/forms.py:21 msgid "" "Clone the VMs they may change and the templates they may view, within their " "quota" @@ -646,46 +644,91 @@ msgstr "" "Kotası dahilinde, değiştirebildiği sanal makineleri ve görebildiği şablonları" " klonlama" -#: admin/forms.py:20 +#: admin/forms.py:22 msgid "Open a console without the VM's console password" msgstr "Sanal makinenin konsol parolası olmadan konsol aç" -#: admin/forms.py:21 +#: admin/forms.py:23 msgid "Take, revert and delete snapshots of the VMs they may change" msgstr "" "Değiştirebildiği sanal makinelerin anlık görüntülerini alma, geri yükleme ve " "silme" -#: admin/forms.py:22 +#: admin/forms.py:24 msgid "See every VM and host in the lists, read-only" msgstr "Listelerde tüm sanal makineleri ve sunucuları salt okunur görme" -#: admin/forms.py:70 +#: admin/forms.py:73 admin/templates/admin/logs.html:39 +#: admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:34 +#: computes/templates/computes/instances.html:46 +#: instances/templates/add_instance_owner_block.html:17 +#: instances/templates/instances/stats_tab.html:67 +#: operations/templates/operations/job.html:21 +#: operations/templates/operations/jobs.html:27 +#: operations/templates/operations/jobs.html:61 +msgid "User" +msgstr "Kullanıcı" + +#: admin/forms.py:80 msgid "Permissions" msgstr "İzinler" -#: admin/forms.py:77 admin/templates/admin/group_list.html:6 +#: admin/forms.py:87 admin/templates/admin/group_list.html:6 #: admin/templates/admin/group_list.html:8 #: admin/templates/admin/group_list.html:24 -#: admin/templates/admin/user_form.html:54 templates/navbar.html:33 +#: admin/templates/admin/user_form.html:133 templates/navbar.html:33 msgid "Groups" msgstr "Gruplar" -#: admin/forms.py:95 -msgid "May change and delete the template VMs given to them" -msgstr "Kendisine verilen şablon sanal makineleri değiştirebilir ve silebilir" - -#: admin/forms.py:121 +#: admin/forms.py:143 #, python-format msgid "NEW_USER_DEFAULT_INSTANCES: %(name)s is not exactly one VM" msgstr "" "NEW_USER_DEFAULT_INSTANCES: %(name)s tam olarak tek bir sanal makine değil" -#: admin/forms.py:169 +#: admin/forms.py:190 computes/templates/computes/list.html:58 +#: computes/templates/overview.html:58 instances/forms.py:15 +#: instances/templates/allinstances_index_grouped.html:16 +#: instances/templates/allinstances_index_nongrouped.html:14 +#: instances/templates/create_instance_w2.html:63 +#: instances/templates/instances/resize_tab.html:29 +#: instances/templates/instances/settings_tab.html:853 +msgid "vCPUs" +msgstr "vCPU" + +#: admin/forms.py:191 computes/templates/computes/instances.html:49 +#: computes/templates/computes/list.html:59 computes/templates/overview.html:66 +#: computes/templates/overview.html:150 +#: instances/templates/allinstances_index_grouped.html:17 +#: instances/templates/allinstances_index_nongrouped.html:15 +#: instances/templates/create_inst_block.html:33 +#: instances/templates/instance.html:60 +#: instances/templates/instances/resize_tab.html:17 +#: instances/templates/instances/stats_tab.html:34 +msgid "Memory" +msgstr "Bellek" + +#: admin/forms.py:192 instances/models.py:237 +#: instances/templates/create_instance_w2.html:118 +#: instances/templates/instances/settings_tab.html:25 +#: instances/templates/instances/stats_tab.html:51 +msgid "Disk" +msgstr "Disk" + +#: admin/forms.py:202 +msgid "No limit" +msgstr "Sınır yok" + +#: admin/forms.py:216 +msgid "Enter a limit or choose No limit." +msgstr "Bir sınır girin ya da Sınır yok'u seçin." + +#: admin/forms.py:228 msgid "The user must change it at their next login" msgstr "Kullanıcı bir sonraki girişinde onu değiştirmek zorundadır" -#: admin/forms.py:179 +#: admin/forms.py:238 msgid "A user without a password cannot be made to change it" msgstr "Parolası olmayan bir kullanıcıya parola değiştirme zorunluluğu konamaz" @@ -704,7 +747,6 @@ msgid "Members" msgstr "Üyeler" #: admin/templates/admin/group_form.html:47 -#: admin/templates/admin/user_form.html:138 #: computes/templates/computes/form.html:46 #: instances/templates/instances/edit_instance_volume.html:112 #: instances/templates/instances/nic_qos_form.html:23 @@ -723,14 +765,14 @@ msgid "New group" msgstr "Yeni grup" #: admin/templates/admin/group_list.html:19 -#: admin/templates/admin/user_form.html:62 +#: admin/templates/admin/user_form.html:141 msgid "There are no groups yet." msgstr "Henüz grup yok." #: admin/templates/admin/group_list.html:25 admin/templates/admin/logs.html:20 #: admin/templates/admin/logs.html:26 #: admin/templates/admin/tombstone_list.html:20 -#: admin/templates/admin/user_list.html:21 +#: admin/templates/admin/user_list.html:20 #: instances/templates/allinstances.html:11 networks/templates/network.html:130 #: nodedevs/templates/nodedevs.html:22 nwfilters/templates/nwfilters.html:23 #: templates/search_block.html:3 virtsecrets/templates/secrets.html:23 @@ -756,7 +798,7 @@ msgstr[0] "%(count)s izin" msgstr[1] "%(count)s izin" #: admin/templates/admin/group_list.html:40 -#: admin/templates/admin/user_list.html:63 +#: admin/templates/admin/user_list.html:61 #: instances/templates/instances/edit_instance_volume.html:3 #: instances/templates/instances/settings_tab.html:309 #: networks/templates/network.html:159 networks/templates/network.html:301 @@ -764,7 +806,7 @@ msgid "Edit" msgstr "Düzenle" #: admin/templates/admin/group_list.html:42 -#: admin/templates/admin/user_list.html:65 +#: admin/templates/admin/user_list.html:63 #, python-format msgid "More actions for %(name)s" msgstr "%(name)s için diğer işlemler" @@ -808,17 +850,6 @@ msgstr "Henüz log satırı yok." msgid "Date (%(time_zone)s)" msgstr "Tarih (%(time_zone)s)" -#: admin/templates/admin/logs.html:39 admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:36 -#: computes/templates/computes/instances.html:46 -#: instances/templates/add_instance_owner_block.html:17 -#: instances/templates/instances/stats_tab.html:67 -#: operations/templates/operations/job.html:21 -#: operations/templates/operations/jobs.html:27 -#: operations/templates/operations/jobs.html:61 -msgid "User" -msgstr "Kullanıcı" - #: admin/templates/admin/logs.html:41 instances/templates/instance.html:8 msgid "Instance" msgstr "Sanal Makine" @@ -837,16 +868,16 @@ msgstr "Sonuç" msgid "IP" msgstr "IP" -#: admin/templates/admin/logs.html:56 admin/views.py:285 instances/states.py:19 +#: admin/templates/admin/logs.html:56 admin/views.py:291 instances/states.py:19 #: logs/views.py:17 msgid "Unknown" msgstr "Bilinmeyen" -#: admin/templates/admin/logs.html:56 admin/views.py:285 logs/views.py:17 +#: admin/templates/admin/logs.html:56 admin/views.py:291 logs/views.py:17 msgid "Done" msgstr "Tamamlandı" -#: admin/templates/admin/logs.html:56 admin/views.py:285 logs/views.py:17 +#: admin/templates/admin/logs.html:56 admin/views.py:291 logs/views.py:17 #: operations/templates/operations/job.html:107 msgid "Failed" msgstr "Başarısız" @@ -898,122 +929,110 @@ msgstr "sona erer" msgid "No removed VM matches the search." msgstr "Aramayla eşleşen kaldırılmış sanal makine yok." -#: admin/templates/admin/user_form.html:27 -msgid "Active: may sign in" -msgstr "Etkin: oturum açabilir" +#: admin/templates/admin/user_form.html:29 +msgid "Account" +msgstr "Hesap" -#: admin/templates/admin/user_form.html:28 +#: admin/templates/admin/user_form.html:33 +msgid "What the user signs in with." +msgstr "Kullanıcının oturum açtığı bilgiler." + +#: admin/templates/admin/user_form.html:43 +msgid "Set" +msgstr "Ayarla" + +#: admin/templates/admin/user_form.html:43 +msgid "Not set" +msgstr "Ayarlanmadı" + +#: admin/templates/admin/user_form.html:44 +msgid "Change password" +msgstr "Parolayı değiştir" + +#: admin/templates/admin/user_form.html:57 +msgid "May sign in" +msgstr "Oturum açabilir" + +#: admin/templates/admin/user_form.html:58 msgid "Turn off to block the user while keeping the account." msgstr "Hesabı koruyarak kullanıcıyı engellemek için kapatın." -#: admin/templates/admin/user_form.html:32 -#, python-format -msgid "What can %(name)s do?" -msgstr "%(name)s neler yapabilir?" +#: admin/templates/admin/user_form.html:67 +msgid "Role" +msgstr "Rol" -#: admin/templates/admin/user_form.html:32 -msgid "What can the user do?" -msgstr "Kullanıcı neler yapabilir?" +#: admin/templates/admin/user_form.html:68 +msgid "What the user manages." +msgstr "Kullanıcının neyi yönettiği." -#: admin/templates/admin/user_form.html:34 -msgid "The permissions of the user's groups apply too." -msgstr "Kullanıcının gruplarının izinleri de geçerlidir." +#: admin/templates/admin/user_form.html:71 +msgid "Uses the VMs given to them, within their quota." +msgstr "Kotası dahilinde kendisine verilen sanal makineleri kullanır." -#: admin/templates/admin/user_form.html:41 +#: admin/templates/admin/user_form.html:72 msgid "May change and delete the template VMs given to them." msgstr "Kendisine verilen şablon sanal makineleri değiştirebilir ve silebilir." -#: admin/templates/admin/user_form.html:48 -msgid "Has every permission and manages the panel, whatever is chosen below." -msgstr "Aşağıda ne seçilirse seçilsin tüm izinlere sahiptir ve paneli yönetir." +#: admin/templates/admin/user_form.html:73 +msgid "Manages the panel: every permission, no quota." +msgstr "Paneli yönetir: tüm izinler, kota yok." -#: admin/templates/admin/user_form.html:69 +#: admin/templates/admin/user_form.html:93 +msgid "" +"A superuser has every permission and no quota: there is nothing more to set." +msgstr "" +"Süperkullanıcının tüm izinleri vardır ve kotası yoktur: ayarlanacak başka bir" +" şey yok." + +#: admin/templates/admin/user_form.html:99 +msgid "Quota" +msgstr "Kota" + +#: admin/templates/admin/user_form.html:100 +msgid "The most the user's VMs may have in total." +msgstr "Kullanıcının sanal makinelerinin toplamda alabileceği en fazla kaynak." + +#: admin/templates/admin/user_form.html:128 +msgid "Groups and permissions" +msgstr "Gruplar ve izinler" + +#: admin/templates/admin/user_form.html:129 +msgid "The permissions of the user's groups apply too." +msgstr "Kullanıcının gruplarının izinleri de geçerlidir." + +#: admin/templates/admin/user_form.html:147 msgid "Own permissions" msgstr "Kendi izinleri" -#: admin/templates/admin/user_form.html:70 +#: admin/templates/admin/user_form.html:148 msgid "Off grants nothing here; it takes away nothing a group grants." msgstr "" "Kapalı olması burada hiçbir şey vermez; bir grubun verdiği hiçbir şeyi de " "geri almaz." -#: admin/templates/admin/user_form.html:88 -msgid "Name and password" -msgstr "Ad ve parola" +#: admin/templates/admin/user_form.html:170 +msgid "Save changes" +msgstr "Değişiklikleri kaydet" -#: admin/templates/admin/user_form.html:92 -msgid "password set" -msgstr "parola ayarlı" +#: admin/templates/admin/user_form.html:170 +msgid "Create user" +msgstr "Kullanıcı oluştur" -#: admin/templates/admin/user_form.html:92 -msgid "no password" -msgstr "parola yok" - -#: admin/templates/admin/user_form.html:106 -msgid "Set" -msgstr "Ayarla" - -#: admin/templates/admin/user_form.html:106 -msgid "Not set" -msgstr "Ayarlanmadı" - -#: admin/templates/admin/user_form.html:107 -msgid "Change password" -msgstr "Parolayı değiştir" - -#: admin/templates/admin/user_form.html:116 -msgid "Quota" -msgstr "Kota" - -#: admin/templates/admin/user_form.html:118 -msgid "any number of VMs" -msgstr "sınırsız sayıda sanal makine" - -#: admin/templates/admin/user_form.html:118 -#, python-format -msgid "%(count)s VM" -msgid_plural "%(count)s VMs" -msgstr[0] "%(count)s sanal makine" -msgstr[1] "%(count)s sanal makine" - -#: admin/templates/admin/user_form.html:119 -msgid "any vCPUs" -msgstr "sınırsız vCPU" - -#: admin/templates/admin/user_form.html:119 -#, python-format -msgid "%(count)s vCPU" -msgid_plural "%(count)s vCPUs" -msgstr[0] "%(count)s vCPU" -msgstr[1] "%(count)s vCPU" - -#: admin/templates/admin/user_form.html:120 -msgid "any memory" -msgstr "sınırsız bellek" - -#: admin/templates/admin/user_form.html:121 -msgid "any disk size" -msgstr "sınırsız disk boyutu" - -#: admin/templates/admin/user_form.html:125 -msgid "For each limit: -1 means no limit, 0 none allowed." -msgstr "Her sınır için: -1 sınır yok, 0 hiç izin yok demektir." - -#: admin/templates/admin/user_list.html:13 +#: admin/templates/admin/user_list.html:12 msgid "New user" msgstr "Yeni kullanıcı" -#: admin/templates/admin/user_list.html:20 admin/views.py:116 +#: admin/templates/admin/user_list.html:19 admin/views.py:122 #: instances/templates/instances/settings_tab.html:79 templates/navbar.html:32 msgid "Users" msgstr "Kullanıcılar" -#: admin/templates/admin/user_list.html:21 +#: admin/templates/admin/user_list.html:20 msgid "Search users" msgstr "Kullanıcı ara" -#: admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:39 instances/states.py:11 +#: admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:37 instances/states.py:11 #: instances/templates/instances/power_tab.html:19 #: instances/templates/instances/power_tab.html:21 #: interfaces/templates/interface.html:49 networks/templates/network.html:53 @@ -1022,34 +1041,34 @@ msgstr "Kullanıcı ara" msgid "Active" msgstr "Aktif" -#: admin/templates/admin/user_list.html:49 +#: admin/templates/admin/user_list.html:47 msgid "Can clone" msgstr "Klonlayabilir" -#: admin/templates/admin/user_list.html:51 +#: admin/templates/admin/user_list.html:49 #, python-format msgid "%(count)s API token" msgid_plural "%(count)s API tokens" msgstr[0] "%(count)s API anahtarı" msgstr[1] "%(count)s API anahtarı" -#: admin/templates/admin/user_list.html:54 +#: admin/templates/admin/user_list.html:52 msgid "No groups or API tokens" msgstr "Grup veya API anahtarı yok" -#: admin/templates/admin/user_list.html:67 +#: admin/templates/admin/user_list.html:65 msgid "View profile" msgstr "Profili görüntüle" -#: admin/templates/admin/user_list.html:71 +#: admin/templates/admin/user_list.html:69 msgid "Block" msgstr "Engelle" -#: admin/templates/admin/user_list.html:71 +#: admin/templates/admin/user_list.html:69 msgid "Unblock" msgstr "Engeli Kaldır" -#: admin/templates/admin/user_list.html:88 +#: admin/templates/admin/user_list.html:86 msgid "No user matches the search." msgstr "Aramayla eşleşen kullanıcı yok." @@ -1069,39 +1088,39 @@ msgstr "Üyeleri kalır ancak grubun onlara verdiği izinleri kaybeder." msgid "You cannot block, delete or demote your own account" msgstr "Kendi hesabınızı engelleyemez, silemez veya yetkisini düşüremezsiniz" -#: admin/views.py:141 +#: admin/views.py:147 msgid "Create User" msgstr "Kullanıcı Oluştur" -#: admin/views.py:182 +#: admin/views.py:188 msgid "Update User" msgstr "Kullanıcı Güncelle" -#: admin/views.py:203 +#: admin/views.py:209 #, python-format msgid "Password changed for %(user)s" msgstr "%(user)s parolası değiştirildi" -#: admin/views.py:207 +#: admin/views.py:213 msgid "Wrong Data Provided" msgstr "Hatalı Veri" -#: admin/views.py:236 +#: admin/views.py:242 msgid "Their access to VMs, SSH keys and settings go; the VMs themselves stay." msgstr "" "Sanal makinelere erişimi, SSH anahtarları ve ayarları silinir; sanal " "makinelerin kendisi kalır." -#: admin/views.py:331 +#: admin/views.py:337 msgid "deleted user" msgstr "silinmiş kullanıcı" -#: admin/views.py:342 +#: admin/views.py:348 #, python-format msgid "Removed VM %(name)s deleted" msgstr "Kaldırılan sanal makine %(name)s silindi" -#: admin/views.py:349 +#: admin/views.py:355 msgid "Its owners no longer get the VM back if its UUID shows up again." msgstr "" "UUID'si yeniden görünse bile sahipleri sanal makineyi artık geri almaz." @@ -2059,18 +2078,6 @@ msgstr "Durum" msgid "VCPU" msgstr "VCPU" -#: computes/templates/computes/instances.html:49 -#: computes/templates/computes/list.html:59 computes/templates/overview.html:66 -#: computes/templates/overview.html:150 -#: instances/templates/allinstances_index_grouped.html:17 -#: instances/templates/allinstances_index_nongrouped.html:15 -#: instances/templates/create_inst_block.html:33 -#: instances/templates/instance.html:60 -#: instances/templates/instances/resize_tab.html:17 -#: instances/templates/instances/stats_tab.html:34 -msgid "Memory" -msgstr "Bellek" - #: computes/templates/computes/instances.html:50 #: computes/templates/computes/list.html:60 #: instances/templates/allinstances_index_grouped.html:18 @@ -2118,15 +2125,6 @@ msgstr "Atanan bellek" msgid "of %(memory)s" msgstr "/ %(memory)s" -#: computes/templates/computes/list.html:58 computes/templates/overview.html:58 -#: instances/forms.py:15 instances/templates/allinstances_index_grouped.html:16 -#: instances/templates/allinstances_index_nongrouped.html:14 -#: instances/templates/create_instance_w2.html:63 -#: instances/templates/instances/resize_tab.html:29 -#: instances/templates/instances/settings_tab.html:853 -msgid "vCPUs" -msgstr "vCPU" - #: computes/templates/computes/list.html:71 computes/templates/overview.html:19 #: console/templates/console-vnc.html:13 #: console/templates/console-xterm.html:16 @@ -2322,7 +2320,7 @@ msgstr "" "Sunucudaki /etc/default/webvirt-gstfsd içindeki GSTFSD_KEY değerinin 64 " "onaltılık karakterini girin" -#: computes/views.py:197 +#: computes/views.py:199 #, python-format msgid "" "Its VMs keep running on the host and leave the panel; their owners are kept " @@ -2709,7 +2707,7 @@ msgstr "" msgid "Delete snapshot" msgstr "Anlık görüntüyü sil" -#: instances/jobs.py:304 vrtManager/instance.py:2281 +#: instances/jobs.py:304 vrtManager/instance.py:2286 #, python-format msgid "The VM has no external snapshot named %(name)s" msgstr "Sanal makinede %(name)s adında harici anlık görüntü yok" @@ -2744,7 +2742,7 @@ msgstr "Sanal makine artık işin çalıştığı sunucuda değil" msgid "Take snapshot" msgstr "Anlık görüntü al" -#: instances/jobs.py:372 vrtManager/instance.py:1877 +#: instances/jobs.py:372 vrtManager/instance.py:1882 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "%(name)s adında bir anlık görüntü zaten var" @@ -2869,7 +2867,7 @@ msgstr "" msgid "Create VM" msgstr "Sanal makine oluştur" -#: instances/jobs.py:746 instances/views.py:2469 +#: instances/jobs.py:746 instances/views.py:2468 msgid "A virtual machine with this name already exists" msgstr "Bu isimde bir sanal makine mevcut" @@ -2919,7 +2917,7 @@ msgstr "cloud-init tohumu, disk için bir dizin depolama havuzu gerektirir" msgid "This host offers no firmware %(firmware)s" msgstr "Bu sunucu %(firmware)s firmware'ini sunmuyor" -#: instances/jobs.py:775 vrtManager/instance.py:3000 +#: instances/jobs.py:775 vrtManager/instance.py:3005 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "Bu sunucu TPM 2.0 sunmuyor: üzerine swtpm kurun" @@ -3034,12 +3032,6 @@ msgstr "oluşturuldu" msgid "drbd" msgstr "drbd" -#: instances/models.py:237 instances/templates/create_instance_w2.html:118 -#: instances/templates/instances/settings_tab.html:25 -#: instances/templates/instances/stats_tab.html:51 -msgid "Disk" -msgstr "Disk" - #: instances/models.py:239 instances/templates/create_instance_w2.html:312 #: instances/templates/instances/settings_tab.html:159 msgid "CD-ROM" @@ -3235,7 +3227,7 @@ msgid "Disk source" msgstr "Disk kaynağı" #: instances/templates/add_instance_volume.html:21 -#: instances/templates/create_instance_w2.html:134 instances/views.py:2488 +#: instances/templates/create_instance_w2.html:134 instances/views.py:2487 msgid "New disk" msgstr "Yeni disk" @@ -3607,7 +3599,7 @@ msgstr "Özel CPU modelleri" msgid "Size (GiB)" msgstr "Boyut (GiB)" -#: instances/templates/create_instance_w2.html:161 instances/views.py:2489 +#: instances/templates/create_instance_w2.html:161 instances/views.py:2488 msgid "Existing volumes" msgstr "Mevcut birimler" @@ -3643,7 +3635,7 @@ msgstr "Aygıt" msgid "Remove" msgstr "Kaldır" -#: instances/templates/create_instance_w2.html:194 instances/views.py:2490 +#: instances/templates/create_instance_w2.html:194 instances/views.py:2489 msgid "Clone from template" msgstr "Şablondan klonla" @@ -5793,51 +5785,51 @@ msgstr "%(quota)s (%(total)s > %(limit)s)" msgid "None available device name" msgstr "Hiçbiri uygun aygıt adı değil" -#: instances/utils.py:378 +#: instances/utils.py:392 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(address)s üzerinden %(hostname)s" -#: instances/utils.py:417 +#: instances/utils.py:431 msgid "Invalid MAC address" msgstr "Geçersiz MAC adresi" -#: instances/utils.py:419 +#: instances/utils.py:433 msgid "More MAC addresses than networks" msgstr "Ağlardan daha fazla MAC adresi" -#: instances/views.py:167 +#: instances/views.py:170 msgid "Enter an IP address, a network such as 192.0.2.0/24, or a MAC address." msgstr "Bir IP adresi, 192.0.2.0/24 gibi bir ağ ya da bir MAC adresi girin." -#: instances/views.py:173 instances/views.py:207 +#: instances/views.py:176 instances/views.py:210 msgid "Too many searches are still running; try again shortly." msgstr "Çok fazla arama hâlâ çalışıyor; birazdan yeniden deneyin." -#: instances/views.py:253 +#: instances/views.py:256 #, python-format msgid "The host %(host)s of '%(name)s' cannot be reached: %(error)s" msgstr "'%(name)s' sanal makinesinin sunucusu %(host)s erişilemiyor: %(error)s" -#: instances/views.py:259 +#: instances/views.py:262 #, python-format msgid "The host of '%(name)s' cannot be reached right now." msgstr "'%(name)s' sanal makinesinin sunucusuna şu anda erişilemiyor." -#: instances/views.py:260 +#: instances/views.py:263 msgid " Jobs on it can be followed under Jobs in the menu." msgstr " Üzerindeki işler menüdeki İşler bölümünden izlenebilir." -#: instances/views.py:362 +#: instances/views.py:365 msgid "There is no other host to migrate to." msgstr "Taşınacak başka bir sunucu yok." -#: instances/views.py:364 +#: instances/views.py:367 msgid "A VM migrates when it is running, paused or shut off." msgstr "" "Sanal makine çalışırken, duraklatılmışken ya da kapalıyken taşınabilir." -#: instances/views.py:366 +#: instances/views.py:369 msgid "" "A VM with snapshots cannot be migrated: its snapshots stay on this host. " "Delete them first." @@ -5845,7 +5837,7 @@ msgstr "" "Anlık görüntüsü olan bir sanal makine taşınamaz: anlık görüntüleri bu " "sunucuda kalır. Önce onları silin." -#: instances/views.py:368 +#: instances/views.py:371 msgid "" "A VM with host devices cannot be migrated: the destination may not have them." " Remove them first." @@ -5853,11 +5845,11 @@ msgstr "" "Sunucu aygıtları olan bir sanal makine taşınamaz: hedefte bu aygıtlar " "olmayabilir. Önce onları kaldırın." -#: instances/views.py:634 +#: instances/views.py:633 msgid "The VM was moved meanwhile; try again." msgstr "Sanal makine bu arada taşındı; yeniden deneyin." -#: instances/views.py:746 +#: instances/views.py:745 msgid "" "The running VM has no free PCI slot for another disk on this bus: choose the " "scsi bus if the VM has a SCSI controller, or shut the VM down and add the " @@ -5870,7 +5862,7 @@ msgstr "" "yuvaları ekle, sonraki başlatmadan itibaren ona boş yuvalar verir. Yeni bir " "birim havuzunda kalır, mevcut birim olarak eklenebilir." -#: instances/views.py:750 +#: instances/views.py:749 msgid "" "The running VM has no free PCI slot for the SCSI controller the disk needs: " "shut the VM down and add the disk then; Add PCIe slots on the Disks tab gives" @@ -5882,186 +5874,186 @@ msgstr "" "PCIe yuvaları ekle, sonraki başlatmadan itibaren ona boş yuvalar verir. Yeni " "bir birim havuzunda kalır, mevcut birim olarak eklenebilir." -#: instances/views.py:768 +#: instances/views.py:767 #, python-format msgid "Invalid disk options: %(options)s" msgstr "Geçersiz disk seçenekleri: %(options)s" -#: instances/views.py:778 instances/views.py:793 +#: instances/views.py:777 instances/views.py:792 msgid "Templates cannot be started." msgstr "Şablon makineler başlatılamaz." -#: instances/views.py:889 +#: instances/views.py:888 #, python-format msgid "Disk %(path)s was kept: a disk file that stays needs it" msgstr "%(path)s diski korundu: kalan bir disk dosyası ona ihtiyaç duyuyor" -#: instances/views.py:895 +#: instances/views.py:894 #, python-format msgid "The VM is removed, but disk %(path)s was not deleted: %(err)s" msgstr "Sanal makine kaldırıldı, ancak %(path)s diski silinmedi: %(err)s" -#: instances/views.py:904 +#: instances/views.py:903 #, python-format msgid "Disk %(path)s is used by another VM and was kept" msgstr "" "%(path)s diski başka bir sanal makine tarafından kullanılıyor ve korundu" -#: instances/views.py:1026 +#: instances/views.py:1025 #, python-format msgid "Set the gstfsd key of %(compute)s first (Computes, edit the host)" msgstr "" "Önce %(compute)s sunucusunun gstfsd anahtarını ayarlayın (Sunucular, sunucuyu" " düzenle)" -#: instances/views.py:1032 instances/views.py:1046 instances/views.py:1055 +#: instances/views.py:1031 instances/views.py:1045 instances/views.py:1054 #, python-format msgid "gstfsd error: %(err)s" msgstr "gstfsd hatası: %(err)s" -#: instances/views.py:1056 +#: instances/views.py:1055 msgid "the reply is not signed with the key" msgstr "yanıt anahtarla imzalanmamış" -#: instances/views.py:1064 +#: instances/views.py:1063 msgid "Shut the VM down, or start its QEMU guest agent, and try again" msgstr "" "Sanal makineyi kapatın ya da QEMU konuk ajanını başlatın ve yeniden deneyin" -#: instances/views.py:1077 +#: instances/views.py:1076 msgid "The change may still be made when the agent answers again." msgstr "Ajan yeniden yanıt verdiğinde değişiklik yine de yapılabilir." -#: instances/views.py:1104 +#: instances/views.py:1103 msgid "Reset root password" msgstr "Root parolasını sıfırla" -#: instances/views.py:1108 +#: instances/views.py:1107 msgid "Enter a password" msgstr "Bir parola girin" -#: instances/views.py:1122 +#: instances/views.py:1121 msgid "Select an SSH public key" msgstr "Bir SSH açık anahtarı seçin" -#: instances/views.py:1144 +#: instances/views.py:1143 #, python-format msgid "Installed new SSH public key %(keyname)s" msgstr "Yeni %(keyname)s SSH açık anahtarı yüklendi" -#: instances/views.py:1164 +#: instances/views.py:1163 msgid "Enter a whole number of vCPUs" msgstr "vCPU sayısı için bir tam sayı girin" -#: instances/views.py:1168 +#: instances/views.py:1167 msgid "Shut off the VM to change its vCPUs" msgstr "vCPU'larını değiştirmek için sanal makineyi kapatın" -#: instances/views.py:1171 +#: instances/views.py:1170 msgid "The current vCPUs cannot be more than the maximum" msgstr "Geçerli vCPU sayısı en fazla değerden büyük olamaz" -#: instances/views.py:1178 +#: instances/views.py:1177 #, python-format msgid "%(quota)s: cannot resize the CPU of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' CPU'su yeniden boyutlandırılamıyor." -#: instances/views.py:1186 +#: instances/views.py:1185 #, python-format msgid "vCPUs set to %(cur)s (maximum %(max)s)" msgstr "vCPU sayısı %(cur)s olarak ayarlandı (en fazla %(max)s)" -#: instances/views.py:1205 +#: instances/views.py:1204 msgid "Enter a whole number for memory" msgstr "Bellek için bir tam sayı girin" -#: instances/views.py:1208 +#: instances/views.py:1207 msgid "The current memory cannot be more than the maximum" msgstr "Geçerli bellek en fazla değerden büyük olamaz" -#: instances/views.py:1212 +#: instances/views.py:1211 #, python-format msgid "%(quota)s: cannot resize the memory of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' belleği yeniden boyutlandırılamıyor." -#: instances/views.py:1218 +#: instances/views.py:1217 #, python-format msgid "Memory set to %(cur)s MiB (maximum %(max)s MiB)" msgstr "Bellek %(cur)s MiB olarak ayarlandı (en fazla %(max)s MiB)" -#: instances/views.py:1238 +#: instances/views.py:1237 msgid "Enter disk sizes as whole GiB" msgstr "Disk boyutlarını tam GiB olarak girin" -#: instances/views.py:1242 +#: instances/views.py:1241 #, python-format msgid "%(dev)s is %(size)s: a disk cannot shrink" msgstr "%(dev)s boyutu %(size)s: disk küçültülemez" -#: instances/views.py:1250 +#: instances/views.py:1249 msgid "No disks were selected or valid for resizing." msgstr "Boyutlandırma için seçilmiş ya da geçerli disk yok." -#: instances/views.py:1259 +#: instances/views.py:1258 #, python-format msgid "%(quota)s: cannot resize the disks of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' diskleri yeniden boyutlandırılamıyor." -#: instances/views.py:1271 +#: instances/views.py:1270 #, python-format msgid "The storage pool of %(dev)s cannot resize its volumes" msgstr "%(dev)s diskinin depolama havuzu birimlerini boyutlandıramaz" -#: instances/views.py:1273 +#: instances/views.py:1272 #, python-format msgid "Disk is resized: %(dev)s" msgstr "Disk boyutu değiştirildi: %(dev)s" -#: instances/views.py:1367 +#: instances/views.py:1366 msgid "The VM's machine has no PCIe slots to add" msgstr "Sanal makinenin makine tipinde eklenecek PCIe yuvası yok" -#: instances/views.py:1372 +#: instances/views.py:1371 #, python-format msgid "%(count)s PCIe slots added" msgstr "%(count)s PCIe yuvası eklendi" -#: instances/views.py:1374 +#: instances/views.py:1373 #, python-format msgid "%(count)s PCIe slots added: the VM gets them at its next start" msgstr "" "%(count)s PCIe yuvası eklendi: sanal makine bunları sonraki başlatmasında " "alır" -#: instances/views.py:1505 +#: instances/views.py:1504 msgid "Volume changes are applied. But it will be activated after shutdown" msgstr "" "Birim değişiklikleri uygulandı. Ama yeniden başlatıldıktan sonra uygulanacak" -#: instances/views.py:1510 +#: instances/views.py:1509 msgid "Volume is changed successfully." msgstr "Birim başarıyla değiştirildi." -#: instances/views.py:1528 +#: instances/views.py:1527 #, python-format msgid "Disk %(dev)s is not a storage volume of this instance" msgstr "%(dev)s diski bu sanal makinenin bir depolama birimi değil" -#: instances/views.py:1535 +#: instances/views.py:1534 #, python-format msgid "Disk %(dev)s has a pending change; delete it once the VM is shut down" msgstr "" "%(dev)s diskinin bekleyen bir değişikliği var; sanal makine kapatıldığında " "silin" -#: instances/views.py:1550 +#: instances/views.py:1549 #, python-format msgid "Volume %(vol)s is used by another VM; detach it instead" msgstr "" "%(vol)s birimi başka bir sanal makine tarafından kullanılıyor; onun yerine " "ayırın" -#: instances/views.py:1562 +#: instances/views.py:1561 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " @@ -6070,57 +6062,57 @@ msgstr "" "Konuk sistem %(dev)s diskini henüz bırakmadı; %(vol)s birimi korundu. Sanal " "makine kapatıldığında depolama havuzundan silin." -#: instances/views.py:1573 +#: instances/views.py:1572 #, python-format msgid "Disk %(dev)s was detached, but its volume was kept: %(err)s" msgstr "%(dev)s diski ayrıldı, ancak birimi korundu: %(err)s" -#: instances/views.py:1599 +#: instances/views.py:1598 #, python-format msgid "This VM cannot take a CD-ROM on the %(bus)s bus now" msgstr "Bu sanal makineye şu anda %(bus)s veri yolunda CD-ROM eklenemez" -#: instances/views.py:1602 +#: instances/views.py:1601 msgid "A USB CD-ROM needs an ISO image: libvirt has no empty USB drive" msgstr "USB CD-ROM bir ISO imajı ister: libvirt boş USB sürücü desteklemiyor" -#: instances/views.py:1683 +#: instances/views.py:1682 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "%(pool)s havuzu yeniden okunamadı: %(err)s" -#: instances/views.py:1704 +#: instances/views.py:1703 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "Anlık görüntü silinmedi: %(err)s" -#: instances/views.py:1819 +#: instances/views.py:1818 msgid "Add at least one device to the boot order." msgstr "Ön yükleme sırasına en az bir aygıt ekleyin." -#: instances/views.py:1833 +#: instances/views.py:1832 msgid "Boot order changed. It applies at the next start." msgstr "Ön yükleme sırası değiştirildi. Sonraki başlatmada uygulanır." -#: instances/views.py:1835 +#: instances/views.py:1834 msgid "Boot order changed successfully." msgstr "Ön yükleme sırası başarıyla değiştirildi." -#: instances/views.py:1855 +#: instances/views.py:1854 msgid "The XML is empty" msgstr "XML boş" -#: instances/views.py:1859 instances/views.py:2479 +#: instances/views.py:1858 instances/views.py:2478 #, python-format msgid "The XML is not well-formed: %(error)s" msgstr "XML düzgün biçimlendirilmemiş: %(error)s" -#: instances/views.py:1861 +#: instances/views.py:1860 #, python-format msgid "The XML must keep the VM's UUID %(uuid)s." msgstr "XML, sanal makinenin %(uuid)s UUID'sini korumalıdır." -#: instances/views.py:1865 +#: instances/views.py:1864 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." @@ -6128,35 +6120,35 @@ msgstr "" "Düzenleyici açıldığından beri tanım değişti. Geçerli tanımı düzenlemek için " "sayfayı yeniden yükleyin." -#: instances/views.py:1877 +#: instances/views.py:1876 msgid "The XML definition was saved." msgstr "XML tanımı kaydedildi." -#: instances/views.py:1879 +#: instances/views.py:1878 msgid "The XML definition was saved; the VM uses it from its next start." msgstr "" "XML tanımı kaydedildi; sanal makine onu sonraki başlatmasından itibaren " "kullanır." -#: instances/views.py:1960 +#: instances/views.py:1959 msgid "Select one network interface to change" msgstr "Değiştirilecek bir ağ arabirimi seçin" -#: instances/views.py:1998 +#: instances/views.py:1997 msgid "Network Device Config is changed. Please shutdown instance to activate." msgstr "" "Ağ aygıtı yapılandırması değiştirildi. Aktifleştirmek için lütfen sanal " "makineyi kapatın." -#: instances/views.py:2000 +#: instances/views.py:1999 msgid "Network device changed" msgstr "Ağ aygıtı değiştirildi" -#: instances/views.py:2012 +#: instances/views.py:2011 msgid "No network selected" msgstr "Ağ seçilmedi" -#: instances/views.py:2032 +#: instances/views.py:2031 msgid "" "The running VM has no free PCI slot for another network device: shut it down " "and add the device then; Add PCIe slots on the Disks tab gives it free ones " @@ -6166,21 +6158,21 @@ msgstr "" "aygıtı sonra ekleyin; Diskler sekmesindeki PCIe yuvaları ekle, sonraki " "başlatmadan itibaren ona boş yuvalar verir." -#: instances/views.py:2073 instances/views.py:2079 +#: instances/views.py:2072 instances/views.py:2078 msgid "The VM has it" msgstr "Sanal makinede var" -#: instances/views.py:2110 +#: instances/views.py:2109 #, python-format msgid "The host has no USB device %(device)s" msgstr "Sunucuda %(device)s USB aygıtı yok" -#: instances/views.py:2131 +#: instances/views.py:2130 #, python-format msgid "The host has no PCI device %(device)s" msgstr "Sunucuda %(device)s PCI aygıtı yok" -#: instances/views.py:2149 +#: instances/views.py:2148 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go yet;" @@ -6190,20 +6182,20 @@ msgstr "" "bırakmadı; bırakana ya da sanal makine durana kadar çalışan sanal makinede " "kalır." -#: instances/views.py:2194 instances/views.py:2224 +#: instances/views.py:2193 instances/views.py:2223 msgid "Select a network interface and a QoS direction" msgstr "Bir ağ arabirimi ve bir QoS yönü seçin" -#: instances/views.py:2197 vrtManager/network.py:459 +#: instances/views.py:2196 vrtManager/network.py:459 msgid "QoS rates must be whole numbers" msgstr "QoS hızları tam sayı olmalıdır" -#: instances/views.py:2204 networks/views.py:229 +#: instances/views.py:2203 networks/views.py:229 #, python-format msgid "%(qos_dir)s QoS is set" msgstr "%(qos_dir)s QoS ayarlandı" -#: instances/views.py:2209 +#: instances/views.py:2208 #, python-format msgid "" "%(qos_dir)s QoS is set. A running VM gets it after it is powered off and on." @@ -6211,12 +6203,12 @@ msgstr "" "%(qos_dir)s QoS ayarlandı. Çalışan bir sanal makine, kapatılıp açıldıktan " "sonra bunu alır." -#: instances/views.py:2231 networks/views.py:255 +#: instances/views.py:2230 networks/views.py:255 #, python-format msgid "%(qos_dir)s QoS is deleted" msgstr "%(qos_dir)s QoS silindi" -#: instances/views.py:2236 +#: instances/views.py:2235 #, python-format msgid "" "%(qos_dir)s QoS is deleted. A running VM keeps the old limit until it is " @@ -6225,21 +6217,21 @@ msgstr "" "%(qos_dir)s QoS silindi. Çalışan bir sanal makine, kapatılıp açılana kadar " "eski sınırı korur." -#: instances/views.py:2264 +#: instances/views.py:2263 msgid "Only one owner is allowed and the one already added" msgstr "Sadece bir sahibe izin verilmiştir ve bir sahip zaten eklenmiş" -#: instances/views.py:2266 +#: instances/views.py:2265 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s zaten bir sahip" -#: instances/views.py:2310 +#: instances/views.py:2309 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "Konsol ayarları kaydedilmedi: %(errors)s" -#: instances/views.py:2332 +#: instances/views.py:2331 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." @@ -6247,65 +6239,65 @@ msgstr "" "Konsol parolası ayarlanırken hata oluştu. Sanal makinenin bir grafik aygıtına" " sahip olduğundan emin olunuz." -#: instances/views.py:2379 +#: instances/views.py:2378 msgid "Shut the VM down to change whether it is a template." msgstr "Şablon olup olmadığını değiştirmek için sanal makineyi kapatın." -#: instances/views.py:2385 +#: instances/views.py:2384 #, python-format msgid "%(quota)s: '%(instance_name)s' stays a template." msgstr "%(quota)s: '%(instance_name)s' şablon olarak kalıyor." -#: instances/views.py:2467 +#: instances/views.py:2466 msgid "The XML has no name" msgstr "XML'de ad yok" -#: instances/views.py:2481 webvirtcloud/middleware.py:79 +#: instances/views.py:2480 webvirtcloud/middleware.py:79 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt Hatası - %(exception)s" -#: instances/views.py:2488 +#: instances/views.py:2487 msgid "An empty disk of the size you set" msgstr "Belirlediğiniz boyutta boş bir disk" -#: instances/views.py:2489 +#: instances/views.py:2488 msgid "Volumes already in a pool" msgstr "Bir havuzda zaten bulunan birimler" -#: instances/views.py:2490 +#: instances/views.py:2489 msgid "A copy of a template volume" msgstr "Bir şablon biriminin kopyası" -#: instances/views.py:2579 +#: instances/views.py:2578 msgid "You haven't defined any storage pools" msgstr "Hiç bir depolama havuzu tanımlamadınız" -#: instances/views.py:2581 +#: instances/views.py:2580 msgid "You haven't defined any network pools" msgstr "Hiç bir ağ havuzu tanımlamadınız" -#: instances/views.py:2644 +#: instances/views.py:2643 msgid "Flavor Created" msgstr "Flavor Oluşturuldu" -#: instances/views.py:2652 +#: instances/views.py:2651 msgid "Create Flavor" msgstr "Kullanıcı Oluştur" -#: instances/views.py:2667 +#: instances/views.py:2666 msgid "Flavor Updated" msgstr "Flavor Güncellendi" -#: instances/views.py:2673 +#: instances/views.py:2672 msgid "Update Flavor" msgstr "Flavor Güncelle" -#: instances/views.py:2685 +#: instances/views.py:2684 msgid "Flavor Deleted" msgstr "Flavor Silindi" -#: instances/views.py:2691 +#: instances/views.py:2690 msgid "Only the size template goes; VMs made from it keep their size." msgstr "" "Yalnızca boyut şablonu silinir; ondan oluşturulan sanal makineler boyutlarını" @@ -8930,21 +8922,21 @@ msgstr "" msgid "The destination host cannot see the NVRAM file %(path)s" msgstr "Hedef sunucu %(path)s NVRAM dosyasını göremiyor" -#: vrtManager/instance.py:494 +#: vrtManager/instance.py:499 #, python-format msgid "%(type)s disk, cannot be checked" msgstr "%(type)s disk, kontrol edilemiyor" -#: vrtManager/instance.py:534 +#: vrtManager/instance.py:539 #, python-format msgid "The destination host already has a VM %(key)s" msgstr "Hedef sunucuda zaten %(key)s sanal makinesi var" -#: vrtManager/instance.py:556 +#: vrtManager/instance.py:561 msgid "The VM was started on the source host during the migration" msgstr "Sanal makine taşıma sırasında kaynak sunucuda başlatıldı" -#: vrtManager/instance.py:572 +#: vrtManager/instance.py:577 #, python-format msgid "" "%(error)s; the VM may now be defined only on the destination host: check both" @@ -8953,7 +8945,7 @@ msgstr "" "%(error)s; sanal makine artık yalnızca hedef sunucuda tanımlı olabilir: iki " "sunucuyu da kontrol edin" -#: vrtManager/instance.py:578 +#: vrtManager/instance.py:583 #, python-format msgid "" "%(error)s; the VM is now defined on both hosts, remove it from the " @@ -8962,7 +8954,7 @@ msgstr "" "%(error)s; sanal makine artık iki sunucuda da tanımlı, hedeften kaldırın: " "%(undo_error)s" -#: vrtManager/instance.py:584 +#: vrtManager/instance.py:589 msgid "" "Snapshot names are 1-64 letters, digits, '.', '_' or '-' and do not start " "with '.'" @@ -8970,7 +8962,7 @@ msgstr "" "Anlık görüntü adları 1-64 harf, rakam, '.', '_' veya '-' karakterinden oluşur" " ve '.' ile başlamaz" -#: vrtManager/instance.py:1077 +#: vrtManager/instance.py:1082 msgid "" "A device other than a disk or NIC is in the boot order: change it in the XML " "editor" @@ -8978,100 +8970,100 @@ msgstr "" "Önyükleme sırasında disk veya NIC dışında bir aygıt var: bunu XML " "düzenleyicide değiştirin" -#: vrtManager/instance.py:1089 +#: vrtManager/instance.py:1094 msgid "Invalid Device Type for boot order" msgstr "Ön yükleme sırası için geçersiz aygıt türü" -#: vrtManager/instance.py:1092 +#: vrtManager/instance.py:1097 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "Ön yükleme aygıtı %(dev)s tanımda yok" -#: vrtManager/instance.py:1112 +#: vrtManager/instance.py:1117 #, python-format msgid "CD-ROM %(dev)s is not in the running definition" msgstr "CD-ROM %(dev)s çalışan tanımda yok" -#: vrtManager/instance.py:1113 +#: vrtManager/instance.py:1118 #, python-format msgid "CD-ROM %(dev)s is not in the persistent definition" msgstr "CD-ROM %(dev)s kalıcı tanımda yok" -#: vrtManager/instance.py:1125 +#: vrtManager/instance.py:1130 #, python-format msgid "Media of %(dev)s changed in the running VM only: %(err)s" msgstr "%(dev)s ortamı yalnızca çalışan sanal makinede değişti: %(err)s" -#: vrtManager/instance.py:1136 +#: vrtManager/instance.py:1141 #, python-format msgid "ISO image %(image)s was not found" msgstr "ISO imajı %(image)s bulunamadı" -#: vrtManager/instance.py:1138 +#: vrtManager/instance.py:1143 #, python-format msgid "ISO image %(image)s is in more than one storage pool" msgstr "ISO imajı %(image)s birden fazla depolama havuzunda var" -#: vrtManager/instance.py:1245 +#: vrtManager/instance.py:1250 #, python-format msgid "Disk %(target_dev)s is not in the VM's definition" msgstr "Disk %(target_dev)s sanal makinenin tanımında yok" -#: vrtManager/instance.py:1373 +#: vrtManager/instance.py:1378 msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "" "vCPU hotplug özelliğini etkinleştirmek için önce sanal makineyi kapatın" -#: vrtManager/instance.py:1836 +#: vrtManager/instance.py:1841 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "" "Sanal makinenin harici anlık görüntüleri var; dahili anlık görüntüler " "bunlarla karıştırılamaz" -#: vrtManager/instance.py:1868 +#: vrtManager/instance.py:1873 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "" "Bellekli bir anlık görüntüde dosya sistemleri dondurulmaz; tüm konuk durumunu" " saklar" -#: vrtManager/instance.py:1870 +#: vrtManager/instance.py:1875 msgid "Only a running VM's file systems can be frozen" msgstr "Yalnızca çalışan bir sanal makinenin dosya sistemleri dondurulabilir" -#: vrtManager/instance.py:1872 +#: vrtManager/instance.py:1877 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU konuk aracısı bağlı değil; dosya sistemlerini o dondurur" -#: vrtManager/instance.py:1875 +#: vrtManager/instance.py:1880 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "" "Sanal makinenin dahili anlık görüntüleri var; harici anlık görüntüler " "bunlarla karıştırılamaz" -#: vrtManager/instance.py:1880 +#: vrtManager/instance.py:1885 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "" "Son geri dönüşten sonra daha yeni anlık görüntüler var; önce onları silin" -#: vrtManager/instance.py:1883 +#: vrtManager/instance.py:1888 msgid "No snapshot is current; revert to a snapshot first" msgstr "Geçerli anlık görüntü yok; önce bir anlık görüntüye geri dönün" -#: vrtManager/instance.py:1889 +#: vrtManager/instance.py:1894 #, python-format msgid "Eject the media from %(dev)s first" msgstr "Önce %(dev)s içindeki ortamı çıkarın" -#: vrtManager/instance.py:1891 +#: vrtManager/instance.py:1896 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "" "Disk %(dev)s bir dosya değil; harici anlık görüntüler dosya diskleri " "gerektirir" -#: vrtManager/instance.py:1899 +#: vrtManager/instance.py:1904 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " @@ -9079,21 +9071,21 @@ msgid "" msgstr "" "Depolama havuzları yenilenemedi, bu yüzden boş alanları bilinmiyor: %(err)s" -#: vrtManager/instance.py:1920 +#: vrtManager/instance.py:1925 msgid "Memory is saved only from a running VM" msgstr "Bellek yalnızca çalışan bir sanal makineden kaydedilir" -#: vrtManager/instance.py:1922 +#: vrtManager/instance.py:1927 msgid "The VM has no disk to keep its memory next to" msgstr "Sanal makinenin, belleğinin yanına kaydedileceği bir diski yok" -#: vrtManager/instance.py:1926 +#: vrtManager/instance.py:1931 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "" "%(disk)s bir depolama havuzunda değil; bellek yalnızca bir havuza kaydedilir" -#: vrtManager/instance.py:1957 +#: vrtManager/instance.py:1962 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -9104,7 +9096,7 @@ msgstr "" "%(size).1f GiB gerektiriyor (sanal makinenin oradaki disklerinin " "%%%(percent)g kadarı, en az %(minimum)g GiB, ve kaydediliyorsa bellek)" -#: vrtManager/instance.py:1975 +#: vrtManager/instance.py:1980 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" @@ -9112,7 +9104,7 @@ msgstr "" "Bu anlık görüntü UEFI bir sanal makinede eski bir sürümle alındı ve geri " "dönülemez; bunun yerine silin" -#: vrtManager/instance.py:2005 +#: vrtManager/instance.py:2010 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " @@ -9121,7 +9113,7 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine çalışıyor." -#: vrtManager/instance.py:2007 +#: vrtManager/instance.py:2012 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " @@ -9130,13 +9122,13 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine kapalı." -#: vrtManager/instance.py:2170 +#: vrtManager/instance.py:2175 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "" "Bir disk, sanal makinesi tanımlıyken ve çalışırken, duraklatılmışken veya " "kapalıyken taşınır" -#: vrtManager/instance.py:2172 +#: vrtManager/instance.py:2177 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" @@ -9144,7 +9136,7 @@ msgstr "" "Anlık görüntüleri, kaydedilmiş durumu veya çalışan bir blok işi olan sanal " "makinenin diski taşınmaz" -#: vrtManager/instance.py:2180 +#: vrtManager/instance.py:2185 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " @@ -9153,132 +9145,132 @@ msgstr "" "%(dev)s, sanal makinenin çalışan ve sonraki başlatma tanımlarında aynı olan " "bir disk dosyası değil" -#: vrtManager/instance.py:2185 +#: vrtManager/instance.py:2190 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s taşınmaz: yalnızca yazılabilir raw ve qcow2 diskler taşınır" -#: vrtManager/instance.py:2192 +#: vrtManager/instance.py:2197 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s taşınmaz: hiçbir depolama havuzunda %(path)s yok" -#: vrtManager/instance.py:2194 +#: vrtManager/instance.py:2199 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s taşınmaz: temel (backing) dosyası var" -#: vrtManager/instance.py:2197 +#: vrtManager/instance.py:2202 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s bu sunucunun etkin bir disk dosyası havuzu değil" -#: vrtManager/instance.py:2200 +#: vrtManager/instance.py:2205 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s zaten %(pool_name)s havuzunda" -#: vrtManager/instance.py:2204 +#: vrtManager/instance.py:2209 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "%(pool_name)s havuzunda zaten %(name)s dosyası var" -#: vrtManager/instance.py:2228 +#: vrtManager/instance.py:2233 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s kopyası tamamlanmadan sona erdi" -#: vrtManager/instance.py:2273 +#: vrtManager/instance.py:2278 #, python-format msgid "%(error)s; remove %(dest)s if it is there: %(cleanup_error)s" msgstr "%(error)s; varsa %(dest)s dosyasını kaldırın: %(cleanup_error)s" -#: vrtManager/instance.py:2275 +#: vrtManager/instance.py:2280 #, python-format msgid "%(error)s; the VM may use %(dest)s now: check its disk %(dev)s" msgstr "" "%(error)s; sanal makine şu anda %(dest)s dosyasını kullanıyor olabilir: " "%(dev)s diskini kontrol edin" -#: vrtManager/instance.py:2282 +#: vrtManager/instance.py:2287 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "Sanal makinenin %(name)s adlı dahili anlık görüntüsü yok" -#: vrtManager/instance.py:2291 +#: vrtManager/instance.py:2296 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "" "Sanal makinenin kaydedilmiş durumu var; önce başlatın veya kaydedilmiş durumu" " kaldırın" -#: vrtManager/instance.py:2293 +#: vrtManager/instance.py:2298 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "" "Bu sanal makinede hâlâ bir anlık görüntü işi çalışıyor; bittiğinde tekrar " "deneyin" -#: vrtManager/instance.py:2303 +#: vrtManager/instance.py:2308 msgid "Shut the VM down to revert to an internal snapshot" msgstr "Dahili bir anlık görüntüye geri dönmek için sanal makineyi kapatın" -#: vrtManager/instance.py:2392 +#: vrtManager/instance.py:2397 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM'i dosya olmayan bir sanal makine klonlanamaz" -#: vrtManager/instance.py:2460 +#: vrtManager/instance.py:2465 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "" "Klonlama başarısız oldu (%(err)s); bu kopyaları elle kaldırın: %(path)s" -#: vrtManager/instance.py:2470 +#: vrtManager/instance.py:2475 msgid "Shut the VM down before cloning it" msgstr "Klonlamadan önce sanal makineyi kapatın" -#: vrtManager/instance.py:2524 +#: vrtManager/instance.py:2529 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "" "Klonlama başarısız oldu (%(err)s); bu kopyaları elle kaldırın: %(leftovers)s" -#: vrtManager/instance.py:2535 +#: vrtManager/instance.py:2540 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "" "Canlı klonlama libvirt 11.10 veya sonrasını gerektirir; klonlamak için sanal " "makineyi kapatın" -#: vrtManager/instance.py:2538 +#: vrtManager/instance.py:2543 msgid "A VM with a TPM is cloned only shut down" msgstr "TPM'i olan bir sanal makine yalnızca kapalıyken klonlanır" -#: vrtManager/instance.py:2541 +#: vrtManager/instance.py:2546 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "" "Disk %(dev)s yerel bir dosya değil; klonlamak için sanal makineyi kapatın" -#: vrtManager/instance.py:2543 +#: vrtManager/instance.py:2548 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "Disk %(dev)s paylaşılabilir; klonlamak için sanal makineyi kapatın" -#: vrtManager/instance.py:2548 +#: vrtManager/instance.py:2553 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "" "Disk %(dev)s sonraki başlatmada değişiyor; klonlamak için sanal makineyi " "kapatın" -#: vrtManager/instance.py:2550 +#: vrtManager/instance.py:2555 msgid "Another job is running on the VM; clone it when that ends" msgstr "Sanal makinede başka bir iş çalışıyor; o bittiğinde klonlayın" -#: vrtManager/instance.py:2563 +#: vrtManager/instance.py:2568 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "%(name)s birimi %(pool)s depolama havuzunda zaten var" -#: vrtManager/instance.py:2582 +#: vrtManager/instance.py:2587 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -9288,20 +9280,20 @@ msgstr "" "gerektiriyor (kopyalanan diskler, artı bunların %%%(percent)g kadarı, en az " "%(minimum)g GiB)" -#: vrtManager/instance.py:2721 +#: vrtManager/instance.py:2726 msgid "A network interface that is a host device is removed in the XML editor" msgstr "Sunucu aygıtı olan bir ağ arabirimi XML düzenleyicide kaldırılır" -#: vrtManager/instance.py:2737 +#: vrtManager/instance.py:2742 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "MAC adresi %(old_mac)s olan ağ arabirimi yok" -#: vrtManager/instance.py:2740 +#: vrtManager/instance.py:2745 msgid "A network interface that is a host device is changed in the XML editor" msgstr "Sunucu aygıtı olan bir ağ arabirimi XML düzenleyicide değiştirilir" -#: vrtManager/instance.py:2831 +#: vrtManager/instance.py:2836 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" @@ -9309,14 +9301,14 @@ msgstr "" "Sanal makine PCI aygıtlarını çalışırken veya kaydedilmiş durumu olmadan " "kapalıyken değiştirir" -#: vrtManager/instance.py:2843 +#: vrtManager/instance.py:2848 #, python-format msgid "%(err)s; whether the VM has PCI device %(address)s now is not known" msgstr "" "%(err)s; sanal makinede şu anda %(address)s PCI aygıtının olup olmadığı " "bilinmiyor" -#: vrtManager/instance.py:2845 +#: vrtManager/instance.py:2850 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" @@ -9324,7 +9316,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "var" -#: vrtManager/instance.py:2847 +#: vrtManager/instance.py:2852 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " @@ -9333,7 +9325,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "yok" -#: vrtManager/instance.py:2848 +#: vrtManager/instance.py:2853 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" @@ -9341,7 +9333,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada var" -#: vrtManager/instance.py:2850 +#: vrtManager/instance.py:2855 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " @@ -9350,7 +9342,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2852 +#: vrtManager/instance.py:2857 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9359,7 +9351,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada var" -#: vrtManager/instance.py:2854 +#: vrtManager/instance.py:2859 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9368,29 +9360,29 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2888 +#: vrtManager/instance.py:2893 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "Sanal makinede %(address)s PCI aygıtı yok" -#: vrtManager/instance.py:2906 +#: vrtManager/instance.py:2911 msgid "The VM has no USB controller" msgstr "Sanal makinede USB denetleyicisi yok" -#: vrtManager/instance.py:2925 +#: vrtManager/instance.py:2930 msgid "The VM has no such USB device" msgstr "Sanal makinede böyle bir USB aygıtı yok" -#: vrtManager/instance.py:2966 +#: vrtManager/instance.py:2971 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "" "Sanal makinenin kendi RNG aygıtı var: bunu XML düzenleyicide değiştirin" -#: vrtManager/instance.py:2993 +#: vrtManager/instance.py:2998 msgid "The VM has its own TPM: change it in the XML editor" msgstr "Sanal makinenin kendi TPM'i var: bunu XML düzenleyicide değiştirin" -#: vrtManager/instance.py:3012 +#: vrtManager/instance.py:3017 #, python-format msgid "Unknown crash action %(action)s" msgstr "Bilinmeyen çökme eylemi %(action)s" diff --git a/locale/zh/LC_MESSAGES/django.mo b/locale/zh/LC_MESSAGES/django.mo index 4cf6135a0f3d0db65a9e8b9a6a37acde53c84c2c..ae5085391c16771d9781e47b676993cf95756ab9 100644 GIT binary patch delta 42733 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 delta 42566 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 RMDi#beIl<#373RM_!nY@0UiJV diff --git a/locale/zh/LC_MESSAGES/django.po b/locale/zh/LC_MESSAGES/django.po index bc93ab24..e3ff8f94 100644 --- a/locale/zh/LC_MESSAGES/django.po +++ b/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-11-04 11:55+0000\n" +"POT-Creation-Date: 2026-11-04 19:19+0000\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -96,8 +96,8 @@ msgstr "一年后" #: accounts/forms.py:96 accounts/templates/account.html:29 #: accounts/templates/api_token_list.html:19 #: accounts/templates/api_token_list.html:20 accounts/templates/profile.html:25 -#: admin/templates/admin/user_form.html:16 -#: admin/templates/admin/user_list.html:58 +#: admin/templates/admin/user_form.html:31 +#: admin/templates/admin/user_list.html:56 #: operations/templates/operations/jobs.html:15 #: operations/templatetags/operations.py:91 msgid "never" @@ -160,27 +160,25 @@ msgid "User Profile" msgstr "用户资料" #: accounts/templates/account.html:17 accounts/templates/profile.html:18 -#: admin/templates/admin/user_form.html:47 -#: admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:32 +#: admin/forms.py:73 admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:30 msgid "Superuser" msgstr "超级用户" #: accounts/templates/account.html:19 accounts/templates/profile.html:20 -#: admin/forms.py:94 admin/templates/admin/user_form.html:40 -#: admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:34 +#: admin/forms.py:73 admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:32 msgid "Template editor" msgstr "模板编辑者" -#: accounts/templates/account.html:21 admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:41 instances/states.py:12 +#: accounts/templates/account.html:21 admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:39 instances/states.py:12 msgid "Blocked" msgstr "已禁用" #: accounts/templates/account.html:29 accounts/templates/profile.html:25 -#: admin/templates/admin/user_form.html:16 -#: admin/templates/admin/user_list.html:58 +#: admin/templates/admin/user_form.html:31 +#: admin/templates/admin/user_list.html:56 msgid "Last login" msgstr "上次登录" @@ -201,7 +199,7 @@ msgid "User sections" msgstr "用户页面导航" #: accounts/templates/account.html:44 accounts/templates/account.html:52 -#: computes/templates/computes/list.html:30 +#: admin/forms.py:189 computes/templates/computes/list.html:30 #: computes/templates/computes/list.html:57 computes/templates/overview.html:46 msgid "VMs" msgstr "虚拟机" @@ -263,7 +261,7 @@ msgstr "修改密码" #: accounts/templates/accounts/change_password_form.html:25 #: accounts/templates/accounts/email_otp_form.html:25 #: admin/templates/admin/group_form.html:46 -#: admin/templates/admin/user_form.html:137 +#: admin/templates/admin/user_form.html:169 #: computes/templates/computes/form.html:45 #: console/templates/console-vnc.html:86 #: instances/templates/add_instance_cdrom.html:38 @@ -354,7 +352,7 @@ msgid "Enter username" msgstr "输入用户名" #: accounts/templates/accounts/otp_login.html:37 -#: accounts/templates/login.html:36 admin/templates/admin/user_form.html:106 +#: accounts/templates/login.html:36 admin/templates/admin/user_form.html:41 #: console/templates/console-vnc.html:82 instances/forms.py:28 #: instances/templates/instances/access_tab.html:53 msgid "Password" @@ -426,8 +424,8 @@ msgstr "API 令牌 %(name)s 的操作" #: accounts/templates/ssh_key_list.html:13 #: admin/templates/admin/group_list.html:44 #: admin/templates/admin/tombstone_list.html:42 +#: admin/templates/admin/user_list.html:74 #: admin/templates/admin/user_list.html:76 -#: admin/templates/admin/user_list.html:78 #: instances/templates/create_flavors.html:11 #: instances/templates/instances/settings_tab.html:251 #: instances/templates/instances/settings_tab.html:315 @@ -621,53 +619,98 @@ msgstr "OTP 二维码已通过邮件发送给用户 %(user)s" msgid "User email not set, failed to send QR code" msgstr "未设置用户邮箱,无法发送二维码" -#: admin/forms.py:18 +#: admin/forms.py:20 msgid "Change their own password on their profile page" msgstr "在个人资料页修改自己的密码" -#: admin/forms.py:19 +#: admin/forms.py:21 msgid "" "Clone the VMs they may change and the templates they may view, within their " "quota" msgstr "在配额范围内克隆其可修改的虚拟机和可查看的模板" -#: admin/forms.py:20 +#: admin/forms.py:22 msgid "Open a console without the VM's console password" msgstr "无需虚拟机的控制台密码即可打开控制台" -#: admin/forms.py:21 +#: admin/forms.py:23 msgid "Take, revert and delete snapshots of the VMs they may change" msgstr "为其可修改的虚拟机创建、恢复和删除快照" -#: admin/forms.py:22 +#: admin/forms.py:24 msgid "See every VM and host in the lists, read-only" msgstr "在列表中查看所有虚拟机和主机(只读)" -#: admin/forms.py:70 +#: admin/forms.py:73 admin/templates/admin/logs.html:39 +#: admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:34 +#: computes/templates/computes/instances.html:46 +#: instances/templates/add_instance_owner_block.html:17 +#: instances/templates/instances/stats_tab.html:67 +#: operations/templates/operations/job.html:21 +#: operations/templates/operations/jobs.html:27 +#: operations/templates/operations/jobs.html:61 +msgid "User" +msgstr "用户" + +#: admin/forms.py:80 msgid "Permissions" msgstr "权限" -#: admin/forms.py:77 admin/templates/admin/group_list.html:6 +#: admin/forms.py:87 admin/templates/admin/group_list.html:6 #: admin/templates/admin/group_list.html:8 #: admin/templates/admin/group_list.html:24 -#: admin/templates/admin/user_form.html:54 templates/navbar.html:33 +#: admin/templates/admin/user_form.html:133 templates/navbar.html:33 msgid "Groups" msgstr "用户组" -#: admin/forms.py:95 -msgid "May change and delete the template VMs given to them" -msgstr "可修改和删除分配给他们的模板虚拟机" - -#: admin/forms.py:121 +#: admin/forms.py:143 #, python-format msgid "NEW_USER_DEFAULT_INSTANCES: %(name)s is not exactly one VM" msgstr "NEW_USER_DEFAULT_INSTANCES:%(name)s 不是唯一的一台虚拟机" -#: admin/forms.py:169 +#: admin/forms.py:190 computes/templates/computes/list.html:58 +#: computes/templates/overview.html:58 instances/forms.py:15 +#: instances/templates/allinstances_index_grouped.html:16 +#: instances/templates/allinstances_index_nongrouped.html:14 +#: instances/templates/create_instance_w2.html:63 +#: instances/templates/instances/resize_tab.html:29 +#: instances/templates/instances/settings_tab.html:853 +msgid "vCPUs" +msgstr "vCPU" + +#: admin/forms.py:191 computes/templates/computes/instances.html:49 +#: computes/templates/computes/list.html:59 computes/templates/overview.html:66 +#: computes/templates/overview.html:150 +#: instances/templates/allinstances_index_grouped.html:17 +#: instances/templates/allinstances_index_nongrouped.html:15 +#: instances/templates/create_inst_block.html:33 +#: instances/templates/instance.html:60 +#: instances/templates/instances/resize_tab.html:17 +#: instances/templates/instances/stats_tab.html:34 +msgid "Memory" +msgstr "内存" + +#: admin/forms.py:192 instances/models.py:237 +#: instances/templates/create_instance_w2.html:118 +#: instances/templates/instances/settings_tab.html:25 +#: instances/templates/instances/stats_tab.html:51 +msgid "Disk" +msgstr "磁盘" + +#: admin/forms.py:202 +msgid "No limit" +msgstr "不限" + +#: admin/forms.py:216 +msgid "Enter a limit or choose No limit." +msgstr "请输入限制值,或选择“不限”。" + +#: admin/forms.py:228 msgid "The user must change it at their next login" msgstr "用户必须在下次登录时修改密码" -#: admin/forms.py:179 +#: admin/forms.py:238 msgid "A user without a password cannot be made to change it" msgstr "没有密码的用户无法被要求修改密码" @@ -686,7 +729,6 @@ msgid "Members" msgstr "成员" #: admin/templates/admin/group_form.html:47 -#: admin/templates/admin/user_form.html:138 #: computes/templates/computes/form.html:46 #: instances/templates/instances/edit_instance_volume.html:112 #: instances/templates/instances/nic_qos_form.html:23 @@ -705,14 +747,14 @@ msgid "New group" msgstr "新建用户组" #: admin/templates/admin/group_list.html:19 -#: admin/templates/admin/user_form.html:62 +#: admin/templates/admin/user_form.html:141 msgid "There are no groups yet." msgstr "还没有用户组。" #: admin/templates/admin/group_list.html:25 admin/templates/admin/logs.html:20 #: admin/templates/admin/logs.html:26 #: admin/templates/admin/tombstone_list.html:20 -#: admin/templates/admin/user_list.html:21 +#: admin/templates/admin/user_list.html:20 #: instances/templates/allinstances.html:11 networks/templates/network.html:130 #: nodedevs/templates/nodedevs.html:22 nwfilters/templates/nwfilters.html:23 #: templates/search_block.html:3 virtsecrets/templates/secrets.html:23 @@ -736,7 +778,7 @@ msgid_plural "%(count)s permissions" msgstr[0] "%(count)s 项权限" #: admin/templates/admin/group_list.html:40 -#: admin/templates/admin/user_list.html:63 +#: admin/templates/admin/user_list.html:61 #: instances/templates/instances/edit_instance_volume.html:3 #: instances/templates/instances/settings_tab.html:309 #: networks/templates/network.html:159 networks/templates/network.html:301 @@ -744,7 +786,7 @@ msgid "Edit" msgstr "编辑" #: admin/templates/admin/group_list.html:42 -#: admin/templates/admin/user_list.html:65 +#: admin/templates/admin/user_list.html:63 #, python-format msgid "More actions for %(name)s" msgstr "%(name)s 的更多操作" @@ -788,17 +830,6 @@ msgstr "还没有日志行。" msgid "Date (%(time_zone)s)" msgstr "日期(%(time_zone)s)" -#: admin/templates/admin/logs.html:39 admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:36 -#: computes/templates/computes/instances.html:46 -#: instances/templates/add_instance_owner_block.html:17 -#: instances/templates/instances/stats_tab.html:67 -#: operations/templates/operations/job.html:21 -#: operations/templates/operations/jobs.html:27 -#: operations/templates/operations/jobs.html:61 -msgid "User" -msgstr "用户" - #: admin/templates/admin/logs.html:41 instances/templates/instance.html:8 msgid "Instance" msgstr "虚拟机" @@ -817,16 +848,16 @@ msgstr "结果" msgid "IP" msgstr "IP" -#: admin/templates/admin/logs.html:56 admin/views.py:285 instances/states.py:19 +#: admin/templates/admin/logs.html:56 admin/views.py:291 instances/states.py:19 #: logs/views.py:17 msgid "Unknown" msgstr "未知" -#: admin/templates/admin/logs.html:56 admin/views.py:285 logs/views.py:17 +#: admin/templates/admin/logs.html:56 admin/views.py:291 logs/views.py:17 msgid "Done" msgstr "完成" -#: admin/templates/admin/logs.html:56 admin/views.py:285 logs/views.py:17 +#: admin/templates/admin/logs.html:56 admin/views.py:291 logs/views.py:17 #: operations/templates/operations/job.html:107 msgid "Failed" msgstr "失败" @@ -876,118 +907,106 @@ msgstr "过期" msgid "No removed VM matches the search." msgstr "没有与搜索匹配的已移除虚拟机。" -#: admin/templates/admin/user_form.html:27 -msgid "Active: may sign in" -msgstr "启用:可以登录" +#: admin/templates/admin/user_form.html:29 +msgid "Account" +msgstr "账户" -#: admin/templates/admin/user_form.html:28 -msgid "Turn off to block the user while keeping the account." -msgstr "关闭后将禁用该用户,但保留账户。" +#: admin/templates/admin/user_form.html:33 +msgid "What the user signs in with." +msgstr "用户登录所用的信息。" -#: admin/templates/admin/user_form.html:32 -#, python-format -msgid "What can %(name)s do?" -msgstr "%(name)s 可以做什么?" - -#: admin/templates/admin/user_form.html:32 -msgid "What can the user do?" -msgstr "该用户可以做什么?" - -#: admin/templates/admin/user_form.html:34 -msgid "The permissions of the user's groups apply too." -msgstr "用户所在用户组的权限同样适用。" - -#: admin/templates/admin/user_form.html:41 -msgid "May change and delete the template VMs given to them." -msgstr "可修改和删除分配给他们的模板虚拟机。" - -#: admin/templates/admin/user_form.html:48 -msgid "Has every permission and manages the panel, whatever is chosen below." -msgstr "拥有所有权限并管理面板,与下方的选择无关。" - -#: admin/templates/admin/user_form.html:69 -msgid "Own permissions" -msgstr "自身权限" - -#: admin/templates/admin/user_form.html:70 -msgid "Off grants nothing here; it takes away nothing a group grants." -msgstr "关闭不会在此授予任何权限,也不会撤销用户组授予的权限。" - -#: admin/templates/admin/user_form.html:88 -msgid "Name and password" -msgstr "名称和密码" - -#: admin/templates/admin/user_form.html:92 -msgid "password set" -msgstr "已设置密码" - -#: admin/templates/admin/user_form.html:92 -msgid "no password" -msgstr "无密码" - -#: admin/templates/admin/user_form.html:106 +#: admin/templates/admin/user_form.html:43 msgid "Set" msgstr "已设置" -#: admin/templates/admin/user_form.html:106 +#: admin/templates/admin/user_form.html:43 msgid "Not set" msgstr "未设置" -#: admin/templates/admin/user_form.html:107 +#: admin/templates/admin/user_form.html:44 msgid "Change password" msgstr "修改密码" -#: admin/templates/admin/user_form.html:116 +#: admin/templates/admin/user_form.html:57 +msgid "May sign in" +msgstr "可以登录" + +#: admin/templates/admin/user_form.html:58 +msgid "Turn off to block the user while keeping the account." +msgstr "关闭后将禁用该用户,但保留账户。" + +#: admin/templates/admin/user_form.html:67 +msgid "Role" +msgstr "角色" + +#: admin/templates/admin/user_form.html:68 +msgid "What the user manages." +msgstr "用户可以管理的内容。" + +#: admin/templates/admin/user_form.html:71 +msgid "Uses the VMs given to them, within their quota." +msgstr "在配额范围内使用分配给其的虚拟机。" + +#: admin/templates/admin/user_form.html:72 +msgid "May change and delete the template VMs given to them." +msgstr "可修改和删除分配给他们的模板虚拟机。" + +#: admin/templates/admin/user_form.html:73 +msgid "Manages the panel: every permission, no quota." +msgstr "管理面板:拥有所有权限,不受配额限制。" + +#: admin/templates/admin/user_form.html:93 +msgid "" +"A superuser has every permission and no quota: there is nothing more to set." +msgstr "超级用户拥有所有权限且不受配额限制:无需再设置其他内容。" + +#: admin/templates/admin/user_form.html:99 msgid "Quota" msgstr "配额" -#: admin/templates/admin/user_form.html:118 -msgid "any number of VMs" -msgstr "虚拟机数量不限" +#: admin/templates/admin/user_form.html:100 +msgid "The most the user's VMs may have in total." +msgstr "用户的虚拟机总共可使用的最大资源。" -#: admin/templates/admin/user_form.html:118 -#, python-format -msgid "%(count)s VM" -msgid_plural "%(count)s VMs" -msgstr[0] "%(count)s 台虚拟机" +#: admin/templates/admin/user_form.html:128 +msgid "Groups and permissions" +msgstr "用户组和权限" -#: admin/templates/admin/user_form.html:119 -msgid "any vCPUs" -msgstr "vCPU 不限" +#: admin/templates/admin/user_form.html:129 +msgid "The permissions of the user's groups apply too." +msgstr "用户所在用户组的权限同样适用。" -#: admin/templates/admin/user_form.html:119 -#, python-format -msgid "%(count)s vCPU" -msgid_plural "%(count)s vCPUs" -msgstr[0] "%(count)s 个 vCPU" +#: admin/templates/admin/user_form.html:147 +msgid "Own permissions" +msgstr "自身权限" -#: admin/templates/admin/user_form.html:120 -msgid "any memory" -msgstr "内存不限" +#: admin/templates/admin/user_form.html:148 +msgid "Off grants nothing here; it takes away nothing a group grants." +msgstr "关闭不会在此授予任何权限,也不会撤销用户组授予的权限。" -#: admin/templates/admin/user_form.html:121 -msgid "any disk size" -msgstr "磁盘大小不限" +#: admin/templates/admin/user_form.html:170 +msgid "Save changes" +msgstr "保存更改" -#: admin/templates/admin/user_form.html:125 -msgid "For each limit: -1 means no limit, 0 none allowed." -msgstr "每项限制:-1 表示不限,0 表示不允许。" +#: admin/templates/admin/user_form.html:170 +msgid "Create user" +msgstr "创建用户" -#: admin/templates/admin/user_list.html:13 +#: admin/templates/admin/user_list.html:12 msgid "New user" msgstr "新建用户" -#: admin/templates/admin/user_list.html:20 admin/views.py:116 +#: admin/templates/admin/user_list.html:19 admin/views.py:122 #: instances/templates/instances/settings_tab.html:79 templates/navbar.html:32 msgid "Users" msgstr "用户" -#: admin/templates/admin/user_list.html:21 +#: admin/templates/admin/user_list.html:20 msgid "Search users" msgstr "搜索用户" -#: admin/templates/admin/user_list.html:26 -#: admin/templates/admin/user_list.html:39 instances/states.py:11 +#: admin/templates/admin/user_list.html:24 +#: admin/templates/admin/user_list.html:37 instances/states.py:11 #: instances/templates/instances/power_tab.html:19 #: instances/templates/instances/power_tab.html:21 #: interfaces/templates/interface.html:49 networks/templates/network.html:53 @@ -996,33 +1015,33 @@ msgstr "搜索用户" msgid "Active" msgstr "启用" -#: admin/templates/admin/user_list.html:49 +#: admin/templates/admin/user_list.html:47 msgid "Can clone" msgstr "可克隆" -#: admin/templates/admin/user_list.html:51 +#: admin/templates/admin/user_list.html:49 #, python-format msgid "%(count)s API token" msgid_plural "%(count)s API tokens" msgstr[0] "%(count)s 个 API 令牌" -#: admin/templates/admin/user_list.html:54 +#: admin/templates/admin/user_list.html:52 msgid "No groups or API tokens" msgstr "无用户组或 API 令牌" -#: admin/templates/admin/user_list.html:67 +#: admin/templates/admin/user_list.html:65 msgid "View profile" msgstr "查看资料" -#: admin/templates/admin/user_list.html:71 +#: admin/templates/admin/user_list.html:69 msgid "Block" msgstr "禁用" -#: admin/templates/admin/user_list.html:71 +#: admin/templates/admin/user_list.html:69 msgid "Unblock" msgstr "解除禁用" -#: admin/templates/admin/user_list.html:88 +#: admin/templates/admin/user_list.html:86 msgid "No user matches the search." msgstr "没有与搜索匹配的用户。" @@ -1042,37 +1061,37 @@ msgstr "其成员仍保留,但会失去该用户组授予的权限。" msgid "You cannot block, delete or demote your own account" msgstr "不能禁用、删除或降级你自己的账户" -#: admin/views.py:141 +#: admin/views.py:147 msgid "Create User" msgstr "创建用户" -#: admin/views.py:182 +#: admin/views.py:188 msgid "Update User" msgstr "更新用户" -#: admin/views.py:203 +#: admin/views.py:209 #, python-format msgid "Password changed for %(user)s" msgstr "已为 %(user)s 修改密码" -#: admin/views.py:207 +#: admin/views.py:213 msgid "Wrong Data Provided" msgstr "提供的数据有误" -#: admin/views.py:236 +#: admin/views.py:242 msgid "Their access to VMs, SSH keys and settings go; the VMs themselves stay." msgstr "其对虚拟机、SSH 密钥和设置的访问将被移除;虚拟机本身保留。" -#: admin/views.py:331 +#: admin/views.py:337 msgid "deleted user" msgstr "已删除的用户" -#: admin/views.py:342 +#: admin/views.py:348 #, python-format msgid "Removed VM %(name)s deleted" msgstr "已删除已移除的虚拟机 %(name)s" -#: admin/views.py:349 +#: admin/views.py:355 msgid "Its owners no longer get the VM back if its UUID shows up again." msgstr "若其 UUID 再次出现,其所有者将不再恢复对该虚拟机的所有权。" @@ -1990,18 +2009,6 @@ msgstr "状态" msgid "VCPU" msgstr "VCPU" -#: computes/templates/computes/instances.html:49 -#: computes/templates/computes/list.html:59 computes/templates/overview.html:66 -#: computes/templates/overview.html:150 -#: instances/templates/allinstances_index_grouped.html:17 -#: instances/templates/allinstances_index_nongrouped.html:15 -#: instances/templates/create_inst_block.html:33 -#: instances/templates/instance.html:60 -#: instances/templates/instances/resize_tab.html:17 -#: instances/templates/instances/stats_tab.html:34 -msgid "Memory" -msgstr "内存" - #: computes/templates/computes/instances.html:50 #: computes/templates/computes/list.html:60 #: instances/templates/allinstances_index_grouped.html:18 @@ -2049,15 +2056,6 @@ msgstr "已分配内存" msgid "of %(memory)s" msgstr "共 %(memory)s" -#: computes/templates/computes/list.html:58 computes/templates/overview.html:58 -#: instances/forms.py:15 instances/templates/allinstances_index_grouped.html:16 -#: instances/templates/allinstances_index_nongrouped.html:14 -#: instances/templates/create_instance_w2.html:63 -#: instances/templates/instances/resize_tab.html:29 -#: instances/templates/instances/settings_tab.html:853 -msgid "vCPUs" -msgstr "vCPU" - #: computes/templates/computes/list.html:71 computes/templates/overview.html:19 #: console/templates/console-vnc.html:13 #: console/templates/console-xterm.html:16 @@ -2245,7 +2243,7 @@ msgid "" "/etc/default/webvirt-gstfsd" msgstr "请输入主机 /etc/default/webvirt-gstfsd 中 GSTFSD_KEY 的 64 个十六进制字符" -#: computes/views.py:197 +#: computes/views.py:199 #, python-format msgid "" "Its VMs keep running on the host and leave the panel; their owners are kept " @@ -2612,7 +2610,7 @@ msgstr "虚拟机未定义;请检查这些卷,然后处理此任务:%(volu msgid "Delete snapshot" msgstr "删除快照" -#: instances/jobs.py:304 vrtManager/instance.py:2281 +#: instances/jobs.py:304 vrtManager/instance.py:2286 #, python-format msgid "The VM has no external snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的外部快照" @@ -2644,7 +2642,7 @@ msgstr "虚拟机已不在运行该任务的计算节点上" msgid "Take snapshot" msgstr "创建快照" -#: instances/jobs.py:372 vrtManager/instance.py:1877 +#: instances/jobs.py:372 vrtManager/instance.py:1882 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "名为 %(name)s 的快照已存在" @@ -2754,7 +2752,7 @@ msgstr "libvirt 没有复制的结果;请检查这些卷,然后处理此任 msgid "Create VM" msgstr "创建虚拟机" -#: instances/jobs.py:746 instances/views.py:2469 +#: instances/jobs.py:746 instances/views.py:2468 msgid "A virtual machine with this name already exists" msgstr "同名虚拟机已存在" @@ -2801,7 +2799,7 @@ msgstr "cloud-init 种子需要为磁盘使用目录类型的存储池" msgid "This host offers no firmware %(firmware)s" msgstr "此主机不提供固件 %(firmware)s" -#: instances/jobs.py:775 vrtManager/instance.py:3000 +#: instances/jobs.py:775 vrtManager/instance.py:3005 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "此主机不提供 TPM 2.0:请在主机上安装 swtpm" @@ -2913,12 +2911,6 @@ msgstr "创建时间" msgid "drbd" msgstr "drbd" -#: instances/models.py:237 instances/templates/create_instance_w2.html:118 -#: instances/templates/instances/settings_tab.html:25 -#: instances/templates/instances/stats_tab.html:51 -msgid "Disk" -msgstr "磁盘" - #: instances/models.py:239 instances/templates/create_instance_w2.html:312 #: instances/templates/instances/settings_tab.html:159 msgid "CD-ROM" @@ -3110,7 +3102,7 @@ msgid "Disk source" msgstr "磁盘来源" #: instances/templates/add_instance_volume.html:21 -#: instances/templates/create_instance_w2.html:134 instances/views.py:2488 +#: instances/templates/create_instance_w2.html:134 instances/views.py:2487 msgid "New disk" msgstr "新磁盘" @@ -3474,7 +3466,7 @@ msgstr "自定义 CPU 型号" msgid "Size (GiB)" msgstr "大小(GiB)" -#: instances/templates/create_instance_w2.html:161 instances/views.py:2489 +#: instances/templates/create_instance_w2.html:161 instances/views.py:2488 msgid "Existing volumes" msgstr "已有卷" @@ -3510,7 +3502,7 @@ msgstr "设备" msgid "Remove" msgstr "移除" -#: instances/templates/create_instance_w2.html:194 instances/views.py:2490 +#: instances/templates/create_instance_w2.html:194 instances/views.py:2489 msgid "Clone from template" msgstr "从模板克隆" @@ -5503,66 +5495,66 @@ msgstr "%(quota)s(%(total)s > %(limit)s)" msgid "None available device name" msgstr "没有可用的设备名称" -#: instances/utils.py:378 +#: instances/utils.py:392 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(hostname)s,经由 %(address)s" -#: instances/utils.py:417 +#: instances/utils.py:431 msgid "Invalid MAC address" msgstr "无效的 MAC 地址" -#: instances/utils.py:419 +#: instances/utils.py:433 msgid "More MAC addresses than networks" msgstr "MAC 地址数量多于网络数量" -#: instances/views.py:167 +#: instances/views.py:170 msgid "Enter an IP address, a network such as 192.0.2.0/24, or a MAC address." msgstr "请输入 IP 地址、网络(如 192.0.2.0/24)或 MAC 地址。" -#: instances/views.py:173 instances/views.py:207 +#: instances/views.py:176 instances/views.py:210 msgid "Too many searches are still running; try again shortly." msgstr "仍在运行的搜索过多;请稍后再试。" -#: instances/views.py:253 +#: instances/views.py:256 #, python-format msgid "The host %(host)s of '%(name)s' cannot be reached: %(error)s" msgstr "无法连接“%(name)s”所在的主机 %(host)s:%(error)s" -#: instances/views.py:259 +#: instances/views.py:262 #, python-format msgid "The host of '%(name)s' cannot be reached right now." msgstr "目前无法连接“%(name)s”所在的主机。" -#: instances/views.py:260 +#: instances/views.py:263 msgid " Jobs on it can be followed under Jobs in the menu." msgstr " 其上的任务可在菜单的“任务”中跟踪。" -#: instances/views.py:362 +#: instances/views.py:365 msgid "There is no other host to migrate to." msgstr "没有其他可迁移到的主机。" -#: instances/views.py:364 +#: instances/views.py:367 msgid "A VM migrates when it is running, paused or shut off." msgstr "虚拟机在运行、暂停或关机状态下均可迁移。" -#: instances/views.py:366 +#: instances/views.py:369 msgid "" "A VM with snapshots cannot be migrated: its snapshots stay on this host. " "Delete them first." msgstr "有快照的虚拟机无法迁移:其快照保留在本主机上。请先删除快照。" -#: instances/views.py:368 +#: instances/views.py:371 msgid "" "A VM with host devices cannot be migrated: the destination may not have them." " Remove them first." msgstr "有主机设备的虚拟机无法迁移:目标主机可能没有这些设备。请先移除它们。" -#: instances/views.py:634 +#: instances/views.py:633 msgid "The VM was moved meanwhile; try again." msgstr "该虚拟机在此期间已被移动;请重试。" -#: instances/views.py:746 +#: instances/views.py:745 msgid "" "The running VM has no free PCI slot for another disk on this bus: choose the " "scsi bus if the VM has a SCSI controller, or shut the VM down and add the " @@ -5572,7 +5564,7 @@ msgstr "" "运行中的虚拟机在此总线上没有可用 PCI 插槽来添加磁盘:如果虚拟机有 SCSI 控制器,请选择 scsi " "总线;或关闭虚拟机后再添加磁盘。“磁盘”选项卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。新卷会保留在其存储池中,可作为现有卷挂载。" -#: instances/views.py:750 +#: instances/views.py:749 msgid "" "The running VM has no free PCI slot for the SCSI controller the disk needs: " "shut the VM down and add the disk then; Add PCIe slots on the Disks tab gives" @@ -5582,262 +5574,262 @@ msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加磁盘所需的 SCSI 控制器:请关闭虚拟机后再添加磁盘。“磁盘”选项卡上的“添加 PCIe " "插槽”可使其从下次启动起获得可用插槽。新卷会保留在其存储池中,可作为现有卷挂载。" -#: instances/views.py:768 +#: instances/views.py:767 #, python-format msgid "Invalid disk options: %(options)s" msgstr "无效的磁盘选项:%(options)s" -#: instances/views.py:778 instances/views.py:793 +#: instances/views.py:777 instances/views.py:792 msgid "Templates cannot be started." msgstr "模板无法启动。" -#: instances/views.py:889 +#: instances/views.py:888 #, python-format msgid "Disk %(path)s was kept: a disk file that stays needs it" msgstr "磁盘 %(path)s 已保留:某个保留的磁盘文件依赖它" -#: instances/views.py:895 +#: instances/views.py:894 #, python-format msgid "The VM is removed, but disk %(path)s was not deleted: %(err)s" msgstr "虚拟机已删除,但磁盘 %(path)s 未被删除:%(err)s" -#: instances/views.py:904 +#: instances/views.py:903 #, python-format msgid "Disk %(path)s is used by another VM and was kept" msgstr "磁盘 %(path)s 正被另一台虚拟机使用,已保留" -#: instances/views.py:1026 +#: instances/views.py:1025 #, python-format msgid "Set the gstfsd key of %(compute)s first (Computes, edit the host)" msgstr "请先设置 %(compute)s 的 gstfsd 密钥(计算节点,编辑该主机)" -#: instances/views.py:1032 instances/views.py:1046 instances/views.py:1055 +#: instances/views.py:1031 instances/views.py:1045 instances/views.py:1054 #, python-format msgid "gstfsd error: %(err)s" msgstr "gstfsd 错误:%(err)s" -#: instances/views.py:1056 +#: instances/views.py:1055 msgid "the reply is not signed with the key" msgstr "回复未使用该密钥签名" -#: instances/views.py:1064 +#: instances/views.py:1063 msgid "Shut the VM down, or start its QEMU guest agent, and try again" msgstr "请关闭虚拟机,或启动其 QEMU 客户机代理,然后重试" -#: instances/views.py:1077 +#: instances/views.py:1076 msgid "The change may still be made when the agent answers again." msgstr "当代理再次响应时,此更改仍可能生效。" -#: instances/views.py:1104 +#: instances/views.py:1103 msgid "Reset root password" msgstr "重置 root 密码" -#: instances/views.py:1108 +#: instances/views.py:1107 msgid "Enter a password" msgstr "请输入密码" -#: instances/views.py:1122 +#: instances/views.py:1121 msgid "Select an SSH public key" msgstr "请选择 SSH 公钥" -#: instances/views.py:1144 +#: instances/views.py:1143 #, python-format msgid "Installed new SSH public key %(keyname)s" msgstr "已安装新的 SSH 公钥 %(keyname)s" -#: instances/views.py:1164 +#: instances/views.py:1163 msgid "Enter a whole number of vCPUs" msgstr "请输入整数个 vCPU" -#: instances/views.py:1168 +#: instances/views.py:1167 msgid "Shut off the VM to change its vCPUs" msgstr "请关闭虚拟机以更改其 vCPU" -#: instances/views.py:1171 +#: instances/views.py:1170 msgid "The current vCPUs cannot be more than the maximum" msgstr "当前 vCPU 数不能超过最大值" -#: instances/views.py:1178 +#: instances/views.py:1177 #, python-format msgid "%(quota)s: cannot resize the CPU of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的 CPU。" -#: instances/views.py:1186 +#: instances/views.py:1185 #, python-format msgid "vCPUs set to %(cur)s (maximum %(max)s)" msgstr "vCPU 已设为 %(cur)s(最大 %(max)s)" -#: instances/views.py:1205 +#: instances/views.py:1204 msgid "Enter a whole number for memory" msgstr "请输入整数内存值" -#: instances/views.py:1208 +#: instances/views.py:1207 msgid "The current memory cannot be more than the maximum" msgstr "当前内存不能超过最大值" -#: instances/views.py:1212 +#: instances/views.py:1211 #, python-format msgid "%(quota)s: cannot resize the memory of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的内存。" -#: instances/views.py:1218 +#: instances/views.py:1217 #, python-format msgid "Memory set to %(cur)s MiB (maximum %(max)s MiB)" msgstr "内存已设为 %(cur)s MiB(最大 %(max)s MiB)" -#: instances/views.py:1238 +#: instances/views.py:1237 msgid "Enter disk sizes as whole GiB" msgstr "请以整数 GiB 输入磁盘大小" -#: instances/views.py:1242 +#: instances/views.py:1241 #, python-format msgid "%(dev)s is %(size)s: a disk cannot shrink" msgstr "%(dev)s 为 %(size)s:磁盘不能缩小" -#: instances/views.py:1250 +#: instances/views.py:1249 msgid "No disks were selected or valid for resizing." msgstr "未选择磁盘或没有可调整大小的有效磁盘。" -#: instances/views.py:1259 +#: instances/views.py:1258 #, python-format msgid "%(quota)s: cannot resize the disks of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的磁盘。" -#: instances/views.py:1271 +#: instances/views.py:1270 #, python-format msgid "The storage pool of %(dev)s cannot resize its volumes" msgstr "%(dev)s 所在的存储池无法调整其卷的大小" -#: instances/views.py:1273 +#: instances/views.py:1272 #, python-format msgid "Disk is resized: %(dev)s" msgstr "磁盘已调整大小:%(dev)s" -#: instances/views.py:1367 +#: instances/views.py:1366 msgid "The VM's machine has no PCIe slots to add" msgstr "该虚拟机的机器类型没有可添加的 PCIe 插槽" -#: instances/views.py:1372 +#: instances/views.py:1371 #, python-format msgid "%(count)s PCIe slots added" msgstr "已添加 %(count)s 个 PCIe 插槽" -#: instances/views.py:1374 +#: instances/views.py:1373 #, python-format msgid "%(count)s PCIe slots added: the VM gets them at its next start" msgstr "已添加 %(count)s 个 PCIe 插槽:虚拟机在下次启动时获得它们" -#: instances/views.py:1505 +#: instances/views.py:1504 msgid "Volume changes are applied. But it will be activated after shutdown" msgstr "卷更改已应用,但将在关机后生效" -#: instances/views.py:1510 +#: instances/views.py:1509 msgid "Volume is changed successfully." msgstr "卷已成功更改。" -#: instances/views.py:1528 +#: instances/views.py:1527 #, python-format msgid "Disk %(dev)s is not a storage volume of this instance" msgstr "磁盘 %(dev)s 不是此虚拟机的存储卷" -#: instances/views.py:1535 +#: instances/views.py:1534 #, python-format msgid "Disk %(dev)s has a pending change; delete it once the VM is shut down" msgstr "磁盘 %(dev)s 有待生效的更改;请在虚拟机关机后删除它" -#: instances/views.py:1550 +#: instances/views.py:1549 #, python-format msgid "Volume %(vol)s is used by another VM; detach it instead" msgstr "卷 %(vol)s 正被另一台虚拟机使用;请改为分离它" -#: instances/views.py:1562 +#: instances/views.py:1561 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " "it from the storage pool once the VM is shut down." msgstr "客户机尚未释放磁盘 %(dev)s;卷 %(vol)s 已保留。请在虚拟机关机后从存储池中删除它。" -#: instances/views.py:1573 +#: instances/views.py:1572 #, python-format msgid "Disk %(dev)s was detached, but its volume was kept: %(err)s" msgstr "磁盘 %(dev)s 已分离,但其卷已保留:%(err)s" -#: instances/views.py:1599 +#: instances/views.py:1598 #, python-format msgid "This VM cannot take a CD-ROM on the %(bus)s bus now" msgstr "该虚拟机现在无法在 %(bus)s 总线上添加 CD-ROM" -#: instances/views.py:1602 +#: instances/views.py:1601 msgid "A USB CD-ROM needs an ISO image: libvirt has no empty USB drive" msgstr "USB CD-ROM 需要 ISO 镜像:libvirt 不支持空的 USB 驱动器" -#: instances/views.py:1683 +#: instances/views.py:1682 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "未重新读取存储池 %(pool)s:%(err)s" -#: instances/views.py:1704 +#: instances/views.py:1703 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "快照未删除:%(err)s" -#: instances/views.py:1819 +#: instances/views.py:1818 msgid "Add at least one device to the boot order." msgstr "请至少向启动顺序中添加一个设备。" -#: instances/views.py:1833 +#: instances/views.py:1832 msgid "Boot order changed. It applies at the next start." msgstr "启动顺序已更改,将在下次启动时生效。" -#: instances/views.py:1835 +#: instances/views.py:1834 msgid "Boot order changed successfully." msgstr "启动顺序已成功更改。" -#: instances/views.py:1855 +#: instances/views.py:1854 msgid "The XML is empty" msgstr "XML 为空" -#: instances/views.py:1859 instances/views.py:2479 +#: instances/views.py:1858 instances/views.py:2478 #, python-format msgid "The XML is not well-formed: %(error)s" msgstr "XML 格式不正确:%(error)s" -#: instances/views.py:1861 +#: instances/views.py:1860 #, python-format msgid "The XML must keep the VM's UUID %(uuid)s." msgstr "XML 必须保留虚拟机的 UUID %(uuid)s。" -#: instances/views.py:1865 +#: instances/views.py:1864 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." msgstr "自打开编辑器以来定义已被更改。请重新加载页面以编辑当前定义。" -#: instances/views.py:1877 +#: instances/views.py:1876 msgid "The XML definition was saved." msgstr "XML 定义已保存。" -#: instances/views.py:1879 +#: instances/views.py:1878 msgid "The XML definition was saved; the VM uses it from its next start." msgstr "XML 定义已保存;虚拟机从下次启动起使用它。" -#: instances/views.py:1960 +#: instances/views.py:1959 msgid "Select one network interface to change" msgstr "请选择一个要更改的网络接口" -#: instances/views.py:1998 +#: instances/views.py:1997 msgid "Network Device Config is changed. Please shutdown instance to activate." msgstr "网络设备配置已更改。请关闭虚拟机以使其生效。" -#: instances/views.py:2000 +#: instances/views.py:1999 msgid "Network device changed" msgstr "网络设备已更改" -#: instances/views.py:2012 +#: instances/views.py:2011 msgid "No network selected" msgstr "未选择网络" -#: instances/views.py:2032 +#: instances/views.py:2031 msgid "" "The running VM has no free PCI slot for another network device: shut it down " "and add the device then; Add PCIe slots on the Disks tab gives it free ones " @@ -5845,137 +5837,137 @@ msgid "" msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加网络设备:请关机后再添加设备。“磁盘”选项卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。" -#: instances/views.py:2073 instances/views.py:2079 +#: instances/views.py:2072 instances/views.py:2078 msgid "The VM has it" msgstr "虚拟机已有此设备" -#: instances/views.py:2110 +#: instances/views.py:2109 #, python-format msgid "The host has no USB device %(device)s" msgstr "主机上没有 USB 设备 %(device)s" -#: instances/views.py:2131 +#: instances/views.py:2130 #, python-format msgid "The host has no PCI device %(device)s" msgstr "主机上没有 PCI 设备 %(device)s" -#: instances/views.py:2149 +#: instances/views.py:2148 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go yet;" " it stays in the running VM until it does or the VM stops." msgstr "已请求移除 PCI 设备 %(address)s:客户机尚未释放它;在客户机释放或虚拟机停止之前,它仍保留在运行中的虚拟机中。" -#: instances/views.py:2194 instances/views.py:2224 +#: instances/views.py:2193 instances/views.py:2223 msgid "Select a network interface and a QoS direction" msgstr "请选择网络接口和 QoS 方向" -#: instances/views.py:2197 vrtManager/network.py:459 +#: instances/views.py:2196 vrtManager/network.py:459 msgid "QoS rates must be whole numbers" msgstr "QoS 速率必须为整数" -#: instances/views.py:2204 networks/views.py:229 +#: instances/views.py:2203 networks/views.py:229 #, python-format msgid "%(qos_dir)s QoS is set" msgstr "%(qos_dir)s QoS 已设置" -#: instances/views.py:2209 +#: instances/views.py:2208 #, python-format msgid "" "%(qos_dir)s QoS is set. A running VM gets it after it is powered off and on." msgstr "%(qos_dir)s QoS 已设置。运行中的虚拟机需关机再开机后才能生效。" -#: instances/views.py:2231 networks/views.py:255 +#: instances/views.py:2230 networks/views.py:255 #, python-format msgid "%(qos_dir)s QoS is deleted" msgstr "%(qos_dir)s QoS 已删除" -#: instances/views.py:2236 +#: instances/views.py:2235 #, python-format msgid "" "%(qos_dir)s QoS is deleted. A running VM keeps the old limit until it is " "powered off and on." msgstr "%(qos_dir)s QoS 已删除。运行中的虚拟机在关机再开机之前保留旧的限制。" -#: instances/views.py:2264 +#: instances/views.py:2263 msgid "Only one owner is allowed and the one already added" msgstr "只允许一个所有者,且已添加" -#: instances/views.py:2266 +#: instances/views.py:2265 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s 已是所有者" -#: instances/views.py:2310 +#: instances/views.py:2309 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "控制台设置未保存:%(errors)s" -#: instances/views.py:2332 +#: instances/views.py:2331 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." msgstr "设置控制台密码出错。请检查虚拟机是否有图形设备。" -#: instances/views.py:2379 +#: instances/views.py:2378 msgid "Shut the VM down to change whether it is a template." msgstr "请关闭虚拟机以更改其是否为模板。" -#: instances/views.py:2385 +#: instances/views.py:2384 #, python-format msgid "%(quota)s: '%(instance_name)s' stays a template." msgstr "%(quota)s:“%(instance_name)s”仍为模板。" -#: instances/views.py:2467 +#: instances/views.py:2466 msgid "The XML has no name" msgstr "XML 中没有名称" -#: instances/views.py:2481 webvirtcloud/middleware.py:79 +#: instances/views.py:2480 webvirtcloud/middleware.py:79 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt 错误 - %(exception)s" -#: instances/views.py:2488 +#: instances/views.py:2487 msgid "An empty disk of the size you set" msgstr "按设定大小创建的空磁盘" -#: instances/views.py:2489 +#: instances/views.py:2488 msgid "Volumes already in a pool" msgstr "存储池中已有的卷" -#: instances/views.py:2490 +#: instances/views.py:2489 msgid "A copy of a template volume" msgstr "模板卷的副本" -#: instances/views.py:2579 +#: instances/views.py:2578 msgid "You haven't defined any storage pools" msgstr "您尚未定义任何存储池" -#: instances/views.py:2581 +#: instances/views.py:2580 msgid "You haven't defined any network pools" msgstr "您尚未定义任何网络池" -#: instances/views.py:2644 +#: instances/views.py:2643 msgid "Flavor Created" msgstr "规格已创建" -#: instances/views.py:2652 +#: instances/views.py:2651 msgid "Create Flavor" msgstr "创建规格" -#: instances/views.py:2667 +#: instances/views.py:2666 msgid "Flavor Updated" msgstr "规格已更新" -#: instances/views.py:2673 +#: instances/views.py:2672 msgid "Update Flavor" msgstr "更新规格" -#: instances/views.py:2685 +#: instances/views.py:2684 msgid "Flavor Deleted" msgstr "规格已删除" -#: instances/views.py:2691 +#: instances/views.py:2690 msgid "Only the size template goes; VMs made from it keep their size." msgstr "仅删除此规格;由它创建的虚拟机保持其大小。" @@ -8472,150 +8464,150 @@ msgstr "%(error)s;请从目标主机删除不完整的磁盘副本:%(left)s" msgid "The destination host cannot see the NVRAM file %(path)s" msgstr "目标主机看不到 NVRAM 文件 %(path)s" -#: vrtManager/instance.py:494 +#: vrtManager/instance.py:499 #, python-format msgid "%(type)s disk, cannot be checked" msgstr "%(type)s 磁盘,无法检查" -#: vrtManager/instance.py:534 +#: vrtManager/instance.py:539 #, python-format msgid "The destination host already has a VM %(key)s" msgstr "目标主机上已有虚拟机 %(key)s" -#: vrtManager/instance.py:556 +#: vrtManager/instance.py:561 msgid "The VM was started on the source host during the migration" msgstr "迁移期间虚拟机在源主机上被启动" -#: vrtManager/instance.py:572 +#: vrtManager/instance.py:577 #, python-format msgid "" "%(error)s; the VM may now be defined only on the destination host: check both" " hosts" msgstr "%(error)s;虚拟机现在可能只在目标主机上定义:请检查两台主机" -#: vrtManager/instance.py:578 +#: vrtManager/instance.py:583 #, python-format msgid "" "%(error)s; the VM is now defined on both hosts, remove it from the " "destination: %(undo_error)s" msgstr "%(error)s;虚拟机现在在两台主机上都有定义,请从目标主机删除它:%(undo_error)s" -#: vrtManager/instance.py:584 +#: vrtManager/instance.py:589 msgid "" "Snapshot names are 1-64 letters, digits, '.', '_' or '-' and do not start " "with '.'" msgstr "快照名称为 1-64 个字母、数字、'.'、'_' 或 '-',且不能以 '.' 开头" -#: vrtManager/instance.py:1077 +#: vrtManager/instance.py:1082 msgid "" "A device other than a disk or NIC is in the boot order: change it in the XML " "editor" msgstr "启动顺序中有磁盘或网卡以外的设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:1089 +#: vrtManager/instance.py:1094 msgid "Invalid Device Type for boot order" msgstr "启动顺序的设备类型无效" -#: vrtManager/instance.py:1092 +#: vrtManager/instance.py:1097 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "启动设备 %(dev)s 不在定义中" -#: vrtManager/instance.py:1112 +#: vrtManager/instance.py:1117 #, python-format msgid "CD-ROM %(dev)s is not in the running definition" msgstr "CD-ROM %(dev)s 不在运行中的定义中" -#: vrtManager/instance.py:1113 +#: vrtManager/instance.py:1118 #, python-format msgid "CD-ROM %(dev)s is not in the persistent definition" msgstr "CD-ROM %(dev)s 不在持久定义中" -#: vrtManager/instance.py:1125 +#: vrtManager/instance.py:1130 #, python-format msgid "Media of %(dev)s changed in the running VM only: %(err)s" msgstr "%(dev)s 的介质仅在运行中的虚拟机中更改:%(err)s" -#: vrtManager/instance.py:1136 +#: vrtManager/instance.py:1141 #, python-format msgid "ISO image %(image)s was not found" msgstr "未找到 ISO 镜像 %(image)s" -#: vrtManager/instance.py:1138 +#: vrtManager/instance.py:1143 #, python-format msgid "ISO image %(image)s is in more than one storage pool" msgstr "ISO 镜像 %(image)s 位于多个存储池中" -#: vrtManager/instance.py:1245 +#: vrtManager/instance.py:1250 #, python-format msgid "Disk %(target_dev)s is not in the VM's definition" msgstr "磁盘 %(target_dev)s 不在虚拟机的定义中" -#: vrtManager/instance.py:1373 +#: vrtManager/instance.py:1378 msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "请先关闭虚拟机,再启用 vCPU 热插拔" -#: vrtManager/instance.py:1836 +#: vrtManager/instance.py:1841 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "虚拟机有外部快照;内部快照不能与其混用" -#: vrtManager/instance.py:1868 +#: vrtManager/instance.py:1873 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "含内存的快照不会静默文件系统;它保存整个客户机状态" -#: vrtManager/instance.py:1870 +#: vrtManager/instance.py:1875 msgid "Only a running VM's file systems can be frozen" msgstr "只有运行中的虚拟机的文件系统可以冻结" -#: vrtManager/instance.py:1872 +#: vrtManager/instance.py:1877 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU 客户机代理未连接;文件系统由它冻结" -#: vrtManager/instance.py:1875 +#: vrtManager/instance.py:1880 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "虚拟机有内部快照;外部快照不能与其混用" -#: vrtManager/instance.py:1880 +#: vrtManager/instance.py:1885 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "上次还原后存在更新的快照;请先删除它们" -#: vrtManager/instance.py:1883 +#: vrtManager/instance.py:1888 msgid "No snapshot is current; revert to a snapshot first" msgstr "没有当前快照;请先还原到某个快照" -#: vrtManager/instance.py:1889 +#: vrtManager/instance.py:1894 #, python-format msgid "Eject the media from %(dev)s first" msgstr "请先弹出 %(dev)s 中的介质" -#: vrtManager/instance.py:1891 +#: vrtManager/instance.py:1896 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "磁盘 %(dev)s 不是文件;外部快照需要文件磁盘" -#: vrtManager/instance.py:1899 +#: vrtManager/instance.py:1904 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " "%(err)s" msgstr "无法刷新存储池,其可用空间未知:%(err)s" -#: vrtManager/instance.py:1920 +#: vrtManager/instance.py:1925 msgid "Memory is saved only from a running VM" msgstr "只能保存运行中的虚拟机的内存" -#: vrtManager/instance.py:1922 +#: vrtManager/instance.py:1927 msgid "The VM has no disk to keep its memory next to" msgstr "虚拟机没有可存放其内存的磁盘" -#: vrtManager/instance.py:1926 +#: vrtManager/instance.py:1931 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "%(disk)s 不在存储池中;内存只能保存到存储池中" -#: vrtManager/instance.py:1957 +#: vrtManager/instance.py:1962 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -8625,156 +8617,156 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;快照需要 %(size).1f GiB(其中虚拟机磁盘的 %(percent)g%%,至少 " "%(minimum)g GiB,若保存内存则另加内存)" -#: vrtManager/instance.py:1975 +#: vrtManager/instance.py:1980 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" msgstr "此快照由旧版本在 UEFI 虚拟机上创建,无法还原;请将其删除" -#: vrtManager/instance.py:2005 +#: vrtManager/instance.py:2010 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " "running." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机正在运行。" -#: vrtManager/instance.py:2007 +#: vrtManager/instance.py:2012 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " "off." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机已关机。" -#: vrtManager/instance.py:2170 +#: vrtManager/instance.py:2175 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "仅当虚拟机已定义且处于运行、暂停或关机状态时才能移动磁盘" -#: vrtManager/instance.py:2172 +#: vrtManager/instance.py:2177 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" msgstr "有快照、保存的状态或正在运行块任务的虚拟机的磁盘不能移动" -#: vrtManager/instance.py:2180 +#: vrtManager/instance.py:2185 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " "start's definition" msgstr "%(dev)s 不是该虚拟机在运行中的定义和下次启动定义中相同的磁盘文件" -#: vrtManager/instance.py:2185 +#: vrtManager/instance.py:2190 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s 不能移动:只能移动可写的 raw 和 qcow2 磁盘" -#: vrtManager/instance.py:2192 +#: vrtManager/instance.py:2197 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s 不能移动:没有存储池包含 %(path)s" -#: vrtManager/instance.py:2194 +#: vrtManager/instance.py:2199 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s 不能移动:它有后备文件" -#: vrtManager/instance.py:2197 +#: vrtManager/instance.py:2202 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s 不是此主机上活动的磁盘文件存储池" -#: vrtManager/instance.py:2200 +#: vrtManager/instance.py:2205 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s 已在存储池 %(pool_name)s 中" -#: vrtManager/instance.py:2204 +#: vrtManager/instance.py:2209 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "存储池 %(pool_name)s 中已有文件 %(name)s" -#: vrtManager/instance.py:2228 +#: vrtManager/instance.py:2233 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s 的复制在完成前结束" -#: vrtManager/instance.py:2273 +#: vrtManager/instance.py:2278 #, python-format msgid "%(error)s; remove %(dest)s if it is there: %(cleanup_error)s" msgstr "%(error)s;如果 %(dest)s 存在请将其删除:%(cleanup_error)s" -#: vrtManager/instance.py:2275 +#: vrtManager/instance.py:2280 #, python-format msgid "%(error)s; the VM may use %(dest)s now: check its disk %(dev)s" msgstr "%(error)s;虚拟机现在可能在使用 %(dest)s:请检查其磁盘 %(dev)s" -#: vrtManager/instance.py:2282 +#: vrtManager/instance.py:2287 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的内部快照" -#: vrtManager/instance.py:2291 +#: vrtManager/instance.py:2296 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "虚拟机有保存的状态;请先启动它或删除保存的状态" -#: vrtManager/instance.py:2293 +#: vrtManager/instance.py:2298 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "此虚拟机上仍有快照任务在运行;请在其结束后重试" -#: vrtManager/instance.py:2303 +#: vrtManager/instance.py:2308 msgid "Shut the VM down to revert to an internal snapshot" msgstr "请关闭虚拟机后再还原到内部快照" -#: vrtManager/instance.py:2392 +#: vrtManager/instance.py:2397 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM 不是文件的虚拟机无法克隆" -#: vrtManager/instance.py:2460 +#: vrtManager/instance.py:2465 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(path)s" -#: vrtManager/instance.py:2470 +#: vrtManager/instance.py:2475 msgid "Shut the VM down before cloning it" msgstr "请先关闭虚拟机再克隆" -#: vrtManager/instance.py:2524 +#: vrtManager/instance.py:2529 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(leftovers)s" -#: vrtManager/instance.py:2535 +#: vrtManager/instance.py:2540 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "在线克隆需要 libvirt 11.10 或更高版本;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2538 +#: vrtManager/instance.py:2543 msgid "A VM with a TPM is cloned only shut down" msgstr "带 TPM 的虚拟机只能在关机时克隆" -#: vrtManager/instance.py:2541 +#: vrtManager/instance.py:2546 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "磁盘 %(dev)s 不是本地文件;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2543 +#: vrtManager/instance.py:2548 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "磁盘 %(dev)s 是可共享的;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2548 +#: vrtManager/instance.py:2553 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "磁盘 %(dev)s 在下次启动时会改变;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2550 +#: vrtManager/instance.py:2555 msgid "Another job is running on the VM; clone it when that ends" msgstr "虚拟机上有另一个任务正在运行;请在其结束后再克隆" -#: vrtManager/instance.py:2563 +#: vrtManager/instance.py:2568 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "卷 %(name)s 已存在于存储池 %(pool)s 中" -#: vrtManager/instance.py:2582 +#: vrtManager/instance.py:2587 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -8783,92 +8775,92 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;克隆需要 %(size).1f GiB(复制的磁盘,再加其 %(percent)g%%,至少" " %(minimum)g GiB)" -#: vrtManager/instance.py:2721 +#: vrtManager/instance.py:2726 msgid "A network interface that is a host device is removed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中删除" -#: vrtManager/instance.py:2737 +#: vrtManager/instance.py:2742 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "没有 MAC 为 %(old_mac)s 的网络接口" -#: vrtManager/instance.py:2740 +#: vrtManager/instance.py:2745 msgid "A network interface that is a host device is changed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中修改" -#: vrtManager/instance.py:2831 +#: vrtManager/instance.py:2836 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" msgstr "虚拟机只能在运行时或无保存的状态的关机时更改其 PCI 设备" -#: vrtManager/instance.py:2843 +#: vrtManager/instance.py:2848 #, python-format msgid "%(err)s; whether the VM has PCI device %(address)s now is not known" msgstr "%(err)s;虚拟机现在是否有 PCI 设备 %(address)s 未知" -#: vrtManager/instance.py:2845 +#: vrtManager/instance.py:2850 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" msgstr "%(err)s;PCI 设备 %(address)s:虚拟机未运行,下次启动时有它" -#: vrtManager/instance.py:2847 +#: vrtManager/instance.py:2852 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " "not have it" msgstr "%(err)s;PCI 设备 %(address)s:虚拟机未运行,下次启动时没有它" -#: vrtManager/instance.py:2848 +#: vrtManager/instance.py:2853 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机有它,下次启动时有它" -#: vrtManager/instance.py:2850 +#: vrtManager/instance.py:2855 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " "not have it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机有它,下次启动时没有它" -#: vrtManager/instance.py:2852 +#: vrtManager/instance.py:2857 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " "start has it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机没有它,下次启动时有它" -#: vrtManager/instance.py:2854 +#: vrtManager/instance.py:2859 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " "start does not have it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机没有它,下次启动时没有它" -#: vrtManager/instance.py:2888 +#: vrtManager/instance.py:2893 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "虚拟机没有 PCI 设备 %(address)s" -#: vrtManager/instance.py:2906 +#: vrtManager/instance.py:2911 msgid "The VM has no USB controller" msgstr "虚拟机没有 USB 控制器" -#: vrtManager/instance.py:2925 +#: vrtManager/instance.py:2930 msgid "The VM has no such USB device" msgstr "虚拟机没有此 USB 设备" -#: vrtManager/instance.py:2966 +#: vrtManager/instance.py:2971 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "虚拟机有自己的 RNG 设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:2993 +#: vrtManager/instance.py:2998 msgid "The VM has its own TPM: change it in the XML editor" msgstr "虚拟机有自己的 TPM:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3012 +#: vrtManager/instance.py:3017 #, python-format msgid "Unknown crash action %(action)s" msgstr "未知的崩溃操作 %(action)s" diff --git a/static/js/user_form.js b/static/js/user_form.js new file mode 100644 index 00000000..d7d73ad8 --- /dev/null +++ b/static/js/user_form.js @@ -0,0 +1,11 @@ +// The user form (admin/user_form.html): a superuser needs no quota or +// permissions, so their sections hide while Superuser is chosen; a limit's +// No limit box disables its number, which the server then keeps as -1. +document.querySelectorAll('input[name=role]').forEach((radio) => radio.addEventListener('change', () => { + const superuser = radio.value === 'superuser'; + document.querySelectorAll('[data-not-superuser]').forEach((section) => { section.hidden = superuser; }); + document.getElementById('superuser-note').hidden = !superuser; +})); +document.querySelectorAll('[data-no-limit]').forEach((box) => box.addEventListener('change', () => { + document.getElementById(box.dataset.noLimit).disabled = box.checked; +}));