From 4da64c46cd2993e3eaab7ad5b9e86c5acdb58ce9 Mon Sep 17 00:00:00 2001 From: catborise Date: Tue, 3 Nov 2026 18:18:51 +0300 Subject: [PATCH] feat(locale): quota refusals and connection errors show in the reader's language MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A quota refusal put the English name of the quota (cpu, memory, disk, instance) into a translated sentence, so a Turkish page read "memory kotası doldu". check_user_quota now returns which quota and its numbers (QuotaExceeded), each quota has a whole sentence, and the refusals put that sentence before what is refused; QUOTA_DEBUG adds the numbers as before. The clone job stores the refusal as a message, so the Jobs page shows it in its reader's language. The connection errors of vrtManager (did not answer within, still waited for, closed, failed with libvirt's text) were English f-strings; they are messages now, each close reason a whole one. A connection that died without a close callback raised an error reading "None"; it now names the host. Logs keep the English text. --- instances/jobs.py | 9 +- instances/tests/test_quota.py | 16 +- instances/tests/test_template_quota.py | 6 +- instances/utils.py | 48 ++- instances/views.py | 43 +- locale/tr/LC_MESSAGES/django.mo | Bin 190376 -> 191451 bytes locale/tr/LC_MESSAGES/django.po | 564 ++++++++++++++----------- locale/zh/LC_MESSAGES/django.mo | Bin 177845 -> 178916 bytes locale/zh/LC_MESSAGES/django.po | 548 +++++++++++++----------- vrtManager/connection.py | 29 +- vrtManager/tests/test_connection.py | 2 +- 11 files changed, 698 insertions(+), 567 deletions(-) diff --git a/instances/jobs.py b/instances/jobs.py index b3dd5599..54bf23a1 100644 --- a/instances/jobs.py +++ b/instances/jobs.py @@ -124,7 +124,7 @@ def clone_data(user, instance, fields): """The clone's settings from the form fields and the source as it is now, and what it adds to the user's quota; OperationError with the reason when it cannot be made.""" - from instances.views import VOLUME_NAME_RE, quota_refused + from instances.views import VOLUME_NAME_RE data = dict() data["name"] = fields.get("name", "").strip() @@ -187,10 +187,11 @@ def clone_data(user, instance, fields): if key.startswith("disk-") and value is not None and not VOLUME_NAME_RE.fullmatch(value) ] + if not user.is_superuser and quota_msg == utils.QUOTA_UNVERIFIED: + raise util.OperationError(utils.QUOTA_UNVERIFIED_TEXT) if not user.is_superuser and quota_msg: - raise util.OperationError(quota_refused(quota_msg, _( - "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!" - )), quota_msg=quota_msg, clone_name=data["name"]) + raise util.OperationError(_("%(quota)s: cannot create '%(clone_name)s'."), + quota=utils.quota_message(quota_msg), clone_name=data["name"]) if check_instance: raise util.OperationError(_("Instance '%(clone_name)s' already exists!"), clone_name=data["name"]) if not re.match(r"^[a-zA-Z0-9-]+$", data["name"]): diff --git a/instances/tests/test_quota.py b/instances/tests/test_quota.py index 5d18ef3b..1466f918 100644 --- a/instances/tests/test_quota.py +++ b/instances/tests/test_quota.py @@ -12,7 +12,8 @@ from django.contrib.messages import get_messages from django.test import TestCase from django.urls import reverse from instances.models import Instance -from instances.utils import QUOTA_UNVERIFIED, check_user_quota +from instances.utils import QUOTA_UNVERIFIED, QuotaExceeded, check_user_quota, quota_message +from vrtManager.util import render from libvirt import VIR_DOMAIN_PAUSED, VIR_DOMAIN_RUNNING from operations.models import Operation from vrtManager.util import OperationError @@ -71,7 +72,7 @@ class QuotaTests(TestCase): "instances.utils.wvmInstance", side_effect=reader ) as wvm: result = check_user_quota(self.user, *delta) - return result.split(" ")[0], wvm.call_count # without the QUOTA_DEBUG detail + return getattr(result, "kind", result), wvm.call_count # a QuotaExceeded names the quota def test_vms_on_a_host_without_a_tcp_route_are_counted(self): # an ssh_config alias: the old TCP probe failed and skipped these VMs @@ -191,12 +192,15 @@ class QuotaTests(TestCase): for i in range(5): self.own(self.up, i) - for value, expected in (("True", "instance (6 > 5)"), ("False", "instance")): + with patch.object(Compute, "status", True), patch("instances.utils.wvmInstance", side_effect=vm_reader()): + exceeded = check_user_quota(self.user, 1, 0, 0, 0) + self.assertEqual(exceeded, QuotaExceeded("instance", 6, 5)) + for value, expected in (("True", "The quota of virtual machines is reached (6 > 5)"), + ("False", "The quota of virtual machines is reached")): with self.subTest(value=value): AppSettings.objects.filter(key="QUOTA_DEBUG").update(value=value) get_settings() - with patch.object(Compute, "status", True), patch("instances.utils.wvmInstance", side_effect=vm_reader()): - self.assertEqual(check_user_quota(self.user, 1, 0, 0, 0), expected) + self.assertEqual(render("%(quota)s", {"quota": quota_message(exceeded)}, str), expected) class QuotaViewTests(TestCase): @@ -228,7 +232,7 @@ class QuotaViewTests(TestCase): status=5) self.assertEqual(len(messages), 1) self.assertIn("a host of your virtual machines cannot be reached", messages[0]) - self.assertNotIn("quota reached", messages[0]) + self.assertNotIn("quota is reached", messages[0]) proxy.resize_cpu.assert_not_called() def test_running_vm_memory_charges_no_maximum_change(self): diff --git a/instances/tests/test_template_quota.py b/instances/tests/test_template_quota.py index 39de4de3..f7ff67bd 100644 --- a/instances/tests/test_template_quota.py +++ b/instances/tests/test_template_quota.py @@ -11,7 +11,7 @@ from django.contrib.messages import get_messages from django.test import TestCase from django.urls import reverse from instances.models import Instance -from instances.utils import QUOTA_UNVERIFIED +from instances.utils import QUOTA_UNVERIFIED, QuotaExceeded class TemplateFlagQuotaTests(TestCase): @@ -49,7 +49,7 @@ class TemplateFlagQuotaTests(TestCase): def test_over_quota_the_template_stays_a_template(self): Instance.objects.filter(pk=self.vm.pk).update(is_template=True) - _, messages = self.post(self.staff, is_template=False, quota="cpu") + _, messages = self.post(self.staff, is_template=False, quota=QuotaExceeded("cpu", 9, 8)) self.assertTrue(self.vm.is_template) self.assertTrue(any("quota" in m for m in messages), messages) @@ -70,6 +70,6 @@ class TemplateFlagQuotaTests(TestCase): def test_superusers_have_no_quota(self): Instance.objects.filter(pk=self.vm.pk).update(is_template=True) admin = get_user_model().objects.create_superuser("tq-admin", "tq@example.com", "pw") - check, _ = self.post(admin, is_template=False, quota="cpu") + check, _ = self.post(admin, is_template=False, quota=QuotaExceeded("cpu", 9, 8)) self.assertFalse(self.vm.is_template) check.assert_not_called() diff --git a/instances/utils.py b/instances/utils.py index 9b9b3b48..ee1ce19a 100644 --- a/instances/utils.py +++ b/instances/utils.py @@ -2,6 +2,7 @@ import os import random import re import string +from collections import namedtuple from accounts.models import UserInstance, UserAttributes from appsettings.settings import app_settings @@ -9,12 +10,13 @@ from computes.models import Compute from django.conf import settings from django.db import transaction from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext_noop from libvirt import libvirtError from logs.audit import reason, write from operations.models import Operation from vrtManager.connection import other_hosts, wvmConnect from vrtManager.instance import wvmInstance, wvmInstances -from vrtManager.util import OperationError +from vrtManager.util import OperationError, message from .models import Instance @@ -73,13 +75,34 @@ def disk_gib(disks): # check_user_quota could not read every VM of the user: an increase is refused QUOTA_UNVERIFIED = "unverified" +QUOTA_UNVERIFIED_TEXT = gettext_noop( + "The quota cannot be checked because a host of your virtual machines cannot be reached. Nothing was changed.") + +# The quota a change would exceed: instance, cpu, memory or disk, the total it +# would make and the limit +QuotaExceeded = namedtuple("QuotaExceeded", "kind total limit") +QUOTA_REACHED = { + "instance": gettext_noop("The quota of virtual machines is reached"), + "cpu": gettext_noop("The vCPU quota is reached"), + "memory": gettext_noop("The memory quota is reached"), + "disk": gettext_noop("The disk quota is reached"), +} + + +def quota_message(exceeded): + """The quota check's result as messages, with the numbers when QUOTA_DEBUG is on.""" + reached = message(QUOTA_REACHED[exceeded.kind]) + if app_settings.QUOTA_DEBUG != "True": + return [reached] + return [message(gettext_noop("%(quota)s (%(total)s > %(limit)s)"), + quota=[reached], total=exceeded.total, limit=exceeded.limit)] @other_hosts() def check_user_quota(user, instance, cpu, memory, disk_size): """ - Which quota the user would exceed by adding these amounts (instances, - vCPUs, memory MiB, disk GiB) to their VMs, or "". A quota of -1 has no + The quota the user would exceed by adding these amounts (instances, + vCPUs, memory MiB, disk GiB) to their VMs, a QuotaExceeded, or "". A quota of -1 has no limit; 0 allows none. QUOTA_UNVERIFIED if a VM that counts cannot be read (its host is down, the VM is gone): the usage is unknown, so an increase is refused. @@ -93,8 +116,6 @@ def check_user_quota(user, instance, cpu, memory, disk_size): if instance <= 0 and cpu <= 0 and memory <= 0 and disk_size <= 0: return msg - quota_debug = app_settings.QUOTA_DEBUG == "True" - user_instances = UserInstance.objects.filter(user=user, instance__is_template=False).select_related( "instance__compute" ) @@ -106,10 +127,7 @@ def check_user_quota(user, instance, cpu, memory, disk_size): ] instance += user_instances.count() + len(clones) if ua.max_instances >= 0 and instance > ua.max_instances: - msg = "instance" - if quota_debug: - msg += f" ({instance} > {ua.max_instances})" - return msg + return QuotaExceeded("instance", instance, ua.max_instances) if ua.max_cpus < 0 and ua.max_memory < 0 and ua.max_disk_size < 0: return msg @@ -141,17 +159,11 @@ def check_user_quota(user, instance, cpu, memory, disk_size): return QUOTA_UNVERIFIED if ua.max_cpus >= 0 and cpu > ua.max_cpus: - msg = "cpu" - if quota_debug: - msg += f" ({cpu} > {ua.max_cpus})" + msg = QuotaExceeded("cpu", cpu, ua.max_cpus) if ua.max_memory >= 0 and memory > ua.max_memory: - msg = "memory" - if quota_debug: - msg += f" ({memory} > {ua.max_memory})" + msg = QuotaExceeded("memory", memory, ua.max_memory) if ua.max_disk_size >= 0 and disk_size > ua.max_disk_size: - msg = "disk" - if quota_debug: - msg += f" ({disk_size} > {ua.max_disk_size})" + msg = QuotaExceeded("disk", disk_size, ua.max_disk_size) return msg diff --git a/instances/views.py b/instances/views.py index 42cd6cc1..eed36682 100755 --- a/instances/views.py +++ b/instances/views.py @@ -36,7 +36,7 @@ from django.urls import reverse from django.template.defaultfilters import filesizeformat from django.utils import timezone from django.utils.translation import gettext as _ -from django.utils.translation import gettext_lazy +from django.utils.translation import gettext_lazy, gettext_noop from django.views.decorators.http import require_POST from libvirt import (VIR_DOMAIN_PAUSED, VIR_DOMAIN_RUNNING, @@ -657,12 +657,12 @@ def serialize_instance_mutation(func): return wrapper -def quota_refused(quota_msg, refused): - """The message for a refused change: refused is the action's own - 'User %(quota_msg)s quota reached, ...' text, already formatted.""" - if quota_msg == utils.QUOTA_UNVERIFIED: - return _("The quota cannot be checked because a host of your virtual machines cannot be reached. Nothing was changed.") - return refused +def quota_refused(quota, text, **values): + """The message for a change the quota refuses: text names the change + after %(quota)s, the quota it would exceed.""" + if quota == utils.QUOTA_UNVERIFIED: + return _(utils.QUOTA_UNVERIFIED_TEXT) + return util.render(text, {"quota": utils.quota_message(quota), **values}, _) def serialize_user_quota(func): @@ -1174,12 +1174,8 @@ def resizevm_cpu(request, pk): request.user, 0, int(new_vcpu) - vcpu, 0, 0 ) if not request.user.is_superuser and quota_msg: - msg = quota_refused(quota_msg, _( - "User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!" - ) % { - "quota_msg": quota_msg, - "instance_name": instance.name, - }) + msg = quota_refused(quota_msg, gettext_noop("%(quota)s: cannot resize the CPU of '%(instance_name)s'."), + instance_name=instance.name) messages.error(request, msg) else: cur_vcpu = new_cur_vcpu @@ -1212,12 +1208,8 @@ def resize_memory(request, pk): return redirect(reverse("instances:instance", args=[instance.id]) + "#resize") quota_msg = utils.check_user_quota(request.user, 0, 0, int(new_memory) - memory, 0) if not request.user.is_superuser and quota_msg: - msg = quota_refused(quota_msg, _( - "User %(quota_msg)s quota reached, cannot resize memory of '%(instance_name)s'!" - ) % { - "quota_msg": quota_msg, - "instance_name": instance.name, - }) + msg = quota_refused(quota_msg, gettext_noop("%(quota)s: cannot resize the memory of '%(instance_name)s'."), + instance_name=instance.name) messages.error(request, msg) else: with audit_vm(request, instance, f"set memory to {new_cur_memory} MiB (maximum {new_memory} MiB)"): @@ -1263,12 +1255,8 @@ def resize_disk(request, pk): request.user, 0, 0, 0, disk_new_sum - disk_sum ) if not request.user.is_superuser and quota_msg: - msg = quota_refused(quota_msg, _( - "User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!" - ) % { - "quota_msg": quota_msg, - "instance_name": instance.name, - }) + msg = quota_refused(quota_msg, gettext_noop("%(quota)s: cannot resize the disks of '%(instance_name)s'."), + instance_name=instance.name) messages.error(request, msg) else: for disk in disks_new: @@ -2393,9 +2381,8 @@ def set_template(request, pk): quota_msg = utils.check_user_quota(request.user, 1, instance.vcpu, instance.memory, utils.disk_gib(instance.disks)) if quota_msg: - messages.error(request, quota_refused(quota_msg, _( - "User %(quota_msg)s quota reached, '%(instance_name)s' stays a template!" - ) % {"quota_msg": quota_msg, "instance_name": instance.name})) + messages.error(request, quota_refused(quota_msg, gettext_noop("%(quota)s: '%(instance_name)s' stays a template."), + instance_name=instance.name)) return _back(request, pk, "options") with audit_vm(request, instance, "mark as template" if is_template else "unmark as template"): instance.is_template = is_template diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index 6a9c4234716b5105109e2d5cdfb0332a38bbcce6..9c4bfc615f229fb11143ebef81458d1966df4a76 100644 GIT binary patch delta 44106 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 X`&P+UplfIQd;Yb3+NOWzpO^DD*bkzl delta 43034 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, 2020\n" "Language-Team: Turkish (https://www.transifex.com/catborise/teams/110663/" @@ -2669,43 +2669,41 @@ msgstr "Klon için belleği (MiB) tam sayı olarak girin" msgid "Choose the clone's name from the list of free names" msgstr "Klonun adını boş adlar listesinden seçin" -#: instances/jobs.py:192 +#: instances/jobs.py:193 #, python-format -msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!" -msgstr "" -"%(quota_msg)s' Kullanıcı kotası doldu, '%(clone_name)s' in CPU su yeniden " -"boyutlandırılamıyor!" +msgid "%(quota)s: cannot create '%(clone_name)s'." +msgstr "%(quota)s: '%(clone_name)s' oluşturulamıyor." -#: instances/jobs.py:195 instances/jobs.py:532 +#: instances/jobs.py:196 instances/jobs.py:533 #, python-format msgid "Instance '%(clone_name)s' already exists!" msgstr "'%(clone_name)s' sanal makinesi zaten mevcut!" -#: instances/jobs.py:197 +#: instances/jobs.py:198 #, python-format msgid "Instance name '%(clone_name)s' contains invalid characters!" msgstr "Sanal makine adı '%(clone_name)s' geçersiz karakterler içermektedir!" -#: instances/jobs.py:200 +#: instances/jobs.py:201 #, python-format msgid "Instance MAC '%(clone_mac)s' invalid format!" msgstr "Sanal makine MAC adresi '%(clone_mac)s' geçersiz biçemde belirtilmiş!" -#: instances/jobs.py:202 +#: instances/jobs.py:203 #, python-format msgid "Disk name '%(disk_name)s' contains invalid characters!" msgstr "Disk adı '%(disk_name)s' geçersiz karakterler içeriyor!" -#: instances/jobs.py:222 +#: instances/jobs.py:223 #, python-format msgid "The clone is made, but not as asked: %(error)s" msgstr "Klon oluşturuldu, ama istendiği gibi değil: %(error)s" -#: instances/jobs.py:270 +#: instances/jobs.py:271 msgid "The VM was not defined and no volume of it was left." msgstr "Sanal makine tanımlanmadı ve ondan geriye birim kalmadı." -#: instances/jobs.py:272 +#: instances/jobs.py:273 #, python-format msgid "" "The VM was not defined; check these volumes, then resolve this job: " @@ -2714,28 +2712,28 @@ msgstr "" "Sanal makine tanımlanmadı; şu birimleri kontrol edin, sonra bu işi çözün: " "%(volumes)s" -#: instances/jobs.py:293 +#: instances/jobs.py:294 msgid "Delete snapshot" msgstr "Anlık görüntüyü sil" -#: instances/jobs.py:303 vrtManager/instance.py:2304 +#: instances/jobs.py:304 vrtManager/instance.py:2280 #, 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" -#: instances/jobs.py:316 +#: instances/jobs.py:317 msgid "Merging the snapshot" msgstr "Anlık görüntü birleştiriliyor" -#: instances/jobs.py:335 +#: instances/jobs.py:336 msgid "The VM is no longer on its compute" msgstr "Sanal makine artık kendi sunucusunda değil" -#: instances/jobs.py:338 +#: instances/jobs.py:339 msgid "libvirt is still merging the snapshot" msgstr "libvirt anlık görüntüyü hâlâ birleştiriyor" -#: instances/jobs.py:346 +#: instances/jobs.py:347 msgid "" "The snapshot is still listed and no merge runs. It cannot be told whether " "the disks changed; check the VM before deleting the snapshot again or " @@ -2745,44 +2743,44 @@ msgstr "" "değişmediği bilinemiyor; anlık görüntüyü yeniden silmeden ya da ona dönmeden " "önce sanal makineyi kontrol edin." -#: instances/jobs.py:353 +#: instances/jobs.py:354 msgid "The VM is no longer on the compute the job ran on" msgstr "Sanal makine artık işin çalıştığı sunucuda değil" -#: instances/jobs.py:359 +#: instances/jobs.py:360 msgid "Take snapshot" msgstr "Anlık görüntü al" -#: instances/jobs.py:371 vrtManager/instance.py:1900 +#: instances/jobs.py:372 vrtManager/instance.py:1876 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "%(name)s adında bir anlık görüntü zaten var" -#: instances/jobs.py:383 +#: instances/jobs.py:384 msgid "Taking the snapshot" msgstr "Anlık görüntü alınıyor" -#: instances/jobs.py:396 +#: instances/jobs.py:397 msgid "libvirt is still taking the snapshot" msgstr "libvirt anlık görüntüyü hâlâ alıyor" -#: instances/jobs.py:399 +#: instances/jobs.py:400 msgid "The snapshot was not taken" msgstr "Anlık görüntü alınmadı" -#: instances/jobs.py:422 +#: instances/jobs.py:423 msgid "Revert snapshot" msgstr "Snapshota dön" -#: instances/jobs.py:451 +#: instances/jobs.py:452 msgid "Reverting the VM" msgstr "Sanal makine geri döndürülüyor" -#: instances/jobs.py:462 +#: instances/jobs.py:463 msgid "libvirt is still reverting the VM" msgstr "libvirt sanal makineyi hâlâ geri döndürüyor" -#: instances/jobs.py:466 +#: instances/jobs.py:467 msgid "" "It cannot be told whether the VM was reverted; check it, then revert again " "or resolve this job." @@ -2790,12 +2788,12 @@ msgstr "" "Sanal makinenin geri döndürülüp döndürülmediği bilinemiyor; kontrol edin, " "sonra yeniden geri döndürün ya da bu işi çözün." -#: instances/jobs.py:483 +#: instances/jobs.py:484 msgid "The VM must be running, paused or shut off to be cloned" msgstr "" "Klonlanmak için sanal makine çalışıyor, duraklatılmış ya da kapalı olmalı" -#: instances/jobs.py:484 +#: instances/jobs.py:485 #, python-format msgid "" "The guest's file systems could not be thawed (%(error)s); thaw them with: " @@ -2804,19 +2802,19 @@ msgstr "" "Konuğun dosya sistemleri çözülemedi (%(error)s); şununla çözün: virsh " "domfsthaw %(vm)s" -#: instances/jobs.py:503 +#: instances/jobs.py:504 msgid "Clone VM" msgstr "Sanal makineyi klonla" -#: instances/jobs.py:542 instances/jobs.py:549 instances/jobs.py:806 +#: instances/jobs.py:543 instances/jobs.py:550 instances/jobs.py:807 msgid "Copying disks" msgstr "Diskler kopyalanıyor" -#: instances/jobs.py:601 +#: instances/jobs.py:602 msgid "libvirt has no result of the copy" msgstr "libvirt'te kopyanın sonucu yok" -#: instances/jobs.py:612 +#: instances/jobs.py:613 #, python-format msgid "" "The copy failed: %(error)s. The guest's file systems could not be thawed " @@ -2825,11 +2823,11 @@ msgstr "" "Kopyalama başarısız oldu: %(error)s. Konuğun dosya sistemleri çözülemedi " "(%(thaw)s); şununla çözün: virsh domfsthaw %(vm)s" -#: instances/jobs.py:615 instances/jobs.py:699 +#: instances/jobs.py:616 instances/jobs.py:700 msgid "The copy failed" msgstr "Kopyalama başarısız oldu" -#: instances/jobs.py:640 +#: instances/jobs.py:641 #, python-format msgid "" "The VM is no longer on the compute the job ran on; check these volumes, then " @@ -2838,7 +2836,7 @@ msgstr "" "Sanal makine artık işin çalıştığı sunucuda değil; şu birimleri kontrol edin, " "sonra bu işi çözün: %(volumes)s" -#: instances/jobs.py:675 +#: instances/jobs.py:676 #, python-format msgid "" "A volume of the clone was being created; check these volumes, then resolve " @@ -2847,15 +2845,15 @@ msgstr "" "Klonun bir birimi oluşturuluyordu; şu birimleri kontrol edin, sonra bu işi " "çözün: %(volumes)s" -#: instances/jobs.py:679 +#: instances/jobs.py:680 msgid "The job stopped before the copy started" msgstr "İş, kopyalama başlamadan durdu" -#: instances/jobs.py:686 +#: instances/jobs.py:687 msgid "libvirt is still copying the disks" msgstr "libvirt diskleri hâlâ kopyalıyor" -#: instances/jobs.py:689 +#: instances/jobs.py:690 #, python-format msgid "" "Another backup runs on the VM; check these volumes, then resolve this job: " @@ -2864,7 +2862,7 @@ msgstr "" "Sanal makinede başka bir yedekleme çalışıyor; şu birimleri kontrol edin, " "sonra bu işi çözün: %(volumes)s" -#: instances/jobs.py:694 +#: instances/jobs.py:695 #, python-format msgid "" "libvirt has no result of the copy; check these volumes, then resolve this " @@ -2873,140 +2871,140 @@ msgstr "" "libvirt'te kopyanın sonucu yok; şu birimleri kontrol edin, sonra bu işi " "çözün: %(volumes)s" -#: instances/jobs.py:722 instances/templates/create_instance_w1.html:60 +#: instances/jobs.py:723 instances/templates/create_instance_w1.html:60 #: instances/templates/create_instance_w2.html:356 msgid "Create VM" msgstr "Sanal makine oluştur" -#: instances/jobs.py:745 instances/views.py:2481 +#: instances/jobs.py:746 instances/views.py:2468 msgid "A virtual machine with this name already exists" msgstr "Bu isimde bir sanal makine mevcut" -#: instances/jobs.py:747 +#: instances/jobs.py:748 msgid "There is an instance with same name. Remove it and try again!" msgstr "Aynı isimde başka bir sanal makine var. Onu silip yeniden deneyin!" -#: instances/jobs.py:750 +#: instances/jobs.py:751 msgid "First you need to create or select an image" msgstr "Öncelikle bir imaj oluşturun ya da mevcut bir imajı seçin" -#: instances/jobs.py:752 +#: instances/jobs.py:753 msgid "Choose one disk source: a new disk, existing volumes or a template" msgstr "" "Tek bir disk kaynağı seçin: yeni bir disk, mevcut birimler ya da bir şablon" -#: instances/jobs.py:754 +#: instances/jobs.py:755 msgid "Image has already exist. Please check volumes or change instance name" msgstr "" "İmaj zaten mevcut. Lütfen ya makine adını değişin ya da disk alanlarını " "kontrol edin" -#: instances/jobs.py:756 +#: instances/jobs.py:757 msgid "Invalid cache mode" msgstr "Geçersiz önbellek modu" -#: instances/jobs.py:758 +#: instances/jobs.py:759 #, python-format msgid "This host offers no CPU mode or model %(mode)s" msgstr "Bu sunucu %(mode)s CPU modunu veya modelini sunmuyor" -#: instances/jobs.py:760 +#: instances/jobs.py:761 #, python-format msgid "A CD-ROM cannot use the %(bus)s bus" msgstr "CD-ROM %(bus)s veri yolunu kullanamaz" -#: instances/jobs.py:763 +#: instances/jobs.py:764 msgid "The cloud-init seed is read from a CD-ROM: choose its bus" msgstr "cloud-init tohumu bir CD-ROM'dan okunur: veri yolunu seçin" -#: instances/jobs.py:766 +#: instances/jobs.py:767 msgid "The cloud-init seed needs a directory storage pool for the disk" msgstr "cloud-init tohumu, disk için bir dizin depolama havuzu gerektirir" -#: instances/jobs.py:772 +#: instances/jobs.py:773 #, python-format msgid "This host offers no firmware %(firmware)s" msgstr "Bu sunucu %(firmware)s firmware'ini sunmuyor" -#: instances/jobs.py:774 vrtManager/instance.py:3023 +#: instances/jobs.py:775 vrtManager/instance.py:2999 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "Bu sunucu TPM 2.0 sunmuyor: üzerine swtpm kurun" -#: instances/jobs.py:825 +#: instances/jobs.py:826 msgid "Writing the cloud-init seed" msgstr "cloud-init tohumu yazılıyor" -#: instances/jobs.py:832 +#: instances/jobs.py:833 msgid "Defining the VM" msgstr "Sanal makine tanımlanıyor" -#: instances/jobs.py:865 +#: instances/jobs.py:866 #, python-format msgid "%(error)s. Remove these volumes by hand: %(volumes)s" msgstr "%(error)s. Şu birimleri elle silin: %(volumes)s" -#: instances/jobs.py:890 +#: instances/jobs.py:891 #, python-format msgid "The instance is already on %(compute)s" msgstr "Sanal makine zaten %(compute)s üzerinde" -#: instances/jobs.py:892 +#: instances/jobs.py:893 #, python-format msgid "%(compute)s is not reachable" msgstr "%(compute)s sunucusuna ulaşılamıyor" -#: instances/jobs.py:894 +#: instances/jobs.py:895 #, python-format msgid "%(compute)s is the VM's own host under another name" msgstr "%(compute)s, sanal makinenin kendi sunucusunun başka bir adı" -#: instances/jobs.py:912 +#: instances/jobs.py:913 msgid "Migrate VM" msgstr "Sanal makineyi taşı" -#: instances/jobs.py:956 +#: instances/jobs.py:957 msgid "Migrating the VM" msgstr "Sanal makine taşınıyor" -#: instances/jobs.py:993 +#: instances/jobs.py:994 msgid "libvirt is still migrating the VM" msgstr "libvirt sanal makineyi hâlâ taşıyor" -#: instances/jobs.py:1000 +#: instances/jobs.py:1001 msgid "The VM stayed on the source host" msgstr "Sanal makine kaynak sunucuda kaldı" -#: instances/jobs.py:1002 +#: instances/jobs.py:1003 msgid "" "The VM is on both computes or on neither; check them, then resolve this job." msgstr "" "Sanal makine ya iki sunucuda da var ya da hiçbirinde yok; kontrol edin, " "sonra bu işi çözün." -#: instances/jobs.py:1034 +#: instances/jobs.py:1035 msgid "Move disk" msgstr "Diski taşı" -#: instances/jobs.py:1041 +#: instances/jobs.py:1042 msgid "Choose a disk of the VM" msgstr "Sanal makinenin bir diskini seçin" -#: instances/jobs.py:1065 +#: instances/jobs.py:1066 msgid "Copying the disk" msgstr "Disk kopyalanıyor" -#: instances/jobs.py:1108 +#: instances/jobs.py:1109 #, python-format msgid "Another block job runs on %(dev)s; check the VM" msgstr "" "%(dev)s üzerinde başka bir blok işi çalışıyor; sanal makineyi kontrol edin" -#: instances/jobs.py:1114 +#: instances/jobs.py:1115 #, python-format msgid "The disk stayed in %(path)s; remove %(dest)s if it is there" msgstr "Disk %(path)s içinde kaldı; varsa %(dest)s dosyasını silin" -#: instances/jobs.py:1116 +#: instances/jobs.py:1117 #, python-format msgid "The definitions of %(dev)s name %(paths)s; check the VM" msgstr "%(dev)s tanımları %(paths)s gösteriyor; sanal makineyi kontrol edin" @@ -3246,7 +3244,7 @@ msgid "Disk source" msgstr "Disk kaynağı" #: instances/templates/add_instance_volume.html:21 -#: instances/templates/create_instance_w2.html:134 instances/views.py:2500 +#: instances/templates/create_instance_w2.html:134 instances/views.py:2487 msgid "New disk" msgstr "Yeni disk" @@ -3618,7 +3616,7 @@ msgstr "Özel CPU modelleri" msgid "Size (GiB)" msgstr "Boyut (GiB)" -#: instances/templates/create_instance_w2.html:161 instances/views.py:2501 +#: instances/templates/create_instance_w2.html:161 instances/views.py:2488 msgid "Existing volumes" msgstr "Mevcut birimler" @@ -3653,7 +3651,7 @@ msgstr "Aygıt" msgid "Remove" msgstr "Kaldır" -#: instances/templates/create_instance_w2.html:194 instances/views.py:2502 +#: instances/templates/create_instance_w2.html:194 instances/views.py:2489 msgid "Clone from template" msgstr "Şablondan klonla" @@ -5781,25 +5779,54 @@ msgstr "En son satırlar, en yenisi önce." msgid "All of this VM's logs" msgstr "Bu sanal makinenin tüm logları" -#: instances/utils.py:63 +#: instances/utils.py:66 #, python-format msgid "The disk files cannot be checked on %(host)s: %(err)s" msgstr "Disk dosyaları %(host)s üzerinde denetlenemiyor: %(err)s" -#: instances/utils.py:179 +#: instances/utils.py:79 +msgid "" +"The quota cannot be checked because a host of your virtual machines cannot " +"be reached. Nothing was changed." +msgstr "" +"Sanal makinelerinizin bir sunucusuna erişilemediği için kota denetlenemiyor. " +"Hiçbir şey değiştirilmedi." + +#: instances/utils.py:85 +msgid "The quota of virtual machines is reached" +msgstr "Sanal makine kotası doldu" + +#: instances/utils.py:86 +msgid "The vCPU quota is reached" +msgstr "vCPU kotası doldu" + +#: instances/utils.py:87 +msgid "The memory quota is reached" +msgstr "Bellek kotası doldu" + +#: instances/utils.py:88 +msgid "The disk quota is reached" +msgstr "Disk kotası doldu" + +#: instances/utils.py:97 +#, python-format +msgid "%(quota)s (%(total)s > %(limit)s)" +msgstr "%(quota)s (%(total)s > %(limit)s)" + +#: instances/utils.py:193 msgid "None available device name" msgstr "Hiçbiri uygun aygıt adı değil" -#: instances/utils.py:364 +#: instances/utils.py:378 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(address)s üzerinden %(hostname)s" -#: instances/utils.py:403 +#: instances/utils.py:417 msgid "Invalid MAC address" msgstr "Geçersiz MAC adresi" -#: instances/utils.py:405 +#: instances/utils.py:419 msgid "More MAC addresses than networks" msgstr "Ağlardan daha fazla MAC adresi" @@ -5854,14 +5881,6 @@ msgstr "" msgid "The VM was moved meanwhile; try again." msgstr "Sanal makine bu arada taşındı; yeniden deneyin." -#: instances/views.py:664 -msgid "" -"The quota cannot be checked because a host of your virtual machines cannot " -"be reached. Nothing was changed." -msgstr "" -"Sanal makinelerinizin bir sunucusuna erişilemediği için kota denetlenemiyor. " -"Hiçbir şey değiştirilmedi." - #: instances/views.py:745 msgid "" "The running VM has no free PCI slot for another disk on this bus: choose the " @@ -5962,117 +5981,107 @@ msgstr "vCPU'larını değiştirmek için sanal makineyi kapatın" 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 "" -"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!" -msgstr "" -"%(quota_msg)s kullanıcısı kotası doldu, '%(instance_name)s' in CPU su " -"yeniden boyutlandırılamıyor!" +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:1189 +#: 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:1208 +#: instances/views.py:1204 msgid "Enter a whole number for memory" msgstr "Bellek için bir tam sayı girin" -#: instances/views.py:1211 +#: 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:1216 +#: instances/views.py:1211 #, python-format -msgid "" -"User %(quota_msg)s quota reached, cannot resize memory of " -"'%(instance_name)s'!" -msgstr "" -"%(quota_msg)s kullanıcı kotası doldu, '%(instance_name)s' in belleği yeniden " -"boyutlandırılamıyor!" +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:1225 +#: 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:1245 +#: instances/views.py:1237 msgid "Enter disk sizes as whole GiB" msgstr "Disk boyutlarını tam GiB olarak girin" -#: instances/views.py:1249 +#: 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:1257 +#: 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:1267 +#: instances/views.py:1258 #, python-format -msgid "" -"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!" -msgstr "" -"%(quota_msg)s kullanıcı kotası doldu, '%(instance_name)s' in diski yeniden " -"boyutlandırılamıyor!" +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:1282 +#: 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:1284 +#: instances/views.py:1272 #, python-format msgid "Disk is resized: %(dev)s" msgstr "Disk boyutu değiştirildi: %(dev)s" -#: instances/views.py:1378 +#: 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:1383 +#: instances/views.py:1371 #, python-format msgid "%(count)s PCIe slots added" msgstr "%(count)s PCIe yuvası eklendi" -#: instances/views.py:1385 +#: 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:1516 +#: 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:1521 +#: instances/views.py:1509 msgid "Volume is changed successfully." msgstr "Birim başarıyla değiştirildi." -#: instances/views.py:1539 +#: 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:1546 +#: 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:1561 +#: 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:1573 +#: instances/views.py:1561 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " @@ -6081,57 +6090,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:1584 +#: 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:1610 +#: 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:1613 +#: 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:1694 +#: 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:1715 +#: 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:1830 +#: instances/views.py:1818 msgid "Check at least one device to boot from." msgstr "Önyükleme için en az bir aygıt işaretleyin." -#: instances/views.py:1844 +#: 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:1846 +#: instances/views.py:1834 msgid "Boot order changed successfully." msgstr "Ön yükleme sırası başarıyla değiştirildi." -#: instances/views.py:1866 +#: instances/views.py:1854 msgid "The XML is empty" msgstr "XML boş" -#: instances/views.py:1870 instances/views.py:2491 +#: 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:1872 +#: 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:1876 +#: instances/views.py:1864 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." @@ -6139,35 +6148,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:1888 +#: instances/views.py:1876 msgid "The XML definition was saved." msgstr "XML tanımı kaydedildi." -#: instances/views.py:1890 +#: 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:1971 +#: instances/views.py:1959 msgid "Select one network interface to change" msgstr "Değiştirilecek bir ağ arabirimi seçin" -#: instances/views.py:2009 +#: 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:2011 +#: instances/views.py:1999 msgid "Network device changed" msgstr "Ağ aygıtı değiştirildi" -#: instances/views.py:2023 +#: instances/views.py:2011 msgid "No network selected" msgstr "Ağ seçilmedi" -#: instances/views.py:2043 +#: 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 " @@ -6177,21 +6186,21 @@ msgstr "" "aygıtı sonra ekleyin; Diskler sekmesindeki PCIe yuvaları ekle, sonraki " "başlatmadan itibaren ona boş yuvalar verir." -#: instances/views.py:2084 instances/views.py:2090 +#: instances/views.py:2072 instances/views.py:2078 msgid "The VM has it" msgstr "Sanal makinede var" -#: instances/views.py:2121 +#: 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:2142 +#: 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:2160 +#: instances/views.py:2148 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go " @@ -6201,20 +6210,20 @@ msgstr "" "bırakmadı; bırakana ya da sanal makine durana kadar çalışan sanal makinede " "kalır." -#: instances/views.py:2205 instances/views.py:2235 +#: 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:2208 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:2215 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:2220 +#: 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." @@ -6222,12 +6231,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:2242 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:2247 +#: instances/views.py:2235 #, python-format msgid "" "%(qos_dir)s QoS is deleted. A running VM keeps the old limit until it is " @@ -6236,21 +6245,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:2275 +#: 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:2277 +#: instances/views.py:2265 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s zaten bir sahip" -#: instances/views.py:2321 +#: instances/views.py:2309 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "Konsol ayarları kaydedilmedi: %(errors)s" -#: instances/views.py:2343 +#: instances/views.py:2331 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." @@ -6258,67 +6267,65 @@ msgstr "" "Konsol parolası ayarlanırken hata oluştu. Sanal makinenin bir grafik " "aygıtına sahip olduğundan emin olunuz." -#: instances/views.py:2390 +#: 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:2397 +#: instances/views.py:2384 #, python-format -msgid "User %(quota_msg)s quota reached, '%(instance_name)s' stays a template!" -msgstr "" -"Kullanıcının %(quota_msg)s kotası doldu, '%(instance_name)s' şablon olarak " -"kalıyor!" +msgid "%(quota)s: '%(instance_name)s' stays a template." +msgstr "%(quota)s: '%(instance_name)s' şablon olarak kalıyor." -#: instances/views.py:2479 +#: instances/views.py:2466 msgid "The XML has no name" msgstr "XML'de ad yok" -#: instances/views.py:2493 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:2500 +#: instances/views.py:2487 msgid "An empty disk of the size you set" msgstr "Belirlediğiniz boyutta boş bir disk" -#: instances/views.py:2501 +#: instances/views.py:2488 msgid "Volumes already in a pool" msgstr "Bir havuzda zaten bulunan birimler" -#: instances/views.py:2502 +#: instances/views.py:2489 msgid "A copy of a template volume" msgstr "Bir şablon biriminin kopyası" -#: instances/views.py:2591 +#: instances/views.py:2578 msgid "You haven't defined any storage pools" msgstr "Hiç bir depolama havuzu tanımlamadınız" -#: instances/views.py:2593 +#: instances/views.py:2580 msgid "You haven't defined any network pools" msgstr "Hiç bir ağ havuzu tanımlamadınız" -#: instances/views.py:2656 +#: instances/views.py:2643 msgid "Flavor Created" msgstr "Flavor Oluşturuldu" -#: instances/views.py:2664 +#: instances/views.py:2651 msgid "Create Flavor" msgstr "Kullanıcı Oluştur" -#: instances/views.py:2679 +#: instances/views.py:2666 msgid "Flavor Updated" msgstr "Flavor Güncellendi" -#: instances/views.py:2685 +#: instances/views.py:2672 msgid "Update Flavor" msgstr "Flavor Güncelle" -#: instances/views.py:2697 +#: instances/views.py:2684 msgid "Flavor Deleted" msgstr "Flavor Silindi" -#: instances/views.py:2703 +#: 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 " @@ -7834,7 +7841,7 @@ msgstr "" msgid "%(label)s is %(state)s on this resource (since %(since)s)." msgstr "%(label)s bu kaynakta %(state)s (%(since)s beri)." -#: operations/worker.py:38 +#: operations/worker.py:40 msgid "" "libvirt's merge finished copying but never completed (for example after a " "libvirtd restart); check the VM before resolving" @@ -7843,7 +7850,7 @@ msgstr "" "libvirtd yeniden başlatıldıktan sonra); çözmeden önce sanal makineyi kontrol " "edin" -#: operations/worker.py:40 +#: operations/worker.py:42 msgid "" "The worker that ran this job stopped responding; an administrator must make " "sure it is no longer running, then resolve this job" @@ -7851,11 +7858,11 @@ msgstr "" "Bu işi çalıştıran worker yanıt vermeyi bıraktı; bir yönetici artık " "çalışmadığından emin olmalı, sonra bu işi çözmeli" -#: operations/worker.py:42 +#: operations/worker.py:44 msgid "Waiting for recovery" msgstr "Kurtarma bekleniyor" -#: operations/worker.py:393 +#: operations/worker.py:455 msgid "The worker stopped before the job changed anything" msgstr "Worker, iş herhangi bir şeyi değiştirmeden önce durdu" @@ -8445,12 +8452,12 @@ msgstr "Yükleme oturumu meşgul. Lütfen yeniden deneyin." msgid "ISO image already exists" msgstr "ISO imajı zaten mevcut" -#: storages/views.py:176 +#: storages/views.py:178 #, python-format msgid "Volume: %(vol)s is deleted." msgstr "Birim: %(vol)s silindi." -#: storages/views.py:194 +#: storages/views.py:196 #, python-format msgid "Image file %(name)s is created successfully" msgstr "İmaj dosyası %(name)s başarıyla oluşturuldu" @@ -8770,10 +8777,55 @@ msgstr "" "Eski değerin yerini hemen alır; bir parolanın şifrelediği veriler yeniden " "şifrelenmez." -#: vrtManager/connection.py:200 +#: vrtManager/connection.py:50 +msgid "Connection closed (error)" +msgstr "Bağlantı kapandı (hata)" + +#: vrtManager/connection.py:51 +msgid "Connection closed (end of file)" +msgstr "Bağlantı kapandı (dosya sonu)" + +#: vrtManager/connection.py:52 +msgid "Connection closed (keepalive timeout)" +msgstr "Bağlantı kapandı (canlı tutma zaman aşımı)" + +#: vrtManager/connection.py:53 +msgid "Connection closed (client closed)" +msgstr "Bağlantı kapandı (istemci kapattı)" + +#: vrtManager/connection.py:139 +#, python-format +msgid "" +"Connection Failed: %(host)s does not answer: %(requests)s requests still " +"wait for it" +msgstr "" +"Bağlantı başarısız: %(host)s yanıt vermiyor: %(requests)s istek hâlâ onu " +"bekliyor" + +#: vrtManager/connection.py:208 +#, python-format +msgid "Connection Failed: %(host)s did not answer within %(seconds)s s" +msgstr "Bağlantı başarısız: %(host)s %(seconds)s sn içinde yanıt vermedi" + +#: vrtManager/connection.py:218 msgid "the connection closed right after opening" msgstr "bağlantı açıldıktan hemen sonra kapandı" +#: vrtManager/connection.py:231 +#, python-format +msgid "Connection Failed: %(error)s" +msgstr "Bağlantı başarısız: %(error)s" + +#: vrtManager/connection.py:291 +#, python-format +msgid "Connection closed (%(reason)s)" +msgstr "Bağlantı kapandı (%(reason)s)" + +#: vrtManager/connection.py:433 +#, python-format +msgid "Connection Failed: %(host)s is not connected" +msgstr "Bağlantı başarısız: %(host)s bağlı değil" + #: vrtManager/instance.py:134 msgid "A running or paused VM cannot be migrated offline" msgstr "Çalışan veya duraklatılmış bir sanal makine çevrimdışı taşınamaz" @@ -8943,7 +8995,7 @@ msgstr "" "Anlık görüntü adları 1-64 harf, rakam, '.', '_' veya '-' karakterinden " "oluşur ve '.' ile başlamaz" -#: vrtManager/instance.py:1100 +#: vrtManager/instance.py:1076 msgid "" "A device other than a disk or NIC is in the boot order: change it in the XML " "editor" @@ -8951,100 +9003,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:1112 +#: vrtManager/instance.py:1088 msgid "Invalid Device Type for boot order" msgstr "Önyükleme sırası için geçersiz aygıt türü" -#: vrtManager/instance.py:1115 +#: vrtManager/instance.py:1091 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "Önyükleme aygıtı %(dev)s tanımda yok" -#: vrtManager/instance.py:1135 +#: vrtManager/instance.py:1111 #, 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:1136 +#: vrtManager/instance.py:1112 #, 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:1148 +#: vrtManager/instance.py:1124 #, 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:1159 +#: vrtManager/instance.py:1135 #, python-format msgid "ISO image %(image)s was not found" msgstr "ISO imajı %(image)s bulunamadı" -#: vrtManager/instance.py:1161 +#: vrtManager/instance.py:1137 #, 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:1268 +#: vrtManager/instance.py:1244 #, 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:1396 +#: vrtManager/instance.py:1372 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:1859 +#: vrtManager/instance.py:1835 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:1891 +#: vrtManager/instance.py:1867 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:1893 +#: vrtManager/instance.py:1869 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:1895 +#: vrtManager/instance.py:1871 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:1898 +#: vrtManager/instance.py:1874 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:1903 +#: vrtManager/instance.py:1879 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:1906 +#: vrtManager/instance.py:1882 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:1912 +#: vrtManager/instance.py:1888 #, python-format msgid "Eject the media from %(dev)s first" msgstr "Önce %(dev)s içindeki ortamı çıkarın" -#: vrtManager/instance.py:1914 +#: vrtManager/instance.py:1890 #, 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:1922 +#: vrtManager/instance.py:1898 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " @@ -9052,21 +9104,21 @@ msgid "" msgstr "" "Depolama havuzları yenilenemedi, bu yüzden boş alanları bilinmiyor: %(err)s" -#: vrtManager/instance.py:1943 +#: vrtManager/instance.py:1919 msgid "Memory is saved only from a running VM" msgstr "Bellek yalnızca çalışan bir sanal makineden kaydedilir" -#: vrtManager/instance.py:1945 +#: vrtManager/instance.py:1921 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:1949 +#: vrtManager/instance.py:1925 #, 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:1980 +#: vrtManager/instance.py:1956 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -9077,7 +9129,7 @@ msgstr "" "%(size).1f GiB gerektiriyor (sanal makinenin oradaki disklerinin %%" "%(percent)g kadarı, en az %(minimum)g GiB, ve kaydediliyorsa bellek)" -#: vrtManager/instance.py:1998 +#: vrtManager/instance.py:1974 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" @@ -9085,7 +9137,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:2028 +#: vrtManager/instance.py:2004 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " @@ -9094,7 +9146,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:2030 +#: vrtManager/instance.py:2006 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " @@ -9103,13 +9155,13 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine kapalı." -#: vrtManager/instance.py:2193 +#: vrtManager/instance.py:2169 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:2195 +#: vrtManager/instance.py:2171 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" @@ -9117,7 +9169,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:2203 +#: vrtManager/instance.py:2179 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " @@ -9126,132 +9178,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:2208 +#: vrtManager/instance.py:2184 #, 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:2215 +#: vrtManager/instance.py:2191 #, 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:2217 +#: vrtManager/instance.py:2193 #, 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:2220 +#: vrtManager/instance.py:2196 #, 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:2223 +#: vrtManager/instance.py:2199 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s zaten %(pool_name)s havuzunda" -#: vrtManager/instance.py:2227 +#: vrtManager/instance.py:2203 #, 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:2251 +#: vrtManager/instance.py:2227 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s kopyası tamamlanmadan sona erdi" -#: vrtManager/instance.py:2296 +#: vrtManager/instance.py:2272 #, 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:2298 +#: vrtManager/instance.py:2274 #, 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:2305 +#: vrtManager/instance.py:2281 #, 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:2314 +#: vrtManager/instance.py:2290 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:2316 +#: vrtManager/instance.py:2292 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:2326 +#: vrtManager/instance.py:2302 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:2415 +#: vrtManager/instance.py:2391 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM'i dosya olmayan bir sanal makine klonlanamaz" -#: vrtManager/instance.py:2483 +#: vrtManager/instance.py:2459 #, 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:2493 +#: vrtManager/instance.py:2469 msgid "Shut the VM down before cloning it" msgstr "Klonlamadan önce sanal makineyi kapatın" -#: vrtManager/instance.py:2547 +#: vrtManager/instance.py:2523 #, 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:2558 +#: vrtManager/instance.py:2534 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:2561 +#: vrtManager/instance.py:2537 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:2564 +#: vrtManager/instance.py:2540 #, 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:2566 +#: vrtManager/instance.py:2542 #, 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:2571 +#: vrtManager/instance.py:2547 #, 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:2573 +#: vrtManager/instance.py:2549 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:2586 +#: vrtManager/instance.py:2562 #, 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:2605 +#: vrtManager/instance.py:2581 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f " @@ -9261,20 +9313,20 @@ msgstr "" "gerektiriyor (kopyalanan diskler, artı bunların %%%(percent)g kadarı, en az " "%(minimum)g GiB)" -#: vrtManager/instance.py:2744 +#: vrtManager/instance.py:2720 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:2760 +#: vrtManager/instance.py:2736 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "MAC adresi %(old_mac)s olan ağ arabirimi yok" -#: vrtManager/instance.py:2763 +#: vrtManager/instance.py:2739 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:2854 +#: vrtManager/instance.py:2830 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" @@ -9282,14 +9334,14 @@ msgstr "" "Sanal makine PCI aygıtlarını çalışırken veya kaydedilmiş durumu olmadan " "kapalıyken değiştirir" -#: vrtManager/instance.py:2866 +#: vrtManager/instance.py:2842 #, 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:2868 +#: vrtManager/instance.py:2844 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" @@ -9297,7 +9349,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "var" -#: vrtManager/instance.py:2870 +#: vrtManager/instance.py:2846 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " @@ -9306,7 +9358,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "yok" -#: vrtManager/instance.py:2871 +#: vrtManager/instance.py:2847 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" @@ -9314,7 +9366,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada var" -#: vrtManager/instance.py:2873 +#: vrtManager/instance.py:2849 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " @@ -9323,7 +9375,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2875 +#: vrtManager/instance.py:2851 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9332,7 +9384,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada var" -#: vrtManager/instance.py:2877 +#: vrtManager/instance.py:2853 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9341,29 +9393,29 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2911 +#: vrtManager/instance.py:2887 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "Sanal makinede %(address)s PCI aygıtı yok" -#: vrtManager/instance.py:2929 +#: vrtManager/instance.py:2905 msgid "The VM has no USB controller" msgstr "Sanal makinede USB denetleyicisi yok" -#: vrtManager/instance.py:2948 +#: vrtManager/instance.py:2924 msgid "The VM has no such USB device" msgstr "Sanal makinede böyle bir USB aygıtı yok" -#: vrtManager/instance.py:2989 +#: vrtManager/instance.py:2965 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:3016 +#: vrtManager/instance.py:2992 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:3035 +#: vrtManager/instance.py:3011 #, 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 4367d5e70fde46f9006315a24fdf258a95bf2e1f..70a1bdede7e9e9d72d2bd9e07ad28d92319fb3a3 100644 GIT binary patch delta 44000 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 delta 43019 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 Y$ %(limit)s)" +msgstr "%(quota)s(%(total)s > %(limit)s)" + +#: instances/utils.py:193 msgid "None available device name" msgstr "没有可用的设备名称" -#: instances/utils.py:364 +#: instances/utils.py:378 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(hostname)s,经由 %(address)s" -#: instances/utils.py:403 +#: instances/utils.py:417 msgid "Invalid MAC address" msgstr "无效的 MAC 地址" -#: instances/utils.py:405 +#: instances/utils.py:419 msgid "More MAC addresses than networks" msgstr "MAC 地址数量多于网络数量" @@ -5614,12 +5641,6 @@ msgstr "有主机设备的虚拟机无法迁移:目标主机可能没有这些 msgid "The VM was moved meanwhile; try again." msgstr "该虚拟机在此期间已被移动;请重试。" -#: instances/views.py:664 -msgid "" -"The quota cannot be checked because a host of your virtual machines cannot " -"be reached. Nothing was changed." -msgstr "无法检查配额,因为您的某台虚拟机所在主机无法连接。未做任何更改。" - #: instances/views.py:745 msgid "" "The running VM has no free PCI slot for another disk on this bus: choose the " @@ -5713,104 +5734,100 @@ msgstr "请关闭虚拟机以更改其 vCPU" msgid "The current vCPUs cannot be more than the maximum" msgstr "当前 vCPU 数不能超过最大值" -#: instances/views.py:1178 +#: instances/views.py:1177 #, python-format -msgid "" -"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!" -msgstr "已达到用户 %(quota_msg)s 配额,无法调整“%(instance_name)s”的 CPU!" +msgid "%(quota)s: cannot resize the CPU of '%(instance_name)s'." +msgstr "%(quota)s:无法调整“%(instance_name)s”的 CPU。" -#: instances/views.py:1189 +#: instances/views.py:1185 #, python-format msgid "vCPUs set to %(cur)s (maximum %(max)s)" msgstr "vCPU 已设为 %(cur)s(最大 %(max)s)" -#: instances/views.py:1208 +#: instances/views.py:1204 msgid "Enter a whole number for memory" msgstr "请输入整数内存值" -#: instances/views.py:1211 +#: instances/views.py:1207 msgid "The current memory cannot be more than the maximum" msgstr "当前内存不能超过最大值" -#: instances/views.py:1216 +#: instances/views.py:1211 #, python-format -msgid "" -"User %(quota_msg)s quota reached, cannot resize memory of " -"'%(instance_name)s'!" -msgstr "已达到用户 %(quota_msg)s 配额,无法调整“%(instance_name)s”的内存!" +msgid "%(quota)s: cannot resize the memory of '%(instance_name)s'." +msgstr "%(quota)s:无法调整“%(instance_name)s”的内存。" -#: instances/views.py:1225 +#: 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:1245 +#: instances/views.py:1237 msgid "Enter disk sizes as whole GiB" msgstr "请以整数 GiB 输入磁盘大小" -#: instances/views.py:1249 +#: instances/views.py:1241 #, python-format msgid "%(dev)s is %(size)s: a disk cannot shrink" msgstr "%(dev)s 为 %(size)s:磁盘不能缩小" -#: instances/views.py:1257 +#: instances/views.py:1249 msgid "No disks were selected or valid for resizing." msgstr "未选择磁盘或没有可调整大小的有效磁盘。" -#: instances/views.py:1267 +#: instances/views.py:1258 #, python-format -msgid "" -"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!" -msgstr "已达到用户 %(quota_msg)s 配额,无法调整“%(instance_name)s”的磁盘!" +msgid "%(quota)s: cannot resize the disks of '%(instance_name)s'." +msgstr "%(quota)s:无法调整“%(instance_name)s”的磁盘。" -#: instances/views.py:1282 +#: instances/views.py:1270 #, python-format msgid "The storage pool of %(dev)s cannot resize its volumes" msgstr "%(dev)s 所在的存储池无法调整其卷的大小" -#: instances/views.py:1284 +#: instances/views.py:1272 #, python-format msgid "Disk is resized: %(dev)s" msgstr "磁盘已调整大小:%(dev)s" -#: instances/views.py:1378 +#: instances/views.py:1366 msgid "The VM's machine has no PCIe slots to add" msgstr "该虚拟机的机器类型没有可添加的 PCIe 插槽" -#: instances/views.py:1383 +#: instances/views.py:1371 #, python-format msgid "%(count)s PCIe slots added" msgstr "已添加 %(count)s 个 PCIe 插槽" -#: instances/views.py:1385 +#: 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:1516 +#: instances/views.py:1504 msgid "Volume changes are applied. But it will be activated after shutdown" msgstr "卷更改已应用,但将在关机后生效" -#: instances/views.py:1521 +#: instances/views.py:1509 msgid "Volume is changed successfully." msgstr "卷已成功更改。" -#: instances/views.py:1539 +#: instances/views.py:1527 #, python-format msgid "Disk %(dev)s is not a storage volume of this instance" msgstr "磁盘 %(dev)s 不是此虚拟机的存储卷" -#: instances/views.py:1546 +#: 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:1561 +#: instances/views.py:1549 #, python-format msgid "Volume %(vol)s is used by another VM; detach it instead" msgstr "卷 %(vol)s 正被另一台虚拟机使用;请改为分离它" -#: instances/views.py:1573 +#: instances/views.py:1561 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " @@ -5819,87 +5836,87 @@ msgstr "" "客户机尚未释放磁盘 %(dev)s;卷 %(vol)s 已保留。请在虚拟机关机后从存储池中删除" "它。" -#: instances/views.py:1584 +#: 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:1610 +#: 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:1613 +#: 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:1694 +#: instances/views.py:1682 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "未重新读取存储池 %(pool)s:%(err)s" -#: instances/views.py:1715 +#: instances/views.py:1703 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "快照未删除:%(err)s" -#: instances/views.py:1830 +#: instances/views.py:1818 msgid "Check at least one device to boot from." msgstr "请至少勾选一个启动设备。" -#: instances/views.py:1844 +#: instances/views.py:1832 msgid "Boot order changed. It applies at the next start." msgstr "启动顺序已更改,将在下次启动时生效。" -#: instances/views.py:1846 +#: instances/views.py:1834 msgid "Boot order changed successfully." msgstr "启动顺序已成功更改。" -#: instances/views.py:1866 +#: instances/views.py:1854 msgid "The XML is empty" msgstr "XML 为空" -#: instances/views.py:1870 instances/views.py:2491 +#: 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:1872 +#: 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:1876 +#: 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:1888 +#: instances/views.py:1876 msgid "The XML definition was saved." msgstr "XML 定义已保存。" -#: instances/views.py:1890 +#: instances/views.py:1878 msgid "The XML definition was saved; the VM uses it from its next start." msgstr "XML 定义已保存;虚拟机从下次启动起使用它。" -#: instances/views.py:1971 +#: instances/views.py:1959 msgid "Select one network interface to change" msgstr "请选择一个要更改的网络接口" -#: instances/views.py:2009 +#: instances/views.py:1997 msgid "Network Device Config is changed. Please shutdown instance to activate." msgstr "网络设备配置已更改。请关闭虚拟机以使其生效。" -#: instances/views.py:2011 +#: instances/views.py:1999 msgid "Network device changed" msgstr "网络设备已更改" -#: instances/views.py:2023 +#: instances/views.py:2011 msgid "No network selected" msgstr "未选择网络" -#: instances/views.py:2043 +#: 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 " @@ -5908,21 +5925,21 @@ msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加网络设备:请关机后再添加设备。“磁盘”选项" "卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。" -#: instances/views.py:2084 instances/views.py:2090 +#: instances/views.py:2072 instances/views.py:2078 msgid "The VM has it" msgstr "虚拟机已有此设备" -#: instances/views.py:2121 +#: instances/views.py:2109 #, python-format msgid "The host has no USB device %(device)s" msgstr "主机上没有 USB 设备 %(device)s" -#: instances/views.py:2142 +#: instances/views.py:2130 #, python-format msgid "The host has no PCI device %(device)s" msgstr "主机上没有 PCI 设备 %(device)s" -#: instances/views.py:2160 +#: instances/views.py:2148 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go " @@ -5931,116 +5948,116 @@ msgstr "" "已请求移除 PCI 设备 %(address)s:客户机尚未释放它;在客户机释放或虚拟机停止之" "前,它仍保留在运行中的虚拟机中。" -#: instances/views.py:2205 instances/views.py:2235 +#: instances/views.py:2193 instances/views.py:2223 msgid "Select a network interface and a QoS direction" msgstr "请选择网络接口和 QoS 方向" -#: instances/views.py:2208 vrtManager/network.py:459 +#: instances/views.py:2196 vrtManager/network.py:459 msgid "QoS rates must be whole numbers" msgstr "QoS 速率必须为整数" -#: instances/views.py:2215 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:2220 +#: 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:2242 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:2247 +#: 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:2275 +#: instances/views.py:2263 msgid "Only one owner is allowed and the one already added" msgstr "只允许一个所有者,且已添加" -#: instances/views.py:2277 +#: instances/views.py:2265 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s 已是所有者" -#: instances/views.py:2321 +#: instances/views.py:2309 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "控制台设置未保存:%(errors)s" -#: instances/views.py:2343 +#: instances/views.py:2331 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." msgstr "设置控制台密码出错。请检查虚拟机是否有图形设备。" -#: instances/views.py:2390 +#: instances/views.py:2378 msgid "Shut the VM down to change whether it is a template." msgstr "请关闭虚拟机以更改其是否为模板。" -#: instances/views.py:2397 +#: instances/views.py:2384 #, python-format -msgid "User %(quota_msg)s quota reached, '%(instance_name)s' stays a template!" -msgstr "已达到用户 %(quota_msg)s 配额,“%(instance_name)s”仍为模板!" +msgid "%(quota)s: '%(instance_name)s' stays a template." +msgstr "%(quota)s:“%(instance_name)s”仍为模板。" -#: instances/views.py:2479 +#: instances/views.py:2466 msgid "The XML has no name" msgstr "XML 中没有名称" -#: instances/views.py:2493 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:2500 +#: instances/views.py:2487 msgid "An empty disk of the size you set" msgstr "按设定大小创建的空磁盘" -#: instances/views.py:2501 +#: instances/views.py:2488 msgid "Volumes already in a pool" msgstr "存储池中已有的卷" -#: instances/views.py:2502 +#: instances/views.py:2489 msgid "A copy of a template volume" msgstr "模板卷的副本" -#: instances/views.py:2591 +#: instances/views.py:2578 msgid "You haven't defined any storage pools" msgstr "您尚未定义任何存储池" -#: instances/views.py:2593 +#: instances/views.py:2580 msgid "You haven't defined any network pools" msgstr "您尚未定义任何网络池" -#: instances/views.py:2656 +#: instances/views.py:2643 msgid "Flavor Created" msgstr "规格已创建" -#: instances/views.py:2664 +#: instances/views.py:2651 msgid "Create Flavor" msgstr "创建规格" -#: instances/views.py:2679 +#: instances/views.py:2666 msgid "Flavor Updated" msgstr "规格已更新" -#: instances/views.py:2685 +#: instances/views.py:2672 msgid "Update Flavor" msgstr "更新规格" -#: instances/views.py:2697 +#: instances/views.py:2684 msgid "Flavor Deleted" msgstr "规格已删除" -#: instances/views.py:2703 +#: instances/views.py:2690 msgid "Only the size template goes; VMs made from it keep their size." msgstr "仅删除此规格;由它创建的虚拟机保持其大小。" @@ -7500,7 +7517,7 @@ msgstr "" msgid "%(label)s is %(state)s on this resource (since %(since)s)." msgstr "此资源上的%(label)s%(state)s(自 %(since)s起)。" -#: operations/worker.py:38 +#: operations/worker.py:40 msgid "" "libvirt's merge finished copying but never completed (for example after a " "libvirtd restart); check the VM before resolving" @@ -7508,18 +7525,18 @@ msgstr "" "libvirt 的合并已完成复制但从未结束(例如 libvirtd 重启后);处理前请检查虚拟" "机" -#: operations/worker.py:40 +#: operations/worker.py:42 msgid "" "The worker that ran this job stopped responding; an administrator must make " "sure it is no longer running, then resolve this job" msgstr "" "运行此任务的工作进程已停止响应;管理员必须确认它已不再运行,然后处理此任务" -#: operations/worker.py:42 +#: operations/worker.py:44 msgid "Waiting for recovery" msgstr "等待恢复" -#: operations/worker.py:393 +#: operations/worker.py:455 msgid "The worker stopped before the job changed anything" msgstr "工作进程在任务做出任何更改之前停止" @@ -8095,12 +8112,12 @@ msgstr "上传会话繁忙,请重试。" msgid "ISO image already exists" msgstr "ISO 镜像已存在" -#: storages/views.py:176 +#: storages/views.py:178 #, python-format msgid "Volume: %(vol)s is deleted." msgstr "卷 %(vol)s 已删除。" -#: storages/views.py:194 +#: storages/views.py:196 #, python-format msgid "Image file %(name)s is created successfully" msgstr "镜像文件 %(name)s 创建成功" @@ -8403,10 +8420,53 @@ msgid "" "encrypted anew." msgstr "新值会立即替换旧值;之前用口令加密的内容不会重新加密。" -#: vrtManager/connection.py:200 +#: vrtManager/connection.py:50 +msgid "Connection closed (error)" +msgstr "连接已关闭(错误)" + +#: vrtManager/connection.py:51 +msgid "Connection closed (end of file)" +msgstr "连接已关闭(文件结束)" + +#: vrtManager/connection.py:52 +msgid "Connection closed (keepalive timeout)" +msgstr "连接已关闭(保活超时)" + +#: vrtManager/connection.py:53 +msgid "Connection closed (client closed)" +msgstr "连接已关闭(客户端已关闭)" + +#: vrtManager/connection.py:139 +#, python-format +msgid "" +"Connection Failed: %(host)s does not answer: %(requests)s requests still " +"wait for it" +msgstr "连接失败:%(host)s 无响应:仍有 %(requests)s 个请求在等待它" + +#: vrtManager/connection.py:208 +#, python-format +msgid "Connection Failed: %(host)s did not answer within %(seconds)s s" +msgstr "连接失败:%(host)s 在 %(seconds)s 秒内未响应" + +#: vrtManager/connection.py:218 msgid "the connection closed right after opening" msgstr "连接在打开后立即关闭" +#: vrtManager/connection.py:231 +#, python-format +msgid "Connection Failed: %(error)s" +msgstr "连接失败:%(error)s" + +#: vrtManager/connection.py:291 +#, python-format +msgid "Connection closed (%(reason)s)" +msgstr "连接已关闭(%(reason)s)" + +#: vrtManager/connection.py:433 +#, python-format +msgid "Connection Failed: %(host)s is not connected" +msgstr "连接失败:%(host)s 未连接" + #: vrtManager/instance.py:134 msgid "A running or paused VM cannot be migrated offline" msgstr "运行中或已暂停的虚拟机不能离线迁移" @@ -8562,116 +8622,116 @@ msgid "" "with '.'" msgstr "快照名称为 1-64 个字母、数字、'.'、'_' 或 '-',且不能以 '.' 开头" -#: vrtManager/instance.py:1100 +#: vrtManager/instance.py:1076 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:1112 +#: vrtManager/instance.py:1088 msgid "Invalid Device Type for boot order" msgstr "启动顺序的设备类型无效" -#: vrtManager/instance.py:1115 +#: vrtManager/instance.py:1091 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "启动设备 %(dev)s 不在定义中" -#: vrtManager/instance.py:1135 +#: vrtManager/instance.py:1111 #, python-format msgid "CD-ROM %(dev)s is not in the running definition" msgstr "CD-ROM %(dev)s 不在运行中的定义中" -#: vrtManager/instance.py:1136 +#: vrtManager/instance.py:1112 #, python-format msgid "CD-ROM %(dev)s is not in the persistent definition" msgstr "CD-ROM %(dev)s 不在持久定义中" -#: vrtManager/instance.py:1148 +#: vrtManager/instance.py:1124 #, python-format msgid "Media of %(dev)s changed in the running VM only: %(err)s" msgstr "%(dev)s 的介质仅在运行中的虚拟机中更改:%(err)s" -#: vrtManager/instance.py:1159 +#: vrtManager/instance.py:1135 #, python-format msgid "ISO image %(image)s was not found" msgstr "未找到 ISO 镜像 %(image)s" -#: vrtManager/instance.py:1161 +#: vrtManager/instance.py:1137 #, python-format msgid "ISO image %(image)s is in more than one storage pool" msgstr "ISO 镜像 %(image)s 位于多个存储池中" -#: vrtManager/instance.py:1268 +#: vrtManager/instance.py:1244 #, python-format msgid "Disk %(target_dev)s is not in the VM's definition" msgstr "磁盘 %(target_dev)s 不在虚拟机的定义中" -#: vrtManager/instance.py:1396 +#: vrtManager/instance.py:1372 msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "请先关闭虚拟机,再启用 vCPU 热插拔" -#: vrtManager/instance.py:1859 +#: vrtManager/instance.py:1835 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "虚拟机有外部快照;内部快照不能与其混用" -#: vrtManager/instance.py:1891 +#: vrtManager/instance.py:1867 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "含内存的快照不会静默文件系统;它保存整个客户机状态" -#: vrtManager/instance.py:1893 +#: vrtManager/instance.py:1869 msgid "Only a running VM's file systems can be frozen" msgstr "只有运行中的虚拟机的文件系统可以冻结" -#: vrtManager/instance.py:1895 +#: vrtManager/instance.py:1871 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU 客户机代理未连接;文件系统由它冻结" -#: vrtManager/instance.py:1898 +#: vrtManager/instance.py:1874 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "虚拟机有内部快照;外部快照不能与其混用" -#: vrtManager/instance.py:1903 +#: vrtManager/instance.py:1879 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "上次还原后存在更新的快照;请先删除它们" -#: vrtManager/instance.py:1906 +#: vrtManager/instance.py:1882 msgid "No snapshot is current; revert to a snapshot first" msgstr "没有当前快照;请先还原到某个快照" -#: vrtManager/instance.py:1912 +#: vrtManager/instance.py:1888 #, python-format msgid "Eject the media from %(dev)s first" msgstr "请先弹出 %(dev)s 中的介质" -#: vrtManager/instance.py:1914 +#: vrtManager/instance.py:1890 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "磁盘 %(dev)s 不是文件;外部快照需要文件磁盘" -#: vrtManager/instance.py:1922 +#: vrtManager/instance.py:1898 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " "%(err)s" msgstr "无法刷新存储池,其可用空间未知:%(err)s" -#: vrtManager/instance.py:1943 +#: vrtManager/instance.py:1919 msgid "Memory is saved only from a running VM" msgstr "只能保存运行中的虚拟机的内存" -#: vrtManager/instance.py:1945 +#: vrtManager/instance.py:1921 msgid "The VM has no disk to keep its memory next to" msgstr "虚拟机没有可存放其内存的磁盘" -#: vrtManager/instance.py:1949 +#: vrtManager/instance.py:1925 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "%(disk)s 不在存储池中;内存只能保存到存储池中" -#: vrtManager/instance.py:1980 +#: vrtManager/instance.py:1956 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -8681,156 +8741,156 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;快照需要 %(size).1f GiB(其中虚拟机磁盘" "的 %(percent)g%%,至少 %(minimum)g GiB,若保存内存则另加内存)" -#: vrtManager/instance.py:1998 +#: vrtManager/instance.py:1974 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:2028 +#: vrtManager/instance.py:2004 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " "running." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机正在运行。" -#: vrtManager/instance.py:2030 +#: vrtManager/instance.py:2006 #, 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:2193 +#: vrtManager/instance.py:2169 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "仅当虚拟机已定义且处于运行、暂停或关机状态时才能移动磁盘" -#: vrtManager/instance.py:2195 +#: vrtManager/instance.py:2171 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" msgstr "有快照、保存的状态或正在运行块任务的虚拟机的磁盘不能移动" -#: vrtManager/instance.py:2203 +#: vrtManager/instance.py:2179 #, 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:2208 +#: vrtManager/instance.py:2184 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s 不能移动:只能移动可写的 raw 和 qcow2 磁盘" -#: vrtManager/instance.py:2215 +#: vrtManager/instance.py:2191 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s 不能移动:没有存储池包含 %(path)s" -#: vrtManager/instance.py:2217 +#: vrtManager/instance.py:2193 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s 不能移动:它有后备文件" -#: vrtManager/instance.py:2220 +#: vrtManager/instance.py:2196 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s 不是此主机上活动的磁盘文件存储池" -#: vrtManager/instance.py:2223 +#: vrtManager/instance.py:2199 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s 已在存储池 %(pool_name)s 中" -#: vrtManager/instance.py:2227 +#: vrtManager/instance.py:2203 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "存储池 %(pool_name)s 中已有文件 %(name)s" -#: vrtManager/instance.py:2251 +#: vrtManager/instance.py:2227 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s 的复制在完成前结束" -#: vrtManager/instance.py:2296 +#: vrtManager/instance.py:2272 #, 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:2298 +#: vrtManager/instance.py:2274 #, 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:2305 +#: vrtManager/instance.py:2281 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的内部快照" -#: vrtManager/instance.py:2314 +#: vrtManager/instance.py:2290 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "虚拟机有保存的状态;请先启动它或删除保存的状态" -#: vrtManager/instance.py:2316 +#: vrtManager/instance.py:2292 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "此虚拟机上仍有快照任务在运行;请在其结束后重试" -#: vrtManager/instance.py:2326 +#: vrtManager/instance.py:2302 msgid "Shut the VM down to revert to an internal snapshot" msgstr "请关闭虚拟机后再还原到内部快照" -#: vrtManager/instance.py:2415 +#: vrtManager/instance.py:2391 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM 不是文件的虚拟机无法克隆" -#: vrtManager/instance.py:2483 +#: vrtManager/instance.py:2459 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(path)s" -#: vrtManager/instance.py:2493 +#: vrtManager/instance.py:2469 msgid "Shut the VM down before cloning it" msgstr "请先关闭虚拟机再克隆" -#: vrtManager/instance.py:2547 +#: vrtManager/instance.py:2523 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(leftovers)s" -#: vrtManager/instance.py:2558 +#: vrtManager/instance.py:2534 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "在线克隆需要 libvirt 11.10 或更高版本;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2561 +#: vrtManager/instance.py:2537 msgid "A VM with a TPM is cloned only shut down" msgstr "带 TPM 的虚拟机只能在关机时克隆" -#: vrtManager/instance.py:2564 +#: vrtManager/instance.py:2540 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "磁盘 %(dev)s 不是本地文件;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2566 +#: vrtManager/instance.py:2542 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "磁盘 %(dev)s 是可共享的;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2571 +#: vrtManager/instance.py:2547 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "磁盘 %(dev)s 在下次启动时会改变;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2573 +#: vrtManager/instance.py:2549 msgid "Another job is running on the VM; clone it when that ends" msgstr "虚拟机上有另一个任务正在运行;请在其结束后再克隆" -#: vrtManager/instance.py:2586 +#: vrtManager/instance.py:2562 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "卷 %(name)s 已存在于存储池 %(pool)s 中" -#: vrtManager/instance.py:2605 +#: vrtManager/instance.py:2581 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f " @@ -8839,92 +8899,92 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;克隆需要 %(size).1f GiB(复制的磁盘,再" "加其 %(percent)g%%,至少 %(minimum)g GiB)" -#: vrtManager/instance.py:2744 +#: vrtManager/instance.py:2720 msgid "A network interface that is a host device is removed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中删除" -#: vrtManager/instance.py:2760 +#: vrtManager/instance.py:2736 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "没有 MAC 为 %(old_mac)s 的网络接口" -#: vrtManager/instance.py:2763 +#: vrtManager/instance.py:2739 msgid "A network interface that is a host device is changed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中修改" -#: vrtManager/instance.py:2854 +#: vrtManager/instance.py:2830 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" msgstr "虚拟机只能在运行时或无保存的状态的关机时更改其 PCI 设备" -#: vrtManager/instance.py:2866 +#: vrtManager/instance.py:2842 #, 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:2868 +#: vrtManager/instance.py:2844 #, 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:2870 +#: vrtManager/instance.py:2846 #, 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:2871 +#: vrtManager/instance.py:2847 #, 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:2873 +#: vrtManager/instance.py:2849 #, 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:2875 +#: vrtManager/instance.py:2851 #, 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:2877 +#: vrtManager/instance.py:2853 #, 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:2911 +#: vrtManager/instance.py:2887 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "虚拟机没有 PCI 设备 %(address)s" -#: vrtManager/instance.py:2929 +#: vrtManager/instance.py:2905 msgid "The VM has no USB controller" msgstr "虚拟机没有 USB 控制器" -#: vrtManager/instance.py:2948 +#: vrtManager/instance.py:2924 msgid "The VM has no such USB device" msgstr "虚拟机没有此 USB 设备" -#: vrtManager/instance.py:2989 +#: vrtManager/instance.py:2965 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "虚拟机有自己的 RNG 设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3016 +#: vrtManager/instance.py:2992 msgid "The VM has its own TPM: change it in the XML editor" msgstr "虚拟机有自己的 TPM:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3035 +#: vrtManager/instance.py:3011 #, python-format msgid "Unknown crash action %(action)s" msgstr "未知的崩溃操作 %(action)s" diff --git a/vrtManager/connection.py b/vrtManager/connection.py index 949c4f19..85fae4f1 100644 --- a/vrtManager/connection.py +++ b/vrtManager/connection.py @@ -45,7 +45,13 @@ RETRY_AFTER = getattr(settings, "LIBVIRT_RETRY_AFTER", 30) # request (the job worker's, the consoles') are not counted: a job holds its # host for as long as it runs. HOST_REQUESTS = getattr(settings, "LIBVIRT_HOST_REQUESTS", 2) -CLOSE_REASONS = {0: "error", 1: "end of file", 2: "keepalive timeout", 3: "client closed"} +# libvirt's close reasons, one whole message each +CLOSE_REASONS = { + 0: gettext_noop("Connection closed (error)"), + 1: gettext_noop("Connection closed (end of file)"), + 2: gettext_noop("Connection closed (keepalive timeout)"), + 3: gettext_noop("Connection closed (client closed)"), +} # ssh with a connect timeout for qemu+ssh (libvirt runs the "command" binary # in place of ssh and never passes one itself) SSH_COMMAND = os.path.join(os.path.dirname(os.path.abspath(__file__)), "libvirt-ssh") @@ -130,8 +136,8 @@ def _count_on(connection): return _leave_host() if not connection.requests.acquire(timeout=CONNECT_TIMEOUT): - raise util.ConnectionFailed( - f"Connection Failed: {connection.host} does not answer: {HOST_REQUESTS} requests still wait for it") + raise util.ConnectionFailed(gettext_noop("Connection Failed: %(host)s does not answer: %(requests)s requests still wait for it"), + host=connection.host, requests=HOST_REQUESTS) _request.held = connection @@ -199,7 +205,8 @@ class wvmConnection(object): if not opening.wait(CONNECT_TIMEOUT): with self.connection_state_lock: if self._opening is opening: # still running: give up waiting, not the open - self.last_error = f"Connection Failed: {self.host} did not answer within {CONNECT_TIMEOUT} s" + self.last_error = util.message(gettext_noop("Connection Failed: %(host)s did not answer within %(seconds)s s"), + host=self.host, seconds=CONNECT_TIMEOUT) opening.abandoned = True def _open(self, opening): @@ -219,7 +226,9 @@ class wvmConnection(object): except libvirtError: pass except Exception as e: # libvirtError, or anything else from the transport - error = f"Connection Failed: {str(e)}" + # libvirt's own text stays as it is; one of ours is a message of its own + reason = [util.message(e.text, **e.values)] if isinstance(e, util.OperationError) else str(e) + error = util.message(gettext_noop("Connection Failed: %(error)s"), error=reason) finally: with self.connection_state_lock: if error is None: @@ -276,7 +285,10 @@ class wvmConnection(object): # not drop its successor. if connection is not self.connection: return - self.last_error = f"Connection closed ({CLOSE_REASONS.get(reason, reason)})" + if reason in CLOSE_REASONS: + self.last_error = util.message(CLOSE_REASONS[reason]) + else: + self.last_error = util.message(gettext_noop("Connection closed (%(reason)s)"), reason=reason) # prevent other threads from using the connection (in the future) self.connection = None @@ -417,7 +429,10 @@ class wvmConnectionManager(object): connection.connect() live = connection.alive_connection() if live is None: - raise util.ConnectionFailed(connection.last_error) + # a connection that died without a close callback leaves no error behind + error = connection.last_error or util.message(gettext_noop("Connection Failed: %(host)s is not connected"), + host=connection.host) + raise util.ConnectionFailed(error["text"], **error["values"]) return live def host_is_up(self, conn_type, hostname, timeout=1): diff --git a/vrtManager/tests/test_connection.py b/vrtManager/tests/test_connection.py index 27f32693..fb68e40e 100644 --- a/vrtManager/tests/test_connection.py +++ b/vrtManager/tests/test_connection.py @@ -194,7 +194,7 @@ class BoundedOpenTestCase(unittest.TestCase): self.assertIs(self.get()[0], new) entry._wvmConnection__connection_close_callback(new, 2) self.assertIsNone(entry.connection) - self.assertEqual(entry.last_error, "Connection closed (keepalive timeout)") + self.assertEqual(entry.last_error, {"text": "Connection closed (keepalive timeout)", "values": {}}) def test_a_connection_closed_before_it_is_published_is_an_error(self): self.release.set()