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 6df6e5f4..d5d439ca 100644 Binary files a/locale/tr/LC_MESSAGES/django.mo and b/locale/tr/LC_MESSAGES/django.mo differ 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 4cf6135a..ae508539 100644 Binary files a/locale/zh/LC_MESSAGES/django.mo and b/locale/zh/LC_MESSAGES/django.mo differ 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; +}));