diff --git a/Makefile b/Makefile index f748c7992b..6d55edc698 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ ifeq ($(OFFICIAL),yes) AW_REPO_URL ?= http://releases.ansible.com/ansible-tower else RELEASE ?= $(BUILD) - AW_REPO_URL ?= http://jenkins.testing.ansible.com/ansible-tower_nightlies_RTYUIOPOIUYTYU/$(GIT_BRANCH) + AW_REPO_URL ?= http://jenkins.testing.ansible.com/ansible-tower_nightlies_f8b8c5588b2505970227a7b0900ef69040ad5a00/$(GIT_BRANCH) endif # Allow AMI license customization @@ -402,7 +402,7 @@ uwsgi: collectstatic @if [ "$(VENV_BASE)" ]; then \ . $(VENV_BASE)/tower/bin/activate; \ fi; \ - uwsgi -b 32768 --socket :8050 --module=awx.wsgi:application --home=/venv/tower --chdir=/tower_devel/ --vacuum --processes=5 --harakiri=120 --master --no-orphans --py-autoreload 1 --max-requests=1000 --stats /tmp/stats.socket --master-fifo=/var/lib/awx/awxfifo --lazy-apps + uwsgi -b 32768 --socket :8050 --module=awx.wsgi:application --home=/venv/tower --chdir=/tower_devel/ --vacuum --processes=5 --harakiri=120 --master --no-orphans --py-autoreload 1 --max-requests=1000 --stats /tmp/stats.socket --master-fifo=/awxfifo --lazy-apps daphne: @if [ "$(VENV_BASE)" ]; then \ @@ -473,7 +473,7 @@ pylint: reports check: flake8 pep8 # pyflakes pylint -TEST_DIRS ?= awx/main/tests +TEST_DIRS ?= awx/main/tests awx/conf/tests awx/sso/tests # Run all API unit tests. test: @if [ "$(VENV_BASE)" ]; then \ @@ -485,7 +485,7 @@ test_unit: @if [ "$(VENV_BASE)" ]; then \ . $(VENV_BASE)/tower/bin/activate; \ fi; \ - py.test awx/main/tests/unit + py.test awx/main/tests/unit awx/conf/tests/unit awx/sso/tests/unit # Run all API unit tests with coverage enabled. test_coverage: @@ -690,6 +690,7 @@ rpm-build: rpm-build/$(SDIST_TAR_FILE): rpm-build dist/$(SDIST_TAR_FILE) cp packaging/rpm/$(NAME).spec rpm-build/ cp packaging/rpm/tower.te rpm-build/ + cp packaging/rpm/tower.fc rpm-build/ cp packaging/rpm/$(NAME).sysconfig rpm-build/ cp packaging/remove_tower_source.py rpm-build/ cp packaging/bytecompile.sh rpm-build/ @@ -892,11 +893,5 @@ clean-elk: docker rm tools_elasticsearch_1 docker rm tools_kibana_1 -mongo-debug-ui: - docker run -it --rm --name mongo-express --link tools_mongo_1:mongo -e ME_CONFIG_OPTIONS_EDITORTHEME=ambiance -e ME_CONFIG_BASICAUTH_USERNAME=admin -e ME_CONFIG_BASICAUTH_PASSWORD=password -p 8081:8081 knickers/mongo-express - -mongo-container: - docker run -it --link tools_mongo_1:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/system_tracking_dev"' - psql-container: - docker run -it --link tools_postgres_1:postgres --rm postgres:9.4.1 sh -c 'exec psql -h "$$POSTGRES_PORT_5432_TCP_ADDR" -p "$$POSTGRES_PORT_5432_TCP_PORT" -U postgres' + docker run -it --net tools_default --rm postgres:9.4.1 sh -c 'exec psql -h "postgres" -p "5432" -U postgres' diff --git a/awx/api/generics.py b/awx/api/generics.py index 93a8d3d987..5e81ee7bdb 100644 --- a/awx/api/generics.py +++ b/awx/api/generics.py @@ -285,6 +285,10 @@ class ListAPIView(generics.ListAPIView, GenericAPIView): if name.endswith('_set'): continue fields.append('{}__search'.format(name)) + for relationship in self.model._meta.local_many_to_many: + if relationship.related_model._meta.app_label != 'main': + continue + fields.append('{}__search'.format(relationship.name)) return fields diff --git a/awx/api/metadata.py b/awx/api/metadata.py index 21444acb75..37f00fdbac 100644 --- a/awx/api/metadata.py +++ b/awx/api/metadata.py @@ -32,6 +32,7 @@ class Metadata(metadata.SimpleMetadata): 'min_length', 'max_length', 'min_value', 'max_value', 'category', 'category_slug', + 'defined_in_file' ] for attr in text_attrs: @@ -156,6 +157,10 @@ class Metadata(metadata.SimpleMetadata): # For PUT/POST methods, remove read-only fields. if method in ('PUT', 'POST'): + # This value should always be False for PUT/POST, so don't + # show it (file-based read-only settings can't be updated) + meta.pop('defined_in_file', False) + if meta.pop('read_only', False): actions[method].pop(field) @@ -187,6 +192,10 @@ class Metadata(metadata.SimpleMetadata): if getattr(view, 'related_search_fields', None): metadata['related_search_fields'] = view.related_search_fields + from rest_framework import generics + if isinstance(view, generics.ListAPIView) and hasattr(view, 'paginator'): + metadata['max_page_size'] = view.paginator.max_page_size + return metadata diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 2845328bad..cdb30e113d 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -25,6 +25,7 @@ from django.utils.translation import ugettext_lazy as _ from django.utils.encoding import force_text from django.utils.text import capfirst from django.utils.timezone import now +from django.utils.functional import cached_property # Django REST Framework from rest_framework.exceptions import ValidationError @@ -330,13 +331,7 @@ class BaseSerializer(serializers.ModelSerializer): roles = {} for field in obj._meta.get_fields(): if type(field) is ImplicitRoleField: - role = getattr(obj, field.name) - #roles[field.name] = RoleSerializer(data=role).to_representation(role) - roles[field.name] = { - 'id': role.id, - 'name': role.name, - 'description': role.get_description(reference_content_object=obj), - } + roles[field.name] = role_summary_fields_generator(obj, field.name) if len(roles) > 0: summary_fields['object_roles'] = roles @@ -980,7 +975,16 @@ class ProjectSerializer(UnifiedJobTemplateSerializer, ProjectOptionsSerializer): args=(obj.last_update.pk,)) return res + def to_representation(self, obj): + ret = super(ProjectSerializer, self).to_representation(obj) + if 'scm_revision' in ret and obj.scm_type == '': + ret['scm_revision'] = '' + return ret + def validate(self, attrs): + def get_field_from_model_or_attrs(fd): + return attrs.get(fd, self.instance and getattr(self.instance, fd) or None) + organization = None if 'organization' in attrs: organization = attrs['organization'] @@ -991,6 +995,10 @@ class ProjectSerializer(UnifiedJobTemplateSerializer, ProjectOptionsSerializer): if not organization and not view.request.user.is_superuser: # Only allow super users to create orgless projects raise serializers.ValidationError(_('Organization is missing')) + elif get_field_from_model_or_attrs('scm_type') == '': + for fd in ('scm_update_on_launch', 'scm_delete_on_update', 'scm_clean'): + if get_field_from_model_or_attrs(fd): + raise serializers.ValidationError({fd: _('Update options must be set to false for manual projects.')}) return super(ProjectSerializer, self).validate(attrs) @@ -1717,11 +1725,11 @@ class CredentialSerializer(BaseSerializer): owner_teams = reverse('api:credential_owner_teams_list', args=(obj.pk,)), )) - parents = obj.admin_role.parents.exclude(object_id__isnull=True) - if parents.count() > 0: + parents = [role for role in obj.admin_role.parents.all() if role.object_id is not None] + if parents: res.update({parents[0].content_type.name:parents[0].content_object.get_absolute_url()}) - elif obj.admin_role.members.count() > 0: - user = obj.admin_role.members.first() + elif len(obj.admin_role.members.all()) > 0: + user = obj.admin_role.members.all()[0] res.update({'user': reverse('api:user_detail', args=(user.pk,))}) return res @@ -1739,7 +1747,7 @@ class CredentialSerializer(BaseSerializer): 'url': reverse('api:user_detail', args=(user.pk,)), }) - for parent in obj.admin_role.parents.exclude(object_id__isnull=True).all(): + for parent in [role for role in obj.admin_role.parents.all() if role.object_id is not None]: summary_dict['owners'].append({ 'id': parent.content_object.pk, 'type': camelcase_to_underscore(parent.content_object.__class__.__name__), @@ -1825,11 +1833,15 @@ class OrganizationCredentialSerializerCreate(CredentialSerializerCreate): class LabelsListMixin(object): def _summary_field_labels(self, obj): - label_list = [{'id': x.id, 'name': x.name} for x in obj.labels.all().order_by('name')[:10]] - if len(label_list) < 10: - label_ct = len(label_list) + if hasattr(obj, '_prefetched_objects_cache') and obj.labels.prefetch_cache_name in obj._prefetched_objects_cache: + label_list = [{'id': x.id, 'name': x.name} for x in obj.labels.all()[:10]] + label_ct = len(obj.labels.all()) else: - label_ct = obj.labels.count() + label_list = [{'id': x.id, 'name': x.name} for x in obj.labels.all().order_by('name')[:10]] + if len(label_list) < 10: + label_ct = len(label_list) + else: + label_ct = obj.labels.count() return {'count': label_ct, 'results': label_list} def get_summary_fields(self, obj): @@ -1950,16 +1962,25 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO return res def validate(self, attrs): - survey_enabled = attrs.get('survey_enabled', self.instance and self.instance.survey_enabled or False) - job_type = attrs.get('job_type', self.instance and self.instance.job_type or None) - inventory = attrs.get('inventory', self.instance and self.instance.inventory or None) - project = attrs.get('project', self.instance and self.instance.project or None) + def get_field_from_model_or_attrs(fd): + return attrs.get(fd, self.instance and getattr(self.instance, fd) or None) + survey_enabled = get_field_from_model_or_attrs('survey_enabled') + job_type = get_field_from_model_or_attrs('job_type') + inventory = get_field_from_model_or_attrs('inventory') + credential = get_field_from_model_or_attrs('credential') + project = get_field_from_model_or_attrs('project') + + prompting_error_message = _("Must either set a default value or ask to prompt on launch.") if job_type == "scan": if inventory is None or attrs.get('ask_inventory_on_launch', False): raise serializers.ValidationError({'inventory': _('Scan jobs must be assigned a fixed inventory.')}) elif project is None: raise serializers.ValidationError({'project': _("Job types 'run' and 'check' must have assigned a project.")}) + elif credential is None and not get_field_from_model_or_attrs('ask_credential_on_launch'): + raise serializers.ValidationError({'credential': prompting_error_message}) + elif inventory is None and not get_field_from_model_or_attrs('ask_inventory_on_launch'): + raise serializers.ValidationError({'inventory': prompting_error_message}) if survey_enabled and job_type == PERM_INVENTORY_SCAN: raise serializers.ValidationError({'survey_enabled': _('Survey Enabled cannot be used with scan jobs.')}) @@ -2959,6 +2980,23 @@ class ActivityStreamSerializer(BaseSerializer): changes = serializers.SerializerMethodField() object_association = serializers.SerializerMethodField() + @cached_property + def _local_summarizable_fk_fields(self): + summary_dict = copy.copy(SUMMARIZABLE_FK_FIELDS) + # Special requests + summary_dict['group'] = summary_dict['group'] + ('inventory_id',) + for key in summary_dict.keys(): + if 'id' not in summary_dict[key]: + summary_dict[key] = summary_dict[key] + ('id',) + field_list = summary_dict.items() + # Needed related fields that are not in the default summary fields + field_list += [ + ('workflow_job_template_node', ('id', 'unified_job_template_id')), + ('label', ('id', 'name', 'organization_id')), + ('notification', ('id', 'status', 'notification_type', 'notification_template_id')) + ] + return field_list + class Meta: model = ActivityStream fields = ('*', '-name', '-description', '-created', '-modified', @@ -2999,7 +3037,7 @@ class ActivityStreamSerializer(BaseSerializer): rel = {} if obj.actor is not None: rel['actor'] = reverse('api:user_detail', args=(obj.actor.pk,)) - for fk, __ in SUMMARIZABLE_FK_FIELDS.items(): + for fk, __ in self._local_summarizable_fk_fields: if not hasattr(obj, fk): continue allm2m = getattr(obj, fk).all() @@ -3021,7 +3059,7 @@ class ActivityStreamSerializer(BaseSerializer): def get_summary_fields(self, obj): summary_fields = OrderedDict() - for fk, related_fields in SUMMARIZABLE_FK_FIELDS.items(): + for fk, related_fields in self._local_summarizable_fk_fields: try: if not hasattr(obj, fk): continue @@ -3046,14 +3084,10 @@ class ActivityStreamSerializer(BaseSerializer): summary_fields[get_type_for_model(unified_job_template)] = {'id': unified_job_template.id, 'name': unified_job_template.name} thisItemDict = {} - if 'id' not in related_fields: - related_fields = related_fields + ('id',) for field in related_fields: fval = getattr(thisItem, field, None) if fval is not None: thisItemDict[field] = fval - if fk == 'group': - thisItemDict['inventory_id'] = getattr(thisItem, 'inventory_id', None) if thisItemDict.get('id', None): if thisItemDict.get('id', None) in [obj_dict.get('id', None) for obj_dict in summary_fields[fk]]: continue diff --git a/awx/api/templates/api/auth_token_view.md b/awx/api/templates/api/auth_token_view.md index c25c658aef..69078842d4 100644 --- a/awx/api/templates/api/auth_token_view.md +++ b/awx/api/templates/api/auth_token_view.md @@ -32,3 +32,6 @@ agent that originally obtained it. Each request that uses the token for authentication will refresh its expiration timestamp and keep it from expiring. A token only expires when it is not used for the configured timeout interval (default 1800 seconds). + +A DELETE request with the token set will cause the token to be invalidated and +no further requests can be made with it. diff --git a/awx/api/templates/api/job_template_survey_spec.md b/awx/api/templates/api/job_template_survey_spec.md index d1a222b31f..d4c98bac3f 100644 --- a/awx/api/templates/api/job_template_survey_spec.md +++ b/awx/api/templates/api/job_template_survey_spec.md @@ -1,4 +1,4 @@ -POST requests to this resource should include the full specification for a Job Template Survey +POST requests to this resource should include the full specification for a {{ model_verbose_name|title }}'s Survey Here is an example survey specification: @@ -30,7 +30,7 @@ Within each survey item `type` must be one of: * multiselect: For survey questions where multiple items from a presented list can be selected Each item must contain a `question_name` and `question_description` field that describes the survey question itself. -The `variable` elements of each survey items represents the key that will be given to the playbook when the job template +The `variable` elements of each survey items represents the key that will be given to the playbook when the {{model_verbose_name}} is launched. It will contain the value as a result of the survey. Here is a more comprehensive example showing the various question types and their acceptable parameters: diff --git a/awx/api/templates/api/system_job_template_launch.md b/awx/api/templates/api/system_job_template_launch.md index a50e3fdae3..3a5d2d3b7a 100644 --- a/awx/api/templates/api/system_job_template_launch.md +++ b/awx/api/templates/api/system_job_template_launch.md @@ -8,16 +8,20 @@ on the host system via the `tower-manage` command. For example on `cleanup_jobs` and `cleanup_activitystream`: -`{"days": 30}` +`{"extra_vars": {"days": 30}}` Which will act on data older than 30 days. For `cleanup_facts`: -`{"older_than": "4w", "granularity": "3d"}` +`{"extra_vars": {"older_than": "4w", "granularity": "3d"}}` Which will reduce the granularity of scan data to one scan per 3 days when the data is older than 4w. +For `cleanup_activitystream` and `cleanup_jobs` commands, providing +`"dry_run": true` inside of `extra_vars` will show items that will be +removed without deleting them. + Each individual system job task has its own default values, which are applicable either when running it from the command line or launching its system job template with empty `extra_vars`. diff --git a/awx/api/templates/api/workflow_job_template_copy.md b/awx/api/templates/api/workflow_job_template_copy.md index f28d6466ba..86944ed707 100644 --- a/awx/api/templates/api/workflow_job_template_copy.md +++ b/awx/api/templates/api/workflow_job_template_copy.md @@ -1,13 +1,13 @@ Copy a Workflow Job Template: Make a GET request to this resource to determine if the current user has -permission to copy the workflow_job_template and whether any linked +permission to copy the {{model_verbose_name}} and whether any linked templates or prompted fields will be ignored due to permissions problems. The response will include the following fields: * `can_copy`: Flag indicating whether the active user has permission to make - a copy of this workflow_job_template, provides same content as the - workflow_job_template detail view summary_fields.user_capabilities.copy + a copy of this {{model_verbose_name}}, provides same content as the + {{model_verbose_name}} detail view summary_fields.user_capabilities.copy (boolean, read-only) * `can_copy_without_user_input`: Flag indicating if the user should be prompted for confirmation before the copy is executed (boolean, read-only) @@ -22,11 +22,11 @@ The response will include the following fields: to use and will be missing in workflow nodes of the copy (array, read-only) Make a POST request to this endpoint to save a copy of this -workflow_job_template. No POST data is accepted for this action. +{{model_verbose_name}}. No POST data is accepted for this action. If successful, the response status code will be 201. The response body will -contain serialized data about the new workflow_job_template, which will be -similar to the original workflow_job_template, but with an additional `@` +contain serialized data about the new {{model_verbose_name}}, which will be +similar to the original {{model_verbose_name}}, but with an additional `@` and a timestamp in the name. All workflow nodes and connections in the original will also exist in the diff --git a/awx/api/views.py b/awx/api/views.py index f36404d710..56d5e7d789 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -3,11 +3,14 @@ # All Rights Reserved. # Python +import os +import re import cgi import datetime import dateutil import time import socket +import subprocess import sys import logging from base64 import b64encode @@ -20,7 +23,7 @@ from django.core.cache import cache from django.core.urlresolvers import reverse from django.core.exceptions import FieldError from django.db.models import Q, Count -from django.db import IntegrityError, transaction +from django.db import IntegrityError, transaction, connection from django.shortcuts import get_object_or_404 from django.utils.encoding import smart_text, force_text from django.utils.safestring import mark_safe @@ -606,6 +609,15 @@ class AuthTokenView(APIView): extra=dict(actor=request.data['username'])) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + def delete(self, request): + if 'HTTP_AUTHORIZATION' in request.META: + token_match = re.match("Token\s(.+)", request.META['HTTP_AUTHORIZATION']) + if token_match: + filter_tokens = AuthToken.objects.filter(key=token_match.groups()[0]) + if filter_tokens.exists(): + filter_tokens[0].invalidate() + return Response(status=status.HTTP_204_NO_CONTENT) + class OrganizationCountsMixin(object): @@ -1071,7 +1083,7 @@ class ProjectTeamsList(ListAPIView): return self.model.accessible_objects(self.request.user, 'read_role').filter(pk__in=[t.content_object.pk for t in all_roles]) -class ProjectSchedulesList(SubListCreateAttachDetachAPIView): +class ProjectSchedulesList(SubListCreateAPIView): view_name = _("Project Schedules") @@ -1434,6 +1446,7 @@ class CredentialList(ListCreateAPIView): model = Credential serializer_class = CredentialSerializerCreate + capabilities_prefetch = ['admin', 'use'] class CredentialOwnerUsersList(SubListAPIView): @@ -1681,6 +1694,7 @@ class HostList(ListCreateAPIView): always_allow_superuser = False model = Host serializer_class = HostSerializer + capabilities_prefetch = ['inventory.admin'] class HostDetail(RetrieveUpdateDestroyAPIView): @@ -2157,7 +2171,7 @@ class InventorySourceDetail(RetrieveUpdateAPIView): return super(InventorySourceDetail, self).destroy(request, *args, **kwargs) -class InventorySourceSchedulesList(SubListCreateAttachDetachAPIView): +class InventorySourceSchedulesList(SubListCreateAPIView): view_name = _("Inventory Source Schedules") @@ -2380,11 +2394,8 @@ class JobTemplateLaunch(RetrieveAPIView, GenericAPIView): if request.user not in new_inventory.use_role: raise PermissionDenied() - kv = prompted_fields - kv.update(passwords) - - new_job = obj.create_unified_job(**kv) - result = new_job.signal_start(**kv) + new_job = obj.create_unified_job(**prompted_fields) + result = new_job.signal_start(**passwords) if not result: data = dict(passwords_needed_to_start=new_job.passwords_needed_to_start) @@ -2398,7 +2409,7 @@ class JobTemplateLaunch(RetrieveAPIView, GenericAPIView): return Response(data, status=status.HTTP_201_CREATED) -class JobTemplateSchedulesList(SubListCreateAttachDetachAPIView): +class JobTemplateSchedulesList(SubListCreateAPIView): view_name = _("Job Template Schedules") @@ -2554,6 +2565,9 @@ class JobTemplateLabelList(DeleteLastUnattachLabelMixin, SubListCreateAttachDeta request.data['id'] = existing.id del request.data['name'] del request.data['organization'] + if Label.objects.filter(unifiedjobtemplate_labels=self.kwargs['pk']).count() > 100: + return Response(dict(msg=_('Maximum number of labels for {} reached.'.format( + self.parent_model._meta.verbose_name_raw))), status=status.HTTP_400_BAD_REQUEST) return super(JobTemplateLabelList, self).post(request, *args, **kwargs) @@ -2688,7 +2702,7 @@ class JobTemplateCallback(GenericAPIView): return Response(data, status=status.HTTP_400_BAD_REQUEST) else: host = list(matching_hosts)[0] - if not job_template.can_start_without_user_input(): + if not job_template.can_start_without_user_input(callback_extra_vars=extra_vars): data = dict(msg=_('Cannot start automatically, user input required!')) return Response(data, status=status.HTTP_400_BAD_REQUEST) limit = host.name @@ -2975,7 +2989,7 @@ class WorkflowJobTemplateLaunch(WorkflowsEnforcementMixin, RetrieveAPIView): prompted_fields, ignored_fields = obj._accept_or_ignore_job_kwargs(**request.data) new_job = obj.create_unified_job(**prompted_fields) - new_job.signal_start(**prompted_fields) + new_job.signal_start() data = OrderedDict() data['ignored_fields'] = ignored_fields @@ -3036,7 +3050,7 @@ class WorkflowJobTemplateJobsList(WorkflowsEnforcementMixin, SubListAPIView): new_in_310 = True -class WorkflowJobTemplateSchedulesList(WorkflowsEnforcementMixin, SubListCreateAttachDetachAPIView): +class WorkflowJobTemplateSchedulesList(WorkflowsEnforcementMixin, SubListCreateAPIView): view_name = _("Workflow Job Template Schedules") @@ -3108,7 +3122,7 @@ class WorkflowJobTemplateActivityStreamList(WorkflowsEnforcementMixin, ActivityS self.check_parent_access(parent) qs = self.request.user.get_queryset(self.model) return qs.filter(Q(workflow_job_template=parent) | - Q(workflow_job_template_node__workflow_job_template=parent)) + Q(workflow_job_template_node__workflow_job_template=parent)).distinct() class WorkflowJobList(WorkflowsEnforcementMixin, ListCreateAPIView): @@ -3210,7 +3224,7 @@ class SystemJobTemplateLaunch(GenericAPIView): return Response(data, status=status.HTTP_201_CREATED) -class SystemJobTemplateSchedulesList(SubListCreateAttachDetachAPIView): +class SystemJobTemplateSchedulesList(SubListCreateAPIView): view_name = _("System Job Template Schedules") @@ -3406,6 +3420,11 @@ class BaseJobHostSummariesList(SubListAPIView): relationship = 'job_host_summaries' view_name = _('Job Host Summaries List') + def get_queryset(self): + parent = self.get_parent_object() + self.check_parent_access(parent) + return getattr(parent, self.relationship).select_related('job', 'job__job_template', 'host') + class HostJobHostSummariesList(BaseJobHostSummariesList): @@ -3475,6 +3494,13 @@ class HostJobEventsList(BaseJobEventsList): parent_model = Host + def get_queryset(self): + parent_obj = self.get_parent_object() + self.check_parent_access(parent_obj) + qs = self.request.user.get_queryset(self.model).filter( + Q(host=parent_obj) | Q(hosts=parent_obj)).distinct() + return qs + class GroupJobEventsList(BaseJobEventsList): @@ -3757,6 +3783,12 @@ class UnifiedJobTemplateList(ListAPIView): model = UnifiedJobTemplate serializer_class = UnifiedJobTemplateSerializer new_in_148 = True + capabilities_prefetch = [ + 'admin', 'execute', + {'copy': ['jobtemplate.project.use', 'jobtemplate.inventory.use', 'jobtemplate.credential.use', + 'jobtemplate.cloud_credential.use', 'jobtemplate.network_credential.use', + 'workflowjobtemplate.organization.admin']} + ] class UnifiedJobList(ListAPIView): @@ -3852,6 +3884,17 @@ class UnifiedJobStdout(RetrieveAPIView): elif request.accepted_renderer.format == 'ansi': return Response(unified_job.result_stdout_raw) elif request.accepted_renderer.format in {'txt_download', 'ansi_download'}: + if not os.path.exists(unified_job.result_stdout_file): + write_fd = open(unified_job.result_stdout_file, 'w') + with connection.cursor() as cursor: + try: + cursor.copy_expert("copy (select stdout from main_jobevent where job_id={} order by start_line) to stdout".format(unified_job.id), + write_fd) + write_fd.close() + subprocess.Popen("sed -i 's/\\\\r\\\\n/\\n/g' {}".format(unified_job.result_stdout_file), + shell=True).wait() + except Exception as e: + return Response({"error": _("Error generating stdout download file: {}".format(e))}) try: content_fd = open(unified_job.result_stdout_file, 'r') if request.accepted_renderer.format == 'txt_download': diff --git a/awx/conf/apps.py b/awx/conf/apps.py index 6e09545236..9ae459fb35 100644 --- a/awx/conf/apps.py +++ b/awx/conf/apps.py @@ -22,4 +22,3 @@ class ConfConfig(AppConfig): if 'http_receiver' not in LOGGING_DICT['loggers']['awx']['handlers']: LOGGING_DICT['loggers']['awx']['handlers'] += ['http_receiver'] configure_logging(settings.LOGGING_CONFIG, LOGGING_DICT) - # checks.register(SettingsWrapper._check_settings) diff --git a/awx/conf/fields.py b/awx/conf/fields.py index bd2e047ae7..13d80ae937 100644 --- a/awx/conf/fields.py +++ b/awx/conf/fields.py @@ -52,7 +52,7 @@ class URLField(CharField): if url_parts.hostname and '.' not in url_parts.hostname: netloc = '{}.local'.format(url_parts.hostname) if url_parts.port: - netloc = '{}:{}'.format(netloc, port) + netloc = '{}:{}'.format(netloc, url_parts.port) if url_parts.username: if url_parts.password: netloc = '{}:{}@{}' % (url_parts.username, url_parts.password, netloc) diff --git a/awx/conf/registry.py b/awx/conf/registry.py index 2534e238c0..faf210fbb0 100644 --- a/awx/conf/registry.py +++ b/awx/conf/registry.py @@ -18,9 +18,18 @@ __all__ = ['settings_registry'] class SettingsRegistry(object): """Registry of all API-configurable settings and categories.""" - def __init__(self): + def __init__(self, settings=None): + """ + :param settings: a ``django.conf.LazySettings`` object used to lookup + file-based field values (e.g., ``local_settings.py`` + and ``/etc/tower/conf.d/example.py``). If unspecified, + defaults to ``django.conf.settings``. + """ + if settings is None: + from django.conf import settings self._registry = OrderedDict() self._dependent_settings = {} + self.settings = settings def register(self, setting, **kwargs): if setting in self._registry: @@ -94,7 +103,6 @@ class SettingsRegistry(object): return bool(self._registry.get(setting, {}).get('encrypted', False)) def get_setting_field(self, setting, mixin_class=None, for_user=False, **kwargs): - from django.conf import settings from rest_framework.fields import empty field_kwargs = {} field_kwargs.update(self._registry[setting]) @@ -108,6 +116,7 @@ class SettingsRegistry(object): placeholder = field_kwargs.pop('placeholder', empty) feature_required = field_kwargs.pop('feature_required', empty) encrypted = bool(field_kwargs.pop('encrypted', False)) + defined_in_file = bool(field_kwargs.pop('defined_in_file', False)) if getattr(field_kwargs.get('child', None), 'source', None) is not None: field_kwargs['child'].source = None field_instance = field_class(**field_kwargs) @@ -118,18 +127,25 @@ class SettingsRegistry(object): field_instance.placeholder = placeholder if feature_required is not empty: field_instance.feature_required = feature_required + field_instance.defined_in_file = defined_in_file + if field_instance.defined_in_file: + field_instance.help_text = ( + str(_('This value has been set manually in a settings file.')) + + '\n\n' + + str(field_instance.help_text) + ) field_instance.encrypted = encrypted original_field_instance = field_instance if field_class != original_field_class: original_field_instance = original_field_class(**field_kwargs) if category_slug == 'user' and for_user: try: - field_instance.default = original_field_instance.to_representation(getattr(settings, setting)) + field_instance.default = original_field_instance.to_representation(getattr(self.settings, setting)) except: logger.warning('Unable to retrieve default value for user setting "%s".', setting, exc_info=True) - elif not field_instance.read_only or field_instance.default is empty: + elif not field_instance.read_only or field_instance.default is empty or field_instance.defined_in_file: try: - field_instance.default = original_field_instance.to_representation(settings._awx_conf_settings._get_default(setting)) + field_instance.default = original_field_instance.to_representation(self.settings._awx_conf_settings._get_default(setting)) except AttributeError: pass except: diff --git a/awx/conf/settings.py b/awx/conf/settings.py index d5e379ba9f..8b1c0786a1 100644 --- a/awx/conf/settings.py +++ b/awx/conf/settings.py @@ -1,4 +1,5 @@ # Python +from collections import namedtuple import contextlib import logging import sys @@ -7,8 +8,7 @@ import time # Django from django.conf import settings, UserSettingsHolder -from django.core.cache import cache -from django.core import checks +from django.core.cache import cache as django_cache from django.core.exceptions import ImproperlyConfigured from django.db import ProgrammingError, OperationalError @@ -16,7 +16,7 @@ from django.db import ProgrammingError, OperationalError from rest_framework.fields import empty, SkipField # Tower -from awx.main.utils import decrypt_field +from awx.main.utils import encrypt_field, decrypt_field from awx.conf import settings_registry from awx.conf.models import Setting @@ -62,38 +62,118 @@ def _log_database_error(): pass +class EncryptedCacheProxy(object): + + def __init__(self, cache, registry, encrypter=None, decrypter=None): + """ + This proxy wraps a Django cache backend and overwrites the + `get`/`set`/`set_many` methods to handle field encryption/decryption + for sensitive values. + + :param cache: the Django cache backend to proxy to + :param registry: the settings registry instance used to determine if + a field is encrypted or not. + :param encrypter: a callable used to encrypt field values; defaults to + ``awx.main.utils.encrypt_field`` + :param decrypter: a callable used to decrypt field values; defaults to + ``awx.main.utils.decrypt_field`` + """ + + # These values have to be stored via self.__dict__ in this way to get + # around the magic __setattr__ method on this class. + self.__dict__['cache'] = cache + self.__dict__['registry'] = registry + self.__dict__['encrypter'] = encrypter or encrypt_field + self.__dict__['decrypter'] = decrypter or decrypt_field + + def get(self, key, **kwargs): + value = self.cache.get(key, **kwargs) + return self._handle_encryption(self.decrypter, key, value) + + def set(self, key, value, **kwargs): + self.cache.set( + key, + self._handle_encryption(self.encrypter, key, value), + **kwargs + ) + + def set_many(self, data, **kwargs): + for key, value in data.items(): + self.set(key, value, **kwargs) + + def _handle_encryption(self, method, key, value): + TransientSetting = namedtuple('TransientSetting', ['pk', 'value']) + + if value is not empty and self.registry.is_setting_encrypted(key): + # If the setting exists in the database, we'll use its primary key + # as part of the AES key when encrypting/decrypting + return method( + TransientSetting( + pk=getattr(self._get_setting_from_db(key), 'pk', None), + value=value + ), + 'value' + ) + + # If the field in question isn't an "encrypted" field, this function is + # a no-op; it just returns the provided value + return value + + def _get_setting_from_db(self, key): + field = self.registry.get_setting_field(key) + if not field.read_only: + return Setting.objects.filter(key=key, user__isnull=True).order_by('pk').first() + + def __getattr__(self, name): + return getattr(self.cache, name) + + def __setattr__(self, name, value): + setattr(self.cache, name, value) + + class SettingsWrapper(UserSettingsHolder): @classmethod - def initialize(cls): + def initialize(cls, cache=None, registry=None): + """ + Used to initialize and wrap the Django settings context. + + :param cache: the Django cache backend to use for caching setting + values. ``django.core.cache`` is used by default. + :param registry: the settings registry instance used. The global + ``awx.conf.settings_registry`` is used by default. + """ if not getattr(settings, '_awx_conf_settings', False): - settings_wrapper = cls(settings._wrapped) + settings_wrapper = cls( + settings._wrapped, + cache=cache or django_cache, + registry=registry or settings_registry + ) settings._wrapped = settings_wrapper - @classmethod - def _check_settings(cls, app_configs, **kwargs): - errors = [] - # FIXME: Warn if database not available! - for setting in Setting.objects.filter(key__in=settings_registry.get_registered_settings(), user__isnull=True): - field = settings_registry.get_setting_field(setting.key) - try: - field.to_internal_value(setting.value) - except Exception as e: - errors.append(checks.Error(str(e))) - return errors + def __init__(self, default_settings, cache, registry): + """ + This constructor is generally not called directly, but by + ``SettingsWrapper.initialize`` at app startup time when settings are + parsed. + """ - def __init__(self, default_settings): + # These values have to be stored via self.__dict__ in this way to get + # around the magic __setattr__ method on this class (which is used to + # store API-assigned settings in the database). self.__dict__['default_settings'] = default_settings self.__dict__['_awx_conf_settings'] = self self.__dict__['_awx_conf_preload_expires'] = None self.__dict__['_awx_conf_preload_lock'] = threading.RLock() self.__dict__['_awx_conf_init_readonly'] = False + self.__dict__['cache'] = EncryptedCacheProxy(cache, registry) + self.__dict__['registry'] = registry def _get_supported_settings(self): - return settings_registry.get_registered_settings() + return self.registry.get_registered_settings() def _get_writeable_settings(self): - return settings_registry.get_registered_settings(read_only=False) + return self.registry.get_registered_settings(read_only=False) def _get_cache_value(self, value): if value is None: @@ -123,12 +203,13 @@ class SettingsWrapper(UserSettingsHolder): except AttributeError: file_default = None if file_default != init_default and file_default is not None: - logger.warning('Setting %s has been marked read-only!', key) - settings_registry._registry[key]['read_only'] = True + logger.debug('Setting %s has been marked read-only!', key) + self.registry._registry[key]['read_only'] = True + self.registry._registry[key]['defined_in_file'] = True self.__dict__['_awx_conf_init_readonly'] = True # If local preload timer has expired, check to see if another process # has already preloaded the cache and skip preloading if so. - if cache.get('_awx_conf_preload_expires', empty) is not empty: + if self.cache.get('_awx_conf_preload_expires', default=empty) is not empty: return # Initialize all database-configurable settings with a marker value so # to indicate from the cache that the setting is not configured without @@ -138,7 +219,7 @@ class SettingsWrapper(UserSettingsHolder): for setting in Setting.objects.filter(key__in=settings_to_cache.keys(), user__isnull=True).order_by('pk'): if settings_to_cache[setting.key] != SETTING_CACHE_NOTSET: continue - if settings_registry.is_setting_encrypted(setting.key): + if self.registry.is_setting_encrypted(setting.key): value = decrypt_field(setting, 'value') else: value = setting.value @@ -148,7 +229,7 @@ class SettingsWrapper(UserSettingsHolder): for key, value in settings_to_cache.items(): if value != SETTING_CACHE_NOTSET: continue - field = settings_registry.get_setting_field(key) + field = self.registry.get_setting_field(key) try: settings_to_cache[key] = self._get_cache_value(field.get_default()) except SkipField: @@ -157,13 +238,13 @@ class SettingsWrapper(UserSettingsHolder): settings_to_cache = dict([(Setting.get_cache_key(k), v) for k, v in settings_to_cache.items()]) settings_to_cache['_awx_conf_preload_expires'] = self._awx_conf_preload_expires logger.debug('cache set_many(%r, %r)', settings_to_cache, SETTING_CACHE_TIMEOUT) - cache.set_many(settings_to_cache, SETTING_CACHE_TIMEOUT) + self.cache.set_many(settings_to_cache, timeout=SETTING_CACHE_TIMEOUT) def _get_local(self, name): self._preload_cache() cache_key = Setting.get_cache_key(name) try: - cache_value = cache.get(cache_key, empty) + cache_value = self.cache.get(cache_key, default=empty) except ValueError: cache_value = empty logger.debug('cache get(%r, %r) -> %r', cache_key, empty, cache_value) @@ -177,7 +258,7 @@ class SettingsWrapper(UserSettingsHolder): value = {} else: value = cache_value - field = settings_registry.get_setting_field(name) + field = self.registry.get_setting_field(name) if value is empty: setting = None if not field.read_only: @@ -198,8 +279,10 @@ class SettingsWrapper(UserSettingsHolder): if value is None and SETTING_CACHE_NOTSET == SETTING_CACHE_NONE: value = SETTING_CACHE_NOTSET if cache_value != value: - logger.debug('cache set(%r, %r, %r)', cache_key, self._get_cache_value(value), SETTING_CACHE_TIMEOUT) - cache.set(cache_key, self._get_cache_value(value), SETTING_CACHE_TIMEOUT) + logger.debug('cache set(%r, %r, %r)', cache_key, + self._get_cache_value(value), + SETTING_CACHE_TIMEOUT) + self.cache.set(cache_key, self._get_cache_value(value), timeout=SETTING_CACHE_TIMEOUT) if value == SETTING_CACHE_NOTSET and not SETTING_CACHE_DEFAULTS: try: value = field.get_default() @@ -214,7 +297,9 @@ class SettingsWrapper(UserSettingsHolder): else: return field.run_validation(value) except: - logger.warning('The current value "%r" for setting "%s" is invalid.', value, name, exc_info=True) + logger.warning( + 'The current value "%r" for setting "%s" is invalid.', + value, name, exc_info=True) return empty def _get_default(self, name): @@ -234,7 +319,7 @@ class SettingsWrapper(UserSettingsHolder): return self._get_default(name) def _set_local(self, name, value): - field = settings_registry.get_setting_field(name) + field = self.registry.get_setting_field(name) if field.read_only: logger.warning('Attempt to set read only setting "%s".', name) raise ImproperlyConfigured('Setting "%s" is read only.'.format(name)) @@ -244,7 +329,8 @@ class SettingsWrapper(UserSettingsHolder): setting_value = field.run_validation(data) db_value = field.to_representation(setting_value) except Exception as e: - logger.exception('Unable to assign value "%r" to setting "%s".', value, name, exc_info=True) + logger.exception('Unable to assign value "%r" to setting "%s".', + value, name, exc_info=True) raise e setting = Setting.objects.filter(key=name, user__isnull=True).order_by('pk').first() @@ -264,7 +350,7 @@ class SettingsWrapper(UserSettingsHolder): setattr(self.default_settings, name, value) def _del_local(self, name): - field = settings_registry.get_setting_field(name) + field = self.registry.get_setting_field(name) if field.read_only: logger.warning('Attempt to delete read only setting "%s".', name) raise ImproperlyConfigured('Setting "%s" is read only.'.format(name)) @@ -282,7 +368,8 @@ class SettingsWrapper(UserSettingsHolder): def __dir__(self): keys = [] with _log_database_error(): - for setting in Setting.objects.filter(key__in=self._get_supported_settings(), user__isnull=True): + for setting in Setting.objects.filter( + key__in=self._get_supported_settings(), user__isnull=True): # Skip returning settings that have been overridden but are # considered to be "not set". if setting.value is None and SETTING_CACHE_NOTSET == SETTING_CACHE_NONE: diff --git a/awx/conf/signals.py b/awx/conf/signals.py index 9d1813843e..b077cc5a18 100644 --- a/awx/conf/signals.py +++ b/awx/conf/signals.py @@ -1,5 +1,6 @@ # Python import logging +import sys # Django from django.conf import settings @@ -32,7 +33,8 @@ def handle_setting_change(key, for_delete=False): cache_keys = set([Setting.get_cache_key(k) for k in setting_keys]) logger.debug('sending signals to delete cache keys(%r)', cache_keys) cache.delete_many(cache_keys) - process_cache_changes.delay(list(cache_keys)) + if 'migrate_to_database_settings' not in sys.argv: + process_cache_changes.delay(list(cache_keys)) # Send setting_changed signal with new value for each setting. for setting_key in setting_keys: diff --git a/awx/conf/tests/__init__.py b/awx/conf/tests/__init__.py new file mode 100644 index 0000000000..46176c348f --- /dev/null +++ b/awx/conf/tests/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2017 Ansible, Inc. +# All Rights Reserved. diff --git a/awx/conf/tests/unit/test_registry.py b/awx/conf/tests/unit/test_registry.py new file mode 100644 index 0000000000..e8fc5a477b --- /dev/null +++ b/awx/conf/tests/unit/test_registry.py @@ -0,0 +1,311 @@ +# Copyright (c) 2017 Ansible, Inc. +# All Rights Reserved. + +from uuid import uuid4 + +from django.conf import LazySettings +from django.core.cache.backends.locmem import LocMemCache +from django.core.exceptions import ImproperlyConfigured +from django.utils.translation import ugettext_lazy as _ +from rest_framework.fields import empty +import pytest + +from awx.conf import fields +from awx.conf.settings import SettingsWrapper +from awx.conf.registry import SettingsRegistry + + +@pytest.fixture() +def reg(request): + """ + This fixture initializes an awx settings registry object and passes it as + an argument into the test function. + """ + cache = LocMemCache(str(uuid4()), {}) # make a new random cache each time + settings = LazySettings() + registry = SettingsRegistry(settings) + + # @pytest.mark.defined_in_file can be used to mark specific setting values + # as "defined in a settings file". This is analogous to manually + # specifying a setting on the filesystem (e.g., in a local_settings.py in + # development, or in /etc/tower/conf.d/.py) + defaults = request.node.get_marker('defined_in_file') + if defaults: + settings.configure(**defaults.kwargs) + settings._wrapped = SettingsWrapper(settings._wrapped, + cache, + registry) + return registry + + +def test_simple_setting_registration(reg): + assert reg.get_registered_settings() == [] + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system', + ) + assert reg.get_registered_settings() == ['AWX_SOME_SETTING_ENABLED'] + + +def test_simple_setting_unregistration(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system', + ) + assert reg.get_registered_settings() == ['AWX_SOME_SETTING_ENABLED'] + + reg.unregister('AWX_SOME_SETTING_ENABLED') + assert reg.get_registered_settings() == [] + + +def test_duplicate_setting_registration(reg): + "ensure that settings cannot be registered twice." + with pytest.raises(ImproperlyConfigured): + for i in range(2): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system', + ) + + +def test_field_class_required_for_registration(reg): + "settings must specify a field class to register" + with pytest.raises(ImproperlyConfigured): + reg.register('AWX_SOME_SETTING_ENABLED') + + +def test_get_registered_settings_by_slug(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system', + ) + assert reg.get_registered_settings(category_slug='system') == [ + 'AWX_SOME_SETTING_ENABLED' + ] + assert reg.get_registered_settings(category_slug='other') == [] + + +def test_get_registered_read_only_settings(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system' + ) + reg.register( + 'AWX_SOME_READ_ONLY', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system', + read_only=True + ) + assert reg.get_registered_settings(read_only=True) ==[ + 'AWX_SOME_READ_ONLY' + ] + assert reg.get_registered_settings(read_only=False) == [ + 'AWX_SOME_SETTING_ENABLED' + ] + assert reg.get_registered_settings() == [ + 'AWX_SOME_SETTING_ENABLED', + 'AWX_SOME_READ_ONLY' + ] + + +def test_get_registered_settings_with_required_features(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system', + feature_required='superpowers', + ) + assert reg.get_registered_settings(features_enabled=[]) == [] + assert reg.get_registered_settings(features_enabled=['superpowers']) == [ + 'AWX_SOME_SETTING_ENABLED' + ] + + +def test_get_dependent_settings(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system' + ) + reg.register( + 'AWX_SOME_DEPENDENT_SETTING', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system', + depends_on=['AWX_SOME_SETTING_ENABLED'] + ) + assert reg.get_dependent_settings('AWX_SOME_SETTING_ENABLED') == set([ + 'AWX_SOME_DEPENDENT_SETTING' + ]) + + +def test_get_registered_categories(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system' + ) + reg.register( + 'AWX_SOME_OTHER_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('OtherSystem'), + category_slug='other-system' + ) + assert reg.get_registered_categories() == { + 'all': _('All'), + 'changed': _('Changed'), + 'system': _('System'), + 'other-system': _('OtherSystem'), + } + + +def test_get_registered_categories_with_required_features(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('System'), + category_slug='system', + feature_required='superpowers' + ) + reg.register( + 'AWX_SOME_OTHER_SETTING_ENABLED', + field_class=fields.BooleanField, + category=_('OtherSystem'), + category_slug='other-system', + feature_required='sortapowers' + ) + assert reg.get_registered_categories(features_enabled=[]) == { + 'all': _('All'), + 'changed': _('Changed'), + } + assert reg.get_registered_categories(features_enabled=['superpowers']) == { + 'all': _('All'), + 'changed': _('Changed'), + 'system': _('System'), + } + assert reg.get_registered_categories(features_enabled=['sortapowers']) == { + 'all': _('All'), + 'changed': _('Changed'), + 'other-system': _('OtherSystem'), + } + assert reg.get_registered_categories( + features_enabled=['superpowers', 'sortapowers'] + ) == { + 'all': _('All'), + 'changed': _('Changed'), + 'system': _('System'), + 'other-system': _('OtherSystem'), + } + + +def test_is_setting_encrypted(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + reg.register( + 'AWX_SOME_ENCRYPTED_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + encrypted=True + ) + assert reg.is_setting_encrypted('AWX_SOME_SETTING_ENABLED') is False + assert reg.is_setting_encrypted('AWX_SOME_ENCRYPTED_SETTING') is True + + +def test_simple_field(reg): + reg.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + placeholder='Example Value', + feature_required='superpowers' + ) + + field = reg.get_setting_field('AWX_SOME_SETTING') + assert isinstance(field, fields.CharField) + assert field.category == _('System') + assert field.category_slug == 'system' + assert field.default is empty + assert field.placeholder == 'Example Value' + assert field.feature_required == 'superpowers' + + +def test_field_with_custom_attribute(reg): + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category_slug='system', + ) + + field = reg.get_setting_field('AWX_SOME_SETTING_ENABLED', + category_slug='other-system') + assert field.category_slug == 'other-system' + + +def test_field_with_custom_mixin(reg): + class GreatMixin(object): + + def is_great(self): + return True + + reg.register( + 'AWX_SOME_SETTING_ENABLED', + field_class=fields.BooleanField, + category_slug='system', + ) + + field = reg.get_setting_field('AWX_SOME_SETTING_ENABLED', + mixin_class=GreatMixin) + assert isinstance(field, fields.BooleanField) + assert isinstance(field, GreatMixin) + assert field.is_great() is True + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_default_value_from_settings(reg): + reg.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + ) + + field = reg.get_setting_field('AWX_SOME_SETTING') + assert field.default == 'DEFAULT' + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_default_value_from_settings_with_custom_representation(reg): + class LowercaseCharField(fields.CharField): + + def to_representation(self, value): + return value.lower() + + reg.register( + 'AWX_SOME_SETTING', + field_class=LowercaseCharField, + category=_('System'), + category_slug='system', + ) + + field = reg.get_setting_field('AWX_SOME_SETTING') + assert field.default == 'default' diff --git a/awx/conf/tests/unit/test_settings.py b/awx/conf/tests/unit/test_settings.py new file mode 100644 index 0000000000..5cd5d0e012 --- /dev/null +++ b/awx/conf/tests/unit/test_settings.py @@ -0,0 +1,406 @@ +# Copyright (c) 2017 Ansible, Inc. +# All Rights Reserved. + +from contextlib import contextmanager +from uuid import uuid4 +import time + +from django.conf import LazySettings +from django.core.cache.backends.locmem import LocMemCache +from django.core.exceptions import ImproperlyConfigured +from django.utils.translation import ugettext_lazy as _ +from rest_framework import fields +import pytest + +from awx.conf import models +from awx.conf.settings import SettingsWrapper, EncryptedCacheProxy, SETTING_CACHE_NOTSET +from awx.conf.registry import SettingsRegistry + +from awx.main.utils import encrypt_field, decrypt_field + + +@contextmanager +def apply_patches(_patches): + [p.start() for p in _patches] + yield + [p.stop() for p in _patches] + + +@pytest.fixture() +def settings(request): + """ + This fixture initializes a Django settings object that wraps our + `awx.conf.settings.SettingsWrapper` and passes it as an argument into the + test function. + + This mimics the work done by `awx.conf.settings.SettingsWrapper.initialize` + on `django.conf.settings`. + """ + cache = LocMemCache(str(uuid4()), {}) # make a new random cache each time + settings = LazySettings() + registry = SettingsRegistry(settings) + + # @pytest.mark.defined_in_file can be used to mark specific setting values + # as "defined in a settings file". This is analogous to manually + # specifying a setting on the filesystem (e.g., in a local_settings.py in + # development, or in /etc/tower/conf.d/.py) + in_file_marker = request.node.get_marker('defined_in_file') + defaults = in_file_marker.kwargs if in_file_marker else {} + defaults['DEFAULTS_SNAPSHOT'] = {} + settings.configure(**defaults) + settings._wrapped = SettingsWrapper(settings._wrapped, + cache, + registry) + return settings + + +@pytest.mark.defined_in_file(DEBUG=True) +def test_unregistered_setting(settings): + "native Django settings are not stored in DB, and aren't cached" + assert settings.DEBUG is True + assert settings.cache.get('DEBUG') is None + + +def test_read_only_setting(settings): + settings.registry.register( + 'AWX_READ_ONLY', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + default='NO-EDITS', + read_only=True + ) + assert settings.AWX_READ_ONLY == 'NO-EDITS' + assert len(settings.registry.get_registered_settings(read_only=False)) == 0 + settings = settings.registry.get_registered_settings(read_only=True) + assert settings == ['AWX_READ_ONLY'] + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +@pytest.mark.parametrize('read_only', [True, False]) +def test_setting_defined_in_file(settings, read_only): + kwargs = {'read_only': True} if read_only else {} + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + **kwargs + ) + assert settings.AWX_SOME_SETTING == 'DEFAULT' + assert len(settings.registry.get_registered_settings(read_only=False)) == 0 + settings = settings.registry.get_registered_settings(read_only=True) + assert settings == ['AWX_SOME_SETTING'] + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_setting_defined_in_file_with_empty_default(settings): + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + default='', + ) + assert settings.AWX_SOME_SETTING == 'DEFAULT' + assert len(settings.registry.get_registered_settings(read_only=False)) == 0 + settings = settings.registry.get_registered_settings(read_only=True) + assert settings == ['AWX_SOME_SETTING'] + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_setting_defined_in_file_with_specific_default(settings): + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + default=123 + ) + assert settings.AWX_SOME_SETTING == 'DEFAULT' + assert len(settings.registry.get_registered_settings(read_only=False)) == 0 + settings = settings.registry.get_registered_settings(read_only=True) + assert settings == ['AWX_SOME_SETTING'] + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_read_only_defaults_are_cached(settings): + "read-only settings are stored in the cache" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + assert settings.AWX_SOME_SETTING == 'DEFAULT' + assert settings.cache.get('AWX_SOME_SETTING') == 'DEFAULT' + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_cache_respects_timeout(settings): + "only preload the cache every SETTING_CACHE_TIMEOUT settings" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + + assert settings.AWX_SOME_SETTING == 'DEFAULT' + cache_expiration = settings.cache.get('_awx_conf_preload_expires') + assert cache_expiration > time.time() + + assert settings.AWX_SOME_SETTING == 'DEFAULT' + assert settings.cache.get('_awx_conf_preload_expires') == cache_expiration + + +def test_default_setting(settings, mocker): + "settings that specify a default are inserted into the cache" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + default='DEFAULT' + ) + + settings_to_cache = mocker.Mock(**{'order_by.return_value': []}) + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=settings_to_cache): + assert settings.AWX_SOME_SETTING == 'DEFAULT' + assert settings.cache.get('AWX_SOME_SETTING') == 'DEFAULT' + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_setting_is_from_setting_file(settings, mocker): + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + assert settings.AWX_SOME_SETTING == 'DEFAULT' + assert settings.registry.get_setting_field('AWX_SOME_SETTING').defined_in_file is True + + +def test_setting_is_not_from_setting_file(settings, mocker): + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + default='DEFAULT' + ) + + settings_to_cache = mocker.Mock(**{'order_by.return_value': []}) + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=settings_to_cache): + assert settings.AWX_SOME_SETTING == 'DEFAULT' + assert settings.registry.get_setting_field('AWX_SOME_SETTING').defined_in_file is False + + +def test_empty_setting(settings, mocker): + "settings with no default and no defined value are not valid" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + + mocks = mocker.Mock(**{ + 'order_by.return_value': mocker.Mock(**{ + '__iter__': lambda self: iter([]), + 'first.return_value': None + }), + }) + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=mocks): + with pytest.raises(AttributeError): + settings.AWX_SOME_SETTING + assert settings.cache.get('AWX_SOME_SETTING') == SETTING_CACHE_NOTSET + + +def test_setting_from_db(settings, mocker): + "settings can be loaded from the database" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + default='DEFAULT' + ) + + setting_from_db = mocker.Mock(key='AWX_SOME_SETTING', value='FROM_DB') + mocks = mocker.Mock(**{ + 'order_by.return_value': mocker.Mock(**{ + '__iter__': lambda self: iter([setting_from_db]), + 'first.return_value': setting_from_db + }), + }) + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=mocks): + assert settings.AWX_SOME_SETTING == 'FROM_DB' + assert settings.cache.get('AWX_SOME_SETTING') == 'FROM_DB' + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_read_only_setting_assignment(settings): + "read-only settings cannot be overwritten" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + assert settings.AWX_SOME_SETTING == 'DEFAULT' + with pytest.raises(ImproperlyConfigured): + settings.AWX_SOME_SETTING = 'CHANGED' + assert settings.AWX_SOME_SETTING == 'DEFAULT' + + +def test_db_setting_create(settings, mocker): + "settings are stored in the database when set for the first time" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + + setting_list = mocker.Mock(**{'order_by.return_value.first.return_value': None}) + with apply_patches([ + mocker.patch('awx.conf.models.Setting.objects.filter', + return_value=setting_list), + mocker.patch('awx.conf.models.Setting.objects.create', mocker.Mock()) + ]): + settings.AWX_SOME_SETTING = 'NEW-VALUE' + + models.Setting.objects.create.assert_called_with( + key='AWX_SOME_SETTING', + user=None, + value='NEW-VALUE' + ) + + +def test_db_setting_update(settings, mocker): + "settings are updated in the database when their value changes" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + + existing_setting = mocker.Mock(key='AWX_SOME_SETTING', value='FROM_DB') + setting_list = mocker.Mock(**{ + 'order_by.return_value.first.return_value': existing_setting + }) + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=setting_list): + settings.AWX_SOME_SETTING = 'NEW-VALUE' + + assert existing_setting.value == 'NEW-VALUE' + existing_setting.save.assert_called_with(update_fields=['value']) + + +def test_db_setting_deletion(settings, mocker): + "settings are auto-deleted from the database" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + + existing_setting = mocker.Mock(key='AWX_SOME_SETTING', value='FROM_DB') + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=[existing_setting]): + del settings.AWX_SOME_SETTING + + assert existing_setting.delete.call_count == 1 + + +@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT') +def test_read_only_setting_deletion(settings): + "read-only settings cannot be deleted" + settings.registry.register( + 'AWX_SOME_SETTING', + field_class=fields.CharField, + category=_('System'), + category_slug='system' + ) + assert settings.AWX_SOME_SETTING == 'DEFAULT' + with pytest.raises(ImproperlyConfigured): + del settings.AWX_SOME_SETTING + assert settings.AWX_SOME_SETTING == 'DEFAULT' + + +def test_settings_use_an_encrypted_cache(settings): + settings.registry.register( + 'AWX_ENCRYPTED', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + encrypted=True + ) + assert isinstance(settings.cache, EncryptedCacheProxy) + assert settings.cache.__dict__['encrypter'] == encrypt_field + assert settings.cache.__dict__['decrypter'] == decrypt_field + + +def test_sensitive_cache_data_is_encrypted(settings, mocker): + "fields marked as `encrypted` are stored in the cache with encryption" + settings.registry.register( + 'AWX_ENCRYPTED', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + encrypted=True + ) + + def rot13(obj, attribute): + assert obj.pk == 123 + return getattr(obj, attribute).encode('rot13') + + native_cache = LocMemCache(str(uuid4()), {}) + cache = EncryptedCacheProxy( + native_cache, + settings.registry, + encrypter=rot13, + decrypter=rot13 + ) + # Insert the setting value into the database; the encryption process will + # use its primary key as part of the encryption key + setting_from_db = mocker.Mock(pk=123, key='AWX_ENCRYPTED', value='SECRET!') + mocks = mocker.Mock(**{ + 'order_by.return_value': mocker.Mock(**{ + '__iter__': lambda self: iter([setting_from_db]), + 'first.return_value': setting_from_db + }), + }) + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=mocks): + cache.set('AWX_ENCRYPTED', 'SECRET!') + assert cache.get('AWX_ENCRYPTED') == 'SECRET!' + assert native_cache.get('AWX_ENCRYPTED') == 'FRPERG!' + + +def test_readonly_sensitive_cache_data_is_encrypted(settings): + "readonly fields marked as `encrypted` are stored in the cache with encryption" + settings.registry.register( + 'AWX_ENCRYPTED', + field_class=fields.CharField, + category=_('System'), + category_slug='system', + read_only=True, + encrypted=True + ) + + def rot13(obj, attribute): + assert obj.pk is None + return getattr(obj, attribute).encode('rot13') + + native_cache = LocMemCache(str(uuid4()), {}) + cache = EncryptedCacheProxy( + native_cache, + settings.registry, + encrypter=rot13, + decrypter=rot13 + ) + cache.set('AWX_ENCRYPTED', 'SECRET!') + assert cache.get('AWX_ENCRYPTED') == 'SECRET!' + assert native_cache.get('AWX_ENCRYPTED') == 'FRPERG!' diff --git a/awx/lib/tower_display_callback/cleanup.py b/awx/lib/tower_display_callback/cleanup.py index ad99fb20bb..8926e54f72 100644 --- a/awx/lib/tower_display_callback/cleanup.py +++ b/awx/lib/tower_display_callback/cleanup.py @@ -71,7 +71,10 @@ def terminate_ssh_control_masters(): # Terminate then kill control master processes. Workaround older # version of psutil that may not have wait_procs implemented. for proc in ssh_cm_procs: - proc.terminate() + try: + proc.terminate() + except psutil.NoSuchProcess: + continue procs_gone, procs_alive = psutil.wait_procs(ssh_cm_procs, timeout=5) for proc in procs_alive: proc.kill() diff --git a/awx/lib/tower_display_callback/module.py b/awx/lib/tower_display_callback/module.py index 02c5eee432..c553b08853 100644 --- a/awx/lib/tower_display_callback/module.py +++ b/awx/lib/tower_display_callback/module.py @@ -182,7 +182,7 @@ class BaseCallbackModule(CallbackBase): def v2_playbook_on_include(self, included_file): event_data = dict( - included_file=included_file, + included_file=included_file._filename if included_file is not None else None, ) with self.capture_event_data('playbook_on_include', **event_data): super(BaseCallbackModule, self).v2_playbook_on_include(included_file) diff --git a/awx/locale/django.pot b/awx/locale/django.pot index ebfd9bcb4c..56771e6f92 100644 --- a/awx/locale/django.pot +++ b/awx/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-27 17:35+0000\n" +"POT-Creation-Date: 2017-01-31 20:58+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,1029 +17,1090 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: api/authentication.py:67 +#: awx/api/authentication.py:67 msgid "Invalid token header. No credentials provided." msgstr "" -#: api/authentication.py:70 +#: awx/api/authentication.py:70 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: api/authentication.py:105 +#: awx/api/authentication.py:105 msgid "User inactive or deleted" msgstr "" -#: api/authentication.py:161 +#: awx/api/authentication.py:161 msgid "Invalid task token" msgstr "" -#: api/conf.py:12 +#: awx/api/conf.py:12 msgid "Idle Time Force Log Out" msgstr "" -#: api/conf.py:13 +#: awx/api/conf.py:13 msgid "" "Number of seconds that a user is inactive before they will need to login " "again." msgstr "" -#: api/conf.py:14 api/conf.py:24 api/conf.py:33 sso/conf.py:124 -#: sso/conf.py:135 sso/conf.py:147 sso/conf.py:162 +#: awx/api/conf.py:14 awx/api/conf.py:24 awx/api/conf.py:33 +#: awx/sso/conf.py:124 awx/sso/conf.py:135 awx/sso/conf.py:147 +#: awx/sso/conf.py:162 msgid "Authentication" msgstr "" -#: api/conf.py:22 +#: awx/api/conf.py:22 msgid "Maximum number of simultaneous logins" msgstr "" -#: api/conf.py:23 +#: awx/api/conf.py:23 msgid "" "Maximum number of simultaneous logins a user may have. To disable enter -1." msgstr "" -#: api/conf.py:31 +#: awx/api/conf.py:31 msgid "Enable HTTP Basic Auth" msgstr "" -#: api/conf.py:32 +#: awx/api/conf.py:32 msgid "Enable HTTP Basic Auth for the API Browser." msgstr "" -#: api/generics.py:462 +#: awx/api/generics.py:466 msgid "\"id\" is required to disassociate" msgstr "" -#: api/metadata.py:50 +#: awx/api/metadata.py:50 msgid "Database ID for this {}." msgstr "" -#: api/metadata.py:51 +#: awx/api/metadata.py:51 msgid "Name of this {}." msgstr "" -#: api/metadata.py:52 +#: awx/api/metadata.py:52 msgid "Optional description of this {}." msgstr "" -#: api/metadata.py:53 +#: awx/api/metadata.py:53 msgid "Data type for this {}." msgstr "" -#: api/metadata.py:54 +#: awx/api/metadata.py:54 msgid "URL for this {}." msgstr "" -#: api/metadata.py:55 +#: awx/api/metadata.py:55 msgid "Data structure with URLs of related resources." msgstr "" -#: api/metadata.py:56 +#: awx/api/metadata.py:56 msgid "Data structure with name/description for related resources." msgstr "" -#: api/metadata.py:57 +#: awx/api/metadata.py:57 msgid "Timestamp when this {} was created." msgstr "" -#: api/metadata.py:58 +#: awx/api/metadata.py:58 msgid "Timestamp when this {} was last modified." msgstr "" -#: api/parsers.py:31 +#: awx/api/parsers.py:31 #, python-format msgid "JSON parse error - %s" msgstr "" -#: api/serializers.py:248 +#: awx/api/serializers.py:250 msgid "Playbook Run" msgstr "" -#: api/serializers.py:249 +#: awx/api/serializers.py:251 msgid "Command" msgstr "" -#: api/serializers.py:250 +#: awx/api/serializers.py:252 msgid "SCM Update" msgstr "" -#: api/serializers.py:251 +#: awx/api/serializers.py:253 msgid "Inventory Sync" msgstr "" -#: api/serializers.py:252 +#: awx/api/serializers.py:254 msgid "Management Job" msgstr "" -#: api/serializers.py:253 +#: awx/api/serializers.py:255 msgid "Workflow Job" msgstr "" -#: api/serializers.py:254 +#: awx/api/serializers.py:256 msgid "Workflow Template" msgstr "" -#: api/serializers.py:656 api/serializers.py:714 api/views.py:3805 +#: awx/api/serializers.py:658 awx/api/serializers.py:716 awx/api/views.py:3819 #, python-format msgid "" "Standard Output too large to display (%(text_size)d bytes), only download " "supported for sizes over %(supported_size)d bytes" msgstr "" -#: api/serializers.py:729 +#: awx/api/serializers.py:731 msgid "Write-only field used to change the password." msgstr "" -#: api/serializers.py:731 +#: awx/api/serializers.py:733 msgid "Set if the account is managed by an external service" msgstr "" -#: api/serializers.py:755 +#: awx/api/serializers.py:757 msgid "Password required for new User." msgstr "" -#: api/serializers.py:839 +#: awx/api/serializers.py:841 #, python-format msgid "Unable to change %s on user managed by LDAP." msgstr "" -#: api/serializers.py:991 +#: awx/api/serializers.py:1002 msgid "Organization is missing" msgstr "" -#: api/serializers.py:997 +#: awx/api/serializers.py:1006 +msgid "Update options must be set to false for manual projects." +msgstr "" + +#: awx/api/serializers.py:1012 msgid "Array of playbooks available within this project." msgstr "" -#: api/serializers.py:1179 +#: awx/api/serializers.py:1194 #, python-format msgid "Invalid port specification: %s" msgstr "" -#: api/serializers.py:1207 main/validators.py:193 +#: awx/api/serializers.py:1222 awx/main/validators.py:193 msgid "Must be valid JSON or YAML." msgstr "" -#: api/serializers.py:1264 +#: awx/api/serializers.py:1279 msgid "Invalid group name." msgstr "" -#: api/serializers.py:1339 +#: awx/api/serializers.py:1354 msgid "" "Script must begin with a hashbang sequence: i.e.... #!/usr/bin/env python" msgstr "" -#: api/serializers.py:1392 +#: awx/api/serializers.py:1407 msgid "If 'source' is 'custom', 'source_script' must be provided." msgstr "" -#: api/serializers.py:1396 +#: awx/api/serializers.py:1411 msgid "" "The 'source_script' does not belong to the same organization as the " "inventory." msgstr "" -#: api/serializers.py:1398 +#: awx/api/serializers.py:1413 msgid "'source_script' doesn't exist." msgstr "" -#: api/serializers.py:1757 +#: awx/api/serializers.py:1772 msgid "" "Write-only field used to add user to owner role. If provided, do not give " "either team or organization. Only valid for creation." msgstr "" -#: api/serializers.py:1762 +#: awx/api/serializers.py:1777 msgid "" "Write-only field used to add team to owner role. If provided, do not give " "either user or organization. Only valid for creation." msgstr "" -#: api/serializers.py:1767 +#: awx/api/serializers.py:1782 msgid "" "Inherit permissions from organization roles. If provided on creation, do not " "give either user or team." msgstr "" -#: api/serializers.py:1783 +#: awx/api/serializers.py:1798 msgid "Missing 'user', 'team', or 'organization'." msgstr "" -#: api/serializers.py:1796 +#: awx/api/serializers.py:1811 msgid "" "Credential organization must be set and match before assigning to a team" msgstr "" -#: api/serializers.py:1888 +#: awx/api/serializers.py:1903 msgid "This field is required." msgstr "" -#: api/serializers.py:1890 api/serializers.py:1892 +#: awx/api/serializers.py:1905 awx/api/serializers.py:1907 msgid "Playbook not found for project." msgstr "" -#: api/serializers.py:1894 +#: awx/api/serializers.py:1909 msgid "Must select playbook for project." msgstr "" -#: api/serializers.py:1958 main/models/jobs.py:278 +#: awx/api/serializers.py:1975 +msgid "Must either set a default value or ask to prompt on launch." +msgstr "" + +#: awx/api/serializers.py:1978 awx/main/models/jobs.py:278 msgid "Scan jobs must be assigned a fixed inventory." msgstr "" -#: api/serializers.py:1960 main/models/jobs.py:281 +#: awx/api/serializers.py:1980 awx/main/models/jobs.py:281 msgid "Job types 'run' and 'check' must have assigned a project." msgstr "" -#: api/serializers.py:1963 +#: awx/api/serializers.py:1987 msgid "Survey Enabled cannot be used with scan jobs." msgstr "" -#: api/serializers.py:2023 +#: awx/api/serializers.py:2047 msgid "Invalid job template." msgstr "" -#: api/serializers.py:2108 +#: awx/api/serializers.py:2132 msgid "Credential not found or deleted." msgstr "" -#: api/serializers.py:2110 +#: awx/api/serializers.py:2134 msgid "Job Template Project is missing or undefined." msgstr "" -#: api/serializers.py:2112 +#: awx/api/serializers.py:2136 msgid "Job Template Inventory is missing or undefined." msgstr "" -#: api/serializers.py:2397 +#: awx/api/serializers.py:2421 #, python-format msgid "%(job_type)s is not a valid job type. The choices are %(choices)s." msgstr "" -#: api/serializers.py:2402 +#: awx/api/serializers.py:2426 msgid "Workflow job template is missing during creation." msgstr "" -#: api/serializers.py:2407 +#: awx/api/serializers.py:2431 #, python-format msgid "Cannot nest a %s inside a WorkflowJobTemplate" msgstr "" -#: api/serializers.py:2645 +#: awx/api/serializers.py:2669 #, python-format msgid "Job Template '%s' is missing or undefined." msgstr "" -#: api/serializers.py:2671 +#: awx/api/serializers.py:2695 msgid "Must be a valid JSON or YAML dictionary." msgstr "" -#: api/serializers.py:2813 +#: awx/api/serializers.py:2837 msgid "" "Missing required fields for Notification Configuration: notification_type" msgstr "" -#: api/serializers.py:2836 +#: awx/api/serializers.py:2860 msgid "No values specified for field '{}'" msgstr "" -#: api/serializers.py:2841 +#: awx/api/serializers.py:2865 msgid "Missing required fields for Notification Configuration: {}." msgstr "" -#: api/serializers.py:2844 +#: awx/api/serializers.py:2868 msgid "Configuration field '{}' incorrect type, expected {}." msgstr "" -#: api/serializers.py:2897 +#: awx/api/serializers.py:2921 msgid "Inventory Source must be a cloud resource." msgstr "" -#: api/serializers.py:2899 +#: awx/api/serializers.py:2923 msgid "Manual Project can not have a schedule set." msgstr "" -#: api/serializers.py:2921 +#: awx/api/serializers.py:2945 msgid "DTSTART required in rrule. Value should match: DTSTART:YYYYMMDDTHHMMSSZ" msgstr "" -#: api/serializers.py:2923 +#: awx/api/serializers.py:2947 msgid "Multiple DTSTART is not supported." msgstr "" -#: api/serializers.py:2925 +#: awx/api/serializers.py:2949 msgid "RRULE require in rrule." msgstr "" -#: api/serializers.py:2927 +#: awx/api/serializers.py:2951 msgid "Multiple RRULE is not supported." msgstr "" -#: api/serializers.py:2929 +#: awx/api/serializers.py:2953 msgid "INTERVAL required in rrule." msgstr "" -#: api/serializers.py:2931 +#: awx/api/serializers.py:2955 msgid "TZID is not supported." msgstr "" -#: api/serializers.py:2933 +#: awx/api/serializers.py:2957 msgid "SECONDLY is not supported." msgstr "" -#: api/serializers.py:2935 +#: awx/api/serializers.py:2959 msgid "Multiple BYMONTHDAYs not supported." msgstr "" -#: api/serializers.py:2937 +#: awx/api/serializers.py:2961 msgid "Multiple BYMONTHs not supported." msgstr "" -#: api/serializers.py:2939 +#: awx/api/serializers.py:2963 msgid "BYDAY with numeric prefix not supported." msgstr "" -#: api/serializers.py:2941 +#: awx/api/serializers.py:2965 msgid "BYYEARDAY not supported." msgstr "" -#: api/serializers.py:2943 +#: awx/api/serializers.py:2967 msgid "BYWEEKNO not supported." msgstr "" -#: api/serializers.py:2947 +#: awx/api/serializers.py:2971 msgid "COUNT > 999 is unsupported." msgstr "" -#: api/serializers.py:2951 +#: awx/api/serializers.py:2975 msgid "rrule parsing failed validation." msgstr "" -#: api/serializers.py:2969 +#: awx/api/serializers.py:2997 msgid "" "A summary of the new and changed values when an object is created, updated, " "or deleted" msgstr "" -#: api/serializers.py:2971 +#: awx/api/serializers.py:2999 msgid "" "For create, update, and delete events this is the object type that was " "affected. For associate and disassociate events this is the object type " "associated or disassociated with object2." msgstr "" -#: api/serializers.py:2974 +#: awx/api/serializers.py:3002 msgid "" "Unpopulated for create, update, and delete events. For associate and " "disassociate events this is the object type that object1 is being associated " "with." msgstr "" -#: api/serializers.py:2977 +#: awx/api/serializers.py:3005 msgid "The action taken with respect to the given object(s)." msgstr "" -#: api/serializers.py:3077 +#: awx/api/serializers.py:3112 msgid "Unable to login with provided credentials." msgstr "" -#: api/serializers.py:3079 +#: awx/api/serializers.py:3114 msgid "Must include \"username\" and \"password\"." msgstr "" -#: api/views.py:99 +#: awx/api/views.py:101 msgid "Your license does not allow use of the activity stream." msgstr "" -#: api/views.py:109 +#: awx/api/views.py:111 msgid "Your license does not permit use of system tracking." msgstr "" -#: api/views.py:119 +#: awx/api/views.py:121 msgid "Your license does not allow use of workflows." msgstr "" -#: api/views.py:127 templates/rest_framework/api.html:28 +#: awx/api/views.py:129 awx/templates/rest_framework/api.html:28 msgid "REST API" msgstr "" -#: api/views.py:134 templates/rest_framework/api.html:4 +#: awx/api/views.py:136 awx/templates/rest_framework/api.html:4 msgid "Ansible Tower REST API" msgstr "" -#: api/views.py:150 +#: awx/api/views.py:152 msgid "Version 1" msgstr "" -#: api/views.py:201 +#: awx/api/views.py:203 msgid "Ping" msgstr "" -#: api/views.py:230 conf/apps.py:12 +#: awx/api/views.py:232 awx/conf/apps.py:12 msgid "Configuration" msgstr "" -#: api/views.py:283 +#: awx/api/views.py:285 msgid "Invalid license data" msgstr "" -#: api/views.py:285 +#: awx/api/views.py:287 msgid "Missing 'eula_accepted' property" msgstr "" -#: api/views.py:289 +#: awx/api/views.py:291 msgid "'eula_accepted' value is invalid" msgstr "" -#: api/views.py:292 +#: awx/api/views.py:294 msgid "'eula_accepted' must be True" msgstr "" -#: api/views.py:299 +#: awx/api/views.py:301 msgid "Invalid JSON" msgstr "" -#: api/views.py:307 +#: awx/api/views.py:309 msgid "Invalid License" msgstr "" -#: api/views.py:317 +#: awx/api/views.py:319 msgid "Invalid license" msgstr "" -#: api/views.py:325 +#: awx/api/views.py:327 #, python-format msgid "Failed to remove license (%s)" msgstr "" -#: api/views.py:330 +#: awx/api/views.py:332 msgid "Dashboard" msgstr "" -#: api/views.py:436 +#: awx/api/views.py:438 msgid "Dashboard Jobs Graphs" msgstr "" -#: api/views.py:472 +#: awx/api/views.py:474 #, python-format msgid "Unknown period \"%s\"" msgstr "" -#: api/views.py:486 +#: awx/api/views.py:488 msgid "Schedules" msgstr "" -#: api/views.py:505 +#: awx/api/views.py:507 msgid "Schedule Jobs List" msgstr "" -#: api/views.py:715 +#: awx/api/views.py:717 msgid "Your Tower license only permits a single organization to exist." msgstr "" -#: api/views.py:940 api/views.py:1299 +#: awx/api/views.py:942 awx/api/views.py:1301 msgid "Role 'id' field is missing." msgstr "" -#: api/views.py:946 api/views.py:4081 +#: awx/api/views.py:948 awx/api/views.py:4106 msgid "You cannot assign an Organization role as a child role for a Team." msgstr "" -#: api/views.py:950 api/views.py:4095 +#: awx/api/views.py:952 awx/api/views.py:4120 msgid "You cannot grant system-level permissions to a team." msgstr "" -#: api/views.py:957 api/views.py:4087 +#: awx/api/views.py:959 awx/api/views.py:4112 msgid "" "You cannot grant credential access to a team when the Organization field " "isn't set, or belongs to a different organization" msgstr "" -#: api/views.py:1047 +#: awx/api/views.py:1049 msgid "Cannot delete project." msgstr "" -#: api/views.py:1076 +#: awx/api/views.py:1078 msgid "Project Schedules" msgstr "" -#: api/views.py:1180 api/views.py:2270 api/views.py:3276 +#: awx/api/views.py:1182 awx/api/views.py:2273 awx/api/views.py:3286 msgid "Cannot delete job resource when associated workflow job is running." msgstr "" -#: api/views.py:1257 +#: awx/api/views.py:1259 msgid "Me" msgstr "" -#: api/views.py:1303 api/views.py:4036 +#: awx/api/views.py:1305 awx/api/views.py:4061 msgid "You may not perform any action with your own admin_role." msgstr "" -#: api/views.py:1309 api/views.py:4040 +#: awx/api/views.py:1311 awx/api/views.py:4065 msgid "You may not change the membership of a users admin_role" msgstr "" -#: api/views.py:1314 api/views.py:4045 +#: awx/api/views.py:1316 awx/api/views.py:4070 msgid "" "You cannot grant credential access to a user not in the credentials' " "organization" msgstr "" -#: api/views.py:1318 api/views.py:4049 +#: awx/api/views.py:1320 awx/api/views.py:4074 msgid "You cannot grant private credential access to another user" msgstr "" -#: api/views.py:1416 +#: awx/api/views.py:1418 #, python-format msgid "Cannot change %s." msgstr "" -#: api/views.py:1422 +#: awx/api/views.py:1424 msgid "Cannot delete user." msgstr "" -#: api/views.py:1570 +#: awx/api/views.py:1572 msgid "Cannot delete inventory script." msgstr "" -#: api/views.py:1805 +#: awx/api/views.py:1808 msgid "Fact not found." msgstr "" -#: api/views.py:2125 +#: awx/api/views.py:2128 msgid "Inventory Source List" msgstr "" -#: api/views.py:2153 +#: awx/api/views.py:2156 msgid "Cannot delete inventory source." msgstr "" -#: api/views.py:2161 +#: awx/api/views.py:2164 msgid "Inventory Source Schedules" msgstr "" -#: api/views.py:2191 +#: awx/api/views.py:2194 msgid "Notification Templates can only be assigned when source is one of {}." msgstr "" -#: api/views.py:2402 +#: awx/api/views.py:2405 msgid "Job Template Schedules" msgstr "" -#: api/views.py:2422 api/views.py:2438 +#: awx/api/views.py:2425 awx/api/views.py:2441 msgid "Your license does not allow adding surveys." msgstr "" -#: api/views.py:2445 +#: awx/api/views.py:2448 msgid "'name' missing from survey spec." msgstr "" -#: api/views.py:2447 +#: awx/api/views.py:2450 msgid "'description' missing from survey spec." msgstr "" -#: api/views.py:2449 +#: awx/api/views.py:2452 msgid "'spec' missing from survey spec." msgstr "" -#: api/views.py:2451 +#: awx/api/views.py:2454 msgid "'spec' must be a list of items." msgstr "" -#: api/views.py:2453 +#: awx/api/views.py:2456 msgid "'spec' doesn't contain any items." msgstr "" -#: api/views.py:2459 +#: awx/api/views.py:2462 #, python-format msgid "Survey question %s is not a json object." msgstr "" -#: api/views.py:2461 +#: awx/api/views.py:2464 #, python-format msgid "'type' missing from survey question %s." msgstr "" -#: api/views.py:2463 +#: awx/api/views.py:2466 #, python-format msgid "'question_name' missing from survey question %s." msgstr "" -#: api/views.py:2465 +#: awx/api/views.py:2468 #, python-format msgid "'variable' missing from survey question %s." msgstr "" -#: api/views.py:2467 +#: awx/api/views.py:2470 #, python-format msgid "'variable' '%(item)s' duplicated in survey question %(survey)s." msgstr "" -#: api/views.py:2472 +#: awx/api/views.py:2475 #, python-format msgid "'required' missing from survey question %s." msgstr "" -#: api/views.py:2683 +#: awx/api/views.py:2686 msgid "No matching host could be found!" msgstr "" -#: api/views.py:2686 +#: awx/api/views.py:2689 msgid "Multiple hosts matched the request!" msgstr "" -#: api/views.py:2691 +#: awx/api/views.py:2694 msgid "Cannot start automatically, user input required!" msgstr "" -#: api/views.py:2698 +#: awx/api/views.py:2701 msgid "Host callback job already pending." msgstr "" -#: api/views.py:2711 +#: awx/api/views.py:2714 msgid "Error starting job!" msgstr "" -#: api/views.py:3040 +#: awx/api/views.py:3043 msgid "Workflow Job Template Schedules" msgstr "" -#: api/views.py:3175 api/views.py:3714 +#: awx/api/views.py:3185 awx/api/views.py:3728 msgid "Superuser privileges needed." msgstr "" -#: api/views.py:3207 +#: awx/api/views.py:3217 msgid "System Job Template Schedules" msgstr "" -#: api/views.py:3399 +#: awx/api/views.py:3409 msgid "Job Host Summaries List" msgstr "" -#: api/views.py:3441 +#: awx/api/views.py:3451 msgid "Job Event Children List" msgstr "" -#: api/views.py:3450 +#: awx/api/views.py:3460 msgid "Job Event Hosts List" msgstr "" -#: api/views.py:3459 +#: awx/api/views.py:3469 msgid "Job Events List" msgstr "" -#: api/views.py:3668 +#: awx/api/views.py:3682 msgid "Ad Hoc Command Events List" msgstr "" -#: api/views.py:3862 +#: awx/api/views.py:3874 +msgid "Error generating stdout download file: {}" +msgstr "" + +#: awx/api/views.py:3887 #, python-format msgid "Error generating stdout download file: %s" msgstr "" -#: api/views.py:3907 +#: awx/api/views.py:3932 msgid "Delete not allowed while there are pending notifications" msgstr "" -#: api/views.py:3914 +#: awx/api/views.py:3939 msgid "Notification Template Test" msgstr "" -#: api/views.py:4030 +#: awx/api/views.py:4055 msgid "User 'id' field is missing." msgstr "" -#: api/views.py:4073 +#: awx/api/views.py:4098 msgid "Team 'id' field is missing." msgstr "" -#: conf/conf.py:20 +#: awx/conf/conf.py:20 msgid "Bud Frogs" msgstr "" -#: conf/conf.py:21 +#: awx/conf/conf.py:21 msgid "Bunny" msgstr "" -#: conf/conf.py:22 +#: awx/conf/conf.py:22 msgid "Cheese" msgstr "" -#: conf/conf.py:23 +#: awx/conf/conf.py:23 msgid "Daemon" msgstr "" -#: conf/conf.py:24 +#: awx/conf/conf.py:24 msgid "Default Cow" msgstr "" -#: conf/conf.py:25 +#: awx/conf/conf.py:25 msgid "Dragon" msgstr "" -#: conf/conf.py:26 +#: awx/conf/conf.py:26 msgid "Elephant in Snake" msgstr "" -#: conf/conf.py:27 +#: awx/conf/conf.py:27 msgid "Elephant" msgstr "" -#: conf/conf.py:28 +#: awx/conf/conf.py:28 msgid "Eyes" msgstr "" -#: conf/conf.py:29 +#: awx/conf/conf.py:29 msgid "Hello Kitty" msgstr "" -#: conf/conf.py:30 +#: awx/conf/conf.py:30 msgid "Kitty" msgstr "" -#: conf/conf.py:31 +#: awx/conf/conf.py:31 msgid "Luke Koala" msgstr "" -#: conf/conf.py:32 +#: awx/conf/conf.py:32 msgid "Meow" msgstr "" -#: conf/conf.py:33 +#: awx/conf/conf.py:33 msgid "Milk" msgstr "" -#: conf/conf.py:34 +#: awx/conf/conf.py:34 msgid "Moofasa" msgstr "" -#: conf/conf.py:35 +#: awx/conf/conf.py:35 msgid "Moose" msgstr "" -#: conf/conf.py:36 +#: awx/conf/conf.py:36 msgid "Ren" msgstr "" -#: conf/conf.py:37 +#: awx/conf/conf.py:37 msgid "Sheep" msgstr "" -#: conf/conf.py:38 +#: awx/conf/conf.py:38 msgid "Small Cow" msgstr "" -#: conf/conf.py:39 +#: awx/conf/conf.py:39 msgid "Stegosaurus" msgstr "" -#: conf/conf.py:40 +#: awx/conf/conf.py:40 msgid "Stimpy" msgstr "" -#: conf/conf.py:41 +#: awx/conf/conf.py:41 msgid "Super Milker" msgstr "" -#: conf/conf.py:42 +#: awx/conf/conf.py:42 msgid "Three Eyes" msgstr "" -#: conf/conf.py:43 +#: awx/conf/conf.py:43 msgid "Turkey" msgstr "" -#: conf/conf.py:44 +#: awx/conf/conf.py:44 msgid "Turtle" msgstr "" -#: conf/conf.py:45 +#: awx/conf/conf.py:45 msgid "Tux" msgstr "" -#: conf/conf.py:46 +#: awx/conf/conf.py:46 msgid "Udder" msgstr "" -#: conf/conf.py:47 +#: awx/conf/conf.py:47 msgid "Vader Koala" msgstr "" -#: conf/conf.py:48 +#: awx/conf/conf.py:48 msgid "Vader" msgstr "" -#: conf/conf.py:49 +#: awx/conf/conf.py:49 msgid "WWW" msgstr "" -#: conf/conf.py:52 +#: awx/conf/conf.py:52 msgid "Cow Selection" msgstr "" -#: conf/conf.py:53 +#: awx/conf/conf.py:53 msgid "Select which cow to use with cowsay when running jobs." msgstr "" -#: conf/conf.py:54 conf/conf.py:75 +#: awx/conf/conf.py:54 awx/conf/conf.py:75 msgid "Cows" msgstr "" -#: conf/conf.py:73 +#: awx/conf/conf.py:73 msgid "Example Read-Only Setting" msgstr "" -#: conf/conf.py:74 +#: awx/conf/conf.py:74 msgid "Example setting that cannot be changed." msgstr "" -#: conf/conf.py:93 +#: awx/conf/conf.py:93 msgid "Example Setting" msgstr "" -#: conf/conf.py:94 +#: awx/conf/conf.py:94 msgid "Example setting which can be different for each user." msgstr "" -#: conf/conf.py:95 conf/registry.py:67 conf/views.py:46 +#: awx/conf/conf.py:95 awx/conf/registry.py:76 awx/conf/views.py:46 msgid "User" msgstr "" -#: conf/fields.py:38 +#: awx/conf/fields.py:38 msgid "Enter a valid URL" msgstr "" -#: conf/license.py:19 +#: awx/conf/license.py:19 msgid "Your Tower license does not allow that." msgstr "" -#: conf/management/commands/migrate_to_database_settings.py:41 +#: awx/conf/management/commands/migrate_to_database_settings.py:41 msgid "Only show which settings would be commented/migrated." msgstr "" -#: conf/management/commands/migrate_to_database_settings.py:48 +#: awx/conf/management/commands/migrate_to_database_settings.py:48 msgid "Skip over settings that would raise an error when commenting/migrating." msgstr "" -#: conf/management/commands/migrate_to_database_settings.py:55 +#: awx/conf/management/commands/migrate_to_database_settings.py:55 msgid "Skip commenting out settings in files." msgstr "" -#: conf/management/commands/migrate_to_database_settings.py:61 +#: awx/conf/management/commands/migrate_to_database_settings.py:61 msgid "Backup existing settings files with this suffix." msgstr "" -#: conf/registry.py:55 +#: awx/conf/registry.py:64 awx/conf/tests/unit/test_registry.py:169 +#: awx/conf/tests/unit/test_registry.py:192 +#: awx/conf/tests/unit/test_registry.py:196 +#: awx/conf/tests/unit/test_registry.py:201 +#: awx/conf/tests/unit/test_registry.py:208 msgid "All" msgstr "" -#: conf/registry.py:56 +#: awx/conf/registry.py:65 awx/conf/tests/unit/test_registry.py:170 +#: awx/conf/tests/unit/test_registry.py:193 +#: awx/conf/tests/unit/test_registry.py:197 +#: awx/conf/tests/unit/test_registry.py:202 +#: awx/conf/tests/unit/test_registry.py:209 msgid "Changed" msgstr "" -#: conf/registry.py:68 +#: awx/conf/registry.py:77 msgid "User-Defaults" msgstr "" -#: conf/views.py:38 +#: awx/conf/tests/unit/test_registry.py:46 +#: awx/conf/tests/unit/test_registry.py:56 +#: awx/conf/tests/unit/test_registry.py:72 +#: awx/conf/tests/unit/test_registry.py:87 +#: awx/conf/tests/unit/test_registry.py:100 +#: awx/conf/tests/unit/test_registry.py:106 +#: awx/conf/tests/unit/test_registry.py:126 +#: awx/conf/tests/unit/test_registry.py:140 +#: awx/conf/tests/unit/test_registry.py:146 +#: awx/conf/tests/unit/test_registry.py:159 +#: awx/conf/tests/unit/test_registry.py:171 +#: awx/conf/tests/unit/test_registry.py:180 +#: awx/conf/tests/unit/test_registry.py:198 +#: awx/conf/tests/unit/test_registry.py:210 +#: awx/conf/tests/unit/test_registry.py:219 +#: awx/conf/tests/unit/test_registry.py:225 +#: awx/conf/tests/unit/test_registry.py:237 +#: awx/conf/tests/unit/test_registry.py:245 +#: awx/conf/tests/unit/test_registry.py:288 +#: awx/conf/tests/unit/test_registry.py:306 +#: awx/conf/tests/unit/test_settings.py:67 +#: awx/conf/tests/unit/test_settings.py:81 +#: awx/conf/tests/unit/test_settings.py:97 +#: awx/conf/tests/unit/test_settings.py:110 +#: awx/conf/tests/unit/test_settings.py:127 +#: awx/conf/tests/unit/test_settings.py:143 +#: awx/conf/tests/unit/test_settings.py:162 +#: awx/conf/tests/unit/test_settings.py:183 +#: awx/conf/tests/unit/test_settings.py:197 +#: awx/conf/tests/unit/test_settings.py:221 +#: awx/conf/tests/unit/test_settings.py:241 +#: awx/conf/tests/unit/test_settings.py:258 awx/main/conf.py:19 +#: awx/main/conf.py:29 awx/main/conf.py:39 awx/main/conf.py:48 +#: awx/main/conf.py:60 awx/main/conf.py:78 awx/main/conf.py:103 +msgid "System" +msgstr "" + +#: awx/conf/tests/unit/test_registry.py:165 +#: awx/conf/tests/unit/test_registry.py:172 +#: awx/conf/tests/unit/test_registry.py:187 +#: awx/conf/tests/unit/test_registry.py:203 +#: awx/conf/tests/unit/test_registry.py:211 +msgid "OtherSystem" +msgstr "" + +#: awx/conf/views.py:38 msgid "Setting Categories" msgstr "" -#: conf/views.py:61 +#: awx/conf/views.py:61 msgid "Setting Detail" msgstr "" -#: main/access.py:255 +#: awx/main/access.py:255 #, python-format msgid "Bad data found in related field %s." msgstr "" -#: main/access.py:296 +#: awx/main/access.py:296 msgid "License is missing." msgstr "" -#: main/access.py:298 +#: awx/main/access.py:298 msgid "License has expired." msgstr "" -#: main/access.py:303 +#: awx/main/access.py:306 #, python-format msgid "License count of %s instances has been reached." msgstr "" -#: main/access.py:305 +#: awx/main/access.py:308 #, python-format msgid "License count of %s instances has been exceeded." msgstr "" -#: main/access.py:307 +#: awx/main/access.py:310 msgid "Host count exceeds available instances." msgstr "" -#: main/access.py:311 +#: awx/main/access.py:314 #, python-format msgid "Feature %s is not enabled in the active license." msgstr "" -#: main/access.py:313 +#: awx/main/access.py:316 msgid "Features not found in active license." msgstr "" -#: main/access.py:511 main/access.py:578 main/access.py:698 main/access.py:961 -#: main/access.py:1200 main/access.py:1597 +#: awx/main/access.py:514 awx/main/access.py:581 awx/main/access.py:706 +#: awx/main/access.py:969 awx/main/access.py:1208 awx/main/access.py:1605 msgid "Resource is being used by running jobs" msgstr "" -#: main/access.py:622 +#: awx/main/access.py:625 msgid "Unable to change inventory on a host." msgstr "" -#: main/access.py:634 main/access.py:679 +#: awx/main/access.py:642 awx/main/access.py:687 msgid "Cannot associate two items from different inventories." msgstr "" -#: main/access.py:667 +#: awx/main/access.py:675 msgid "Unable to change inventory on a group." msgstr "" -#: main/access.py:881 +#: awx/main/access.py:889 msgid "Unable to change organization on a team." msgstr "" -#: main/access.py:894 +#: awx/main/access.py:902 msgid "The {} role cannot be assigned to a team" msgstr "" -#: main/access.py:896 +#: awx/main/access.py:904 msgid "The admin_role for a User cannot be assigned to a team" msgstr "" -#: main/access.py:1670 +#: awx/main/access.py:1678 msgid "" "You do not have permission to the workflow job resources required for " "relaunch." msgstr "" -#: main/apps.py:9 +#: awx/main/apps.py:9 msgid "Main" msgstr "" -#: main/conf.py:17 +#: awx/main/conf.py:17 msgid "Enable Activity Stream" msgstr "" -#: main/conf.py:18 +#: awx/main/conf.py:18 msgid "Enable capturing activity for the Tower activity stream." msgstr "" -#: main/conf.py:19 main/conf.py:29 main/conf.py:39 main/conf.py:48 -#: main/conf.py:60 main/conf.py:78 main/conf.py:103 -msgid "System" -msgstr "" - -#: main/conf.py:27 +#: awx/main/conf.py:27 msgid "Enable Activity Stream for Inventory Sync" msgstr "" -#: main/conf.py:28 +#: awx/main/conf.py:28 msgid "" "Enable capturing activity for the Tower activity stream when running " "inventory sync." msgstr "" -#: main/conf.py:37 +#: awx/main/conf.py:37 msgid "All Users Visible to Organization Admins" msgstr "" -#: main/conf.py:38 +#: awx/main/conf.py:38 msgid "" "Controls whether any Organization Admin can view all users, even those not " "associated with their Organization." msgstr "" -#: main/conf.py:46 +#: awx/main/conf.py:46 msgid "Enable Tower Administrator Alerts" msgstr "" -#: main/conf.py:47 +#: awx/main/conf.py:47 msgid "" "Allow Tower to email Admin users for system events that may require " "attention." msgstr "" -#: main/conf.py:57 +#: awx/main/conf.py:57 msgid "Base URL of the Tower host" msgstr "" -#: main/conf.py:58 +#: awx/main/conf.py:58 msgid "" "This setting is used by services like notifications to render a valid url to " "the Tower host." msgstr "" -#: main/conf.py:67 +#: awx/main/conf.py:67 msgid "Remote Host Headers" msgstr "" -#: main/conf.py:68 +#: awx/main/conf.py:68 msgid "" "HTTP headers and meta keys to search to determine remote host name or IP. " "Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if " @@ -1054,190 +1115,192 @@ msgid "" "REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']" msgstr "" -#: main/conf.py:99 +#: awx/main/conf.py:99 msgid "Tower License" msgstr "" -#: main/conf.py:100 +#: awx/main/conf.py:100 msgid "" "The license controls which features and functionality are enabled in Tower. " "Use /api/v1/config/ to update or change the license." msgstr "" -#: main/conf.py:110 +#: awx/main/conf.py:110 msgid "Ansible Modules Allowed for Ad Hoc Jobs" msgstr "" -#: main/conf.py:111 +#: awx/main/conf.py:111 msgid "List of modules allowed to be used by ad-hoc jobs." msgstr "" -#: main/conf.py:112 main/conf.py:121 main/conf.py:130 main/conf.py:140 -#: main/conf.py:150 main/conf.py:160 main/conf.py:170 main/conf.py:180 -#: main/conf.py:190 main/conf.py:202 main/conf.py:214 main/conf.py:226 +#: awx/main/conf.py:112 awx/main/conf.py:121 awx/main/conf.py:130 +#: awx/main/conf.py:140 awx/main/conf.py:150 awx/main/conf.py:160 +#: awx/main/conf.py:170 awx/main/conf.py:180 awx/main/conf.py:190 +#: awx/main/conf.py:202 awx/main/conf.py:214 awx/main/conf.py:226 msgid "Jobs" msgstr "" -#: main/conf.py:119 +#: awx/main/conf.py:119 msgid "Enable job isolation" msgstr "" -#: main/conf.py:120 +#: awx/main/conf.py:120 msgid "" "Isolates an Ansible job from protected parts of the Tower system to prevent " "exposing sensitive information." msgstr "" -#: main/conf.py:128 +#: awx/main/conf.py:128 msgid "Job isolation execution path" msgstr "" -#: main/conf.py:129 +#: awx/main/conf.py:129 msgid "" "Create temporary working directories for isolated jobs in this location." msgstr "" -#: main/conf.py:138 +#: awx/main/conf.py:138 msgid "Paths to hide from isolated jobs" msgstr "" -#: main/conf.py:139 +#: awx/main/conf.py:139 msgid "Additional paths to hide from isolated processes." msgstr "" -#: main/conf.py:148 +#: awx/main/conf.py:148 msgid "Paths to expose to isolated jobs" msgstr "" -#: main/conf.py:149 +#: awx/main/conf.py:149 msgid "" "Whitelist of paths that would otherwise be hidden to expose to isolated jobs." msgstr "" -#: main/conf.py:158 +#: awx/main/conf.py:158 msgid "Standard Output Maximum Display Size" msgstr "" -#: main/conf.py:159 +#: awx/main/conf.py:159 msgid "" "Maximum Size of Standard Output in bytes to display before requiring the " "output be downloaded." msgstr "" -#: main/conf.py:168 +#: awx/main/conf.py:168 msgid "Job Event Standard Output Maximum Display Size" msgstr "" -#: main/conf.py:169 +#: awx/main/conf.py:169 msgid "" "Maximum Size of Standard Output in bytes to display for a single job or ad " "hoc command event. `stdout` will end with `…` when truncated." msgstr "" -#: main/conf.py:178 +#: awx/main/conf.py:178 msgid "Maximum Scheduled Jobs" msgstr "" -#: main/conf.py:179 +#: awx/main/conf.py:179 msgid "" "Maximum number of the same job template that can be waiting to run when " "launching from a schedule before no more are created." msgstr "" -#: main/conf.py:188 +#: awx/main/conf.py:188 msgid "Ansible Callback Plugins" msgstr "" -#: main/conf.py:189 +#: awx/main/conf.py:189 msgid "" "List of paths to search for extra callback plugins to be used when running " "jobs." msgstr "" -#: main/conf.py:199 +#: awx/main/conf.py:199 msgid "Default Job Timeout" msgstr "" -#: main/conf.py:200 +#: awx/main/conf.py:200 msgid "" "Maximum time to allow jobs to run. Use value of 0 to indicate that no " "timeout should be imposed. A timeout set on an individual job template will " "override this." msgstr "" -#: main/conf.py:211 +#: awx/main/conf.py:211 msgid "Default Inventory Update Timeout" msgstr "" -#: main/conf.py:212 +#: awx/main/conf.py:212 msgid "" "Maximum time to allow inventory updates to run. Use value of 0 to indicate " "that no timeout should be imposed. A timeout set on an individual inventory " "source will override this." msgstr "" -#: main/conf.py:223 +#: awx/main/conf.py:223 msgid "Default Project Update Timeout" msgstr "" -#: main/conf.py:224 +#: awx/main/conf.py:224 msgid "" "Maximum time to allow project updates to run. Use value of 0 to indicate " "that no timeout should be imposed. A timeout set on an individual project " "will override this." msgstr "" -#: main/conf.py:234 +#: awx/main/conf.py:234 msgid "Logging Aggregator" msgstr "" -#: main/conf.py:235 +#: awx/main/conf.py:235 msgid "Hostname/IP where external logs will be sent to." msgstr "" -#: main/conf.py:236 main/conf.py:245 main/conf.py:255 main/conf.py:264 -#: main/conf.py:274 main/conf.py:288 main/conf.py:300 main/conf.py:309 +#: awx/main/conf.py:236 awx/main/conf.py:245 awx/main/conf.py:255 +#: awx/main/conf.py:264 awx/main/conf.py:274 awx/main/conf.py:288 +#: awx/main/conf.py:300 awx/main/conf.py:309 msgid "Logging" msgstr "" -#: main/conf.py:243 +#: awx/main/conf.py:243 msgid "Logging Aggregator Port" msgstr "" -#: main/conf.py:244 +#: awx/main/conf.py:244 msgid "Port on Logging Aggregator to send logs to (if required)." msgstr "" -#: main/conf.py:253 +#: awx/main/conf.py:253 msgid "Logging Aggregator Type" msgstr "" -#: main/conf.py:254 +#: awx/main/conf.py:254 msgid "Format messages for the chosen log aggregator." msgstr "" -#: main/conf.py:262 +#: awx/main/conf.py:262 msgid "Logging Aggregator Username" msgstr "" -#: main/conf.py:263 +#: awx/main/conf.py:263 msgid "Username for external log aggregator (if required)." msgstr "" -#: main/conf.py:272 +#: awx/main/conf.py:272 msgid "Logging Aggregator Password/Token" msgstr "" -#: main/conf.py:273 +#: awx/main/conf.py:273 msgid "" "Password or authentication token for external log aggregator (if required)." msgstr "" -#: main/conf.py:281 +#: awx/main/conf.py:281 msgid "Loggers to send data to the log aggregator from" msgstr "" -#: main/conf.py:282 +#: awx/main/conf.py:282 msgid "" "List of loggers that will send HTTP logs to the collector, these can include " "any or all of: \n" @@ -1247,11 +1310,11 @@ msgid "" "system_tracking - facts gathered from scan jobs." msgstr "" -#: main/conf.py:295 +#: awx/main/conf.py:295 msgid "Log System Tracking Facts Individually" msgstr "" -#: main/conf.py:296 +#: awx/main/conf.py:296 msgid "" "If set, system tracking facts will be sent for each package, service, " "orother item found in a scan, allowing for greater search query granularity. " @@ -1259,1435 +1322,1528 @@ msgid "" "efficiency in fact processing." msgstr "" -#: main/conf.py:307 +#: awx/main/conf.py:307 msgid "Enable External Logging" msgstr "" -#: main/conf.py:308 +#: awx/main/conf.py:308 msgid "Enable sending logs to external log aggregator." msgstr "" -#: main/models/activity_stream.py:22 +#: awx/main/models/activity_stream.py:22 msgid "Entity Created" msgstr "" -#: main/models/activity_stream.py:23 +#: awx/main/models/activity_stream.py:23 msgid "Entity Updated" msgstr "" -#: main/models/activity_stream.py:24 +#: awx/main/models/activity_stream.py:24 msgid "Entity Deleted" msgstr "" -#: main/models/activity_stream.py:25 +#: awx/main/models/activity_stream.py:25 msgid "Entity Associated with another Entity" msgstr "" -#: main/models/activity_stream.py:26 +#: awx/main/models/activity_stream.py:26 msgid "Entity was Disassociated with another Entity" msgstr "" -#: main/models/ad_hoc_commands.py:96 +#: awx/main/models/ad_hoc_commands.py:96 msgid "No valid inventory." msgstr "" -#: main/models/ad_hoc_commands.py:103 main/models/jobs.py:161 +#: awx/main/models/ad_hoc_commands.py:103 awx/main/models/jobs.py:161 msgid "You must provide a machine / SSH credential." msgstr "" -#: main/models/ad_hoc_commands.py:114 main/models/ad_hoc_commands.py:122 +#: awx/main/models/ad_hoc_commands.py:114 +#: awx/main/models/ad_hoc_commands.py:122 msgid "Invalid type for ad hoc command" msgstr "" -#: main/models/ad_hoc_commands.py:117 +#: awx/main/models/ad_hoc_commands.py:117 msgid "Unsupported module for ad hoc commands." msgstr "" -#: main/models/ad_hoc_commands.py:125 +#: awx/main/models/ad_hoc_commands.py:125 #, python-format msgid "No argument passed to %s module." msgstr "" -#: main/models/ad_hoc_commands.py:222 main/models/jobs.py:763 +#: awx/main/models/ad_hoc_commands.py:222 awx/main/models/jobs.py:766 msgid "Host Failed" msgstr "" -#: main/models/ad_hoc_commands.py:223 main/models/jobs.py:764 +#: awx/main/models/ad_hoc_commands.py:223 awx/main/models/jobs.py:767 msgid "Host OK" msgstr "" -#: main/models/ad_hoc_commands.py:224 main/models/jobs.py:767 +#: awx/main/models/ad_hoc_commands.py:224 awx/main/models/jobs.py:770 msgid "Host Unreachable" msgstr "" -#: main/models/ad_hoc_commands.py:229 main/models/jobs.py:766 +#: awx/main/models/ad_hoc_commands.py:229 awx/main/models/jobs.py:769 msgid "Host Skipped" msgstr "" -#: main/models/ad_hoc_commands.py:239 main/models/jobs.py:794 +#: awx/main/models/ad_hoc_commands.py:239 awx/main/models/jobs.py:797 msgid "Debug" msgstr "" -#: main/models/ad_hoc_commands.py:240 main/models/jobs.py:795 +#: awx/main/models/ad_hoc_commands.py:240 awx/main/models/jobs.py:798 msgid "Verbose" msgstr "" -#: main/models/ad_hoc_commands.py:241 main/models/jobs.py:796 +#: awx/main/models/ad_hoc_commands.py:241 awx/main/models/jobs.py:799 msgid "Deprecated" msgstr "" -#: main/models/ad_hoc_commands.py:242 main/models/jobs.py:797 +#: awx/main/models/ad_hoc_commands.py:242 awx/main/models/jobs.py:800 msgid "Warning" msgstr "" -#: main/models/ad_hoc_commands.py:243 main/models/jobs.py:798 +#: awx/main/models/ad_hoc_commands.py:243 awx/main/models/jobs.py:801 msgid "System Warning" msgstr "" -#: main/models/ad_hoc_commands.py:244 main/models/jobs.py:799 -#: main/models/unified_jobs.py:64 +#: awx/main/models/ad_hoc_commands.py:244 awx/main/models/jobs.py:802 +#: awx/main/models/unified_jobs.py:64 msgid "Error" msgstr "" -#: main/models/base.py:45 main/models/base.py:51 main/models/base.py:56 +#: awx/main/models/base.py:45 awx/main/models/base.py:51 +#: awx/main/models/base.py:56 msgid "Run" msgstr "" -#: main/models/base.py:46 main/models/base.py:52 main/models/base.py:57 +#: awx/main/models/base.py:46 awx/main/models/base.py:52 +#: awx/main/models/base.py:57 msgid "Check" msgstr "" -#: main/models/base.py:47 +#: awx/main/models/base.py:47 msgid "Scan" msgstr "" -#: main/models/base.py:61 +#: awx/main/models/base.py:61 msgid "Read Inventory" msgstr "" -#: main/models/base.py:62 +#: awx/main/models/base.py:62 msgid "Edit Inventory" msgstr "" -#: main/models/base.py:63 +#: awx/main/models/base.py:63 msgid "Administrate Inventory" msgstr "" -#: main/models/base.py:64 +#: awx/main/models/base.py:64 msgid "Deploy To Inventory" msgstr "" -#: main/models/base.py:65 +#: awx/main/models/base.py:65 msgid "Deploy To Inventory (Dry Run)" msgstr "" -#: main/models/base.py:66 +#: awx/main/models/base.py:66 msgid "Scan an Inventory" msgstr "" -#: main/models/base.py:67 +#: awx/main/models/base.py:67 msgid "Create a Job Template" msgstr "" -#: main/models/credential.py:33 +#: awx/main/models/credential.py:33 msgid "Machine" msgstr "" -#: main/models/credential.py:34 +#: awx/main/models/credential.py:34 msgid "Network" msgstr "" -#: main/models/credential.py:35 +#: awx/main/models/credential.py:35 msgid "Source Control" msgstr "" -#: main/models/credential.py:36 +#: awx/main/models/credential.py:36 msgid "Amazon Web Services" msgstr "" -#: main/models/credential.py:37 +#: awx/main/models/credential.py:37 msgid "Rackspace" msgstr "" -#: main/models/credential.py:38 main/models/inventory.py:713 +#: awx/main/models/credential.py:38 awx/main/models/inventory.py:713 msgid "VMware vCenter" msgstr "" -#: main/models/credential.py:39 main/models/inventory.py:714 +#: awx/main/models/credential.py:39 awx/main/models/inventory.py:714 msgid "Red Hat Satellite 6" msgstr "" -#: main/models/credential.py:40 main/models/inventory.py:715 +#: awx/main/models/credential.py:40 awx/main/models/inventory.py:715 msgid "Red Hat CloudForms" msgstr "" -#: main/models/credential.py:41 main/models/inventory.py:710 +#: awx/main/models/credential.py:41 awx/main/models/inventory.py:710 msgid "Google Compute Engine" msgstr "" -#: main/models/credential.py:42 main/models/inventory.py:711 +#: awx/main/models/credential.py:42 awx/main/models/inventory.py:711 msgid "Microsoft Azure Classic (deprecated)" msgstr "" -#: main/models/credential.py:43 main/models/inventory.py:712 +#: awx/main/models/credential.py:43 awx/main/models/inventory.py:712 msgid "Microsoft Azure Resource Manager" msgstr "" -#: main/models/credential.py:44 main/models/inventory.py:716 +#: awx/main/models/credential.py:44 awx/main/models/inventory.py:716 msgid "OpenStack" msgstr "" -#: main/models/credential.py:48 +#: awx/main/models/credential.py:48 msgid "None" msgstr "" -#: main/models/credential.py:49 +#: awx/main/models/credential.py:49 msgid "Sudo" msgstr "" -#: main/models/credential.py:50 +#: awx/main/models/credential.py:50 msgid "Su" msgstr "" -#: main/models/credential.py:51 +#: awx/main/models/credential.py:51 msgid "Pbrun" msgstr "" -#: main/models/credential.py:52 +#: awx/main/models/credential.py:52 msgid "Pfexec" msgstr "" -#: main/models/credential.py:53 +#: awx/main/models/credential.py:53 msgid "DZDO" msgstr "" -#: main/models/credential.py:54 +#: awx/main/models/credential.py:54 msgid "Pmrun" msgstr "" -#: main/models/credential.py:103 +#: awx/main/models/credential.py:103 msgid "Host" msgstr "" -#: main/models/credential.py:104 +#: awx/main/models/credential.py:104 msgid "The hostname or IP address to use." msgstr "" -#: main/models/credential.py:110 +#: awx/main/models/credential.py:110 msgid "Username" msgstr "" -#: main/models/credential.py:111 +#: awx/main/models/credential.py:111 msgid "Username for this credential." msgstr "" -#: main/models/credential.py:117 +#: awx/main/models/credential.py:117 msgid "Password" msgstr "" -#: main/models/credential.py:118 +#: awx/main/models/credential.py:118 msgid "" "Password for this credential (or \"ASK\" to prompt the user for machine " "credentials)." msgstr "" -#: main/models/credential.py:125 +#: awx/main/models/credential.py:125 msgid "Security Token" msgstr "" -#: main/models/credential.py:126 +#: awx/main/models/credential.py:126 msgid "Security Token for this credential" msgstr "" -#: main/models/credential.py:132 +#: awx/main/models/credential.py:132 msgid "Project" msgstr "" -#: main/models/credential.py:133 +#: awx/main/models/credential.py:133 msgid "The identifier for the project." msgstr "" -#: main/models/credential.py:139 +#: awx/main/models/credential.py:139 msgid "Domain" msgstr "" -#: main/models/credential.py:140 +#: awx/main/models/credential.py:140 msgid "The identifier for the domain." msgstr "" -#: main/models/credential.py:145 +#: awx/main/models/credential.py:145 msgid "SSH private key" msgstr "" -#: main/models/credential.py:146 +#: awx/main/models/credential.py:146 msgid "RSA or DSA private key to be used instead of password." msgstr "" -#: main/models/credential.py:152 +#: awx/main/models/credential.py:152 msgid "SSH key unlock" msgstr "" -#: main/models/credential.py:153 +#: awx/main/models/credential.py:153 msgid "" "Passphrase to unlock SSH private key if encrypted (or \"ASK\" to prompt the " "user for machine credentials)." msgstr "" -#: main/models/credential.py:161 +#: awx/main/models/credential.py:161 msgid "Privilege escalation method." msgstr "" -#: main/models/credential.py:167 +#: awx/main/models/credential.py:167 msgid "Privilege escalation username." msgstr "" -#: main/models/credential.py:173 +#: awx/main/models/credential.py:173 msgid "Password for privilege escalation method." msgstr "" -#: main/models/credential.py:179 +#: awx/main/models/credential.py:179 msgid "Vault password (or \"ASK\" to prompt the user)." msgstr "" -#: main/models/credential.py:183 +#: awx/main/models/credential.py:183 msgid "Whether to use the authorize mechanism." msgstr "" -#: main/models/credential.py:189 +#: awx/main/models/credential.py:189 msgid "Password used by the authorize mechanism." msgstr "" -#: main/models/credential.py:195 +#: awx/main/models/credential.py:195 msgid "Client Id or Application Id for the credential" msgstr "" -#: main/models/credential.py:201 +#: awx/main/models/credential.py:201 msgid "Secret Token for this credential" msgstr "" -#: main/models/credential.py:207 +#: awx/main/models/credential.py:207 msgid "Subscription identifier for this credential" msgstr "" -#: main/models/credential.py:213 +#: awx/main/models/credential.py:213 msgid "Tenant identifier for this credential" msgstr "" -#: main/models/credential.py:283 +#: awx/main/models/credential.py:283 msgid "Host required for VMware credential." msgstr "" -#: main/models/credential.py:285 +#: awx/main/models/credential.py:285 msgid "Host required for OpenStack credential." msgstr "" -#: main/models/credential.py:294 +#: awx/main/models/credential.py:294 msgid "Access key required for AWS credential." msgstr "" -#: main/models/credential.py:296 +#: awx/main/models/credential.py:296 msgid "Username required for Rackspace credential." msgstr "" -#: main/models/credential.py:299 +#: awx/main/models/credential.py:299 msgid "Username required for VMware credential." msgstr "" -#: main/models/credential.py:301 +#: awx/main/models/credential.py:301 msgid "Username required for OpenStack credential." msgstr "" -#: main/models/credential.py:307 +#: awx/main/models/credential.py:307 msgid "Secret key required for AWS credential." msgstr "" -#: main/models/credential.py:309 +#: awx/main/models/credential.py:309 msgid "API key required for Rackspace credential." msgstr "" -#: main/models/credential.py:311 +#: awx/main/models/credential.py:311 msgid "Password required for VMware credential." msgstr "" -#: main/models/credential.py:313 +#: awx/main/models/credential.py:313 msgid "Password or API key required for OpenStack credential." msgstr "" -#: main/models/credential.py:319 +#: awx/main/models/credential.py:319 msgid "Project name required for OpenStack credential." msgstr "" -#: main/models/credential.py:346 +#: awx/main/models/credential.py:346 msgid "SSH key unlock must be set when SSH key is encrypted." msgstr "" -#: main/models/credential.py:352 +#: awx/main/models/credential.py:352 msgid "Credential cannot be assigned to both a user and team." msgstr "" -#: main/models/fact.py:21 +#: awx/main/models/fact.py:21 msgid "Host for the facts that the fact scan captured." msgstr "" -#: main/models/fact.py:26 +#: awx/main/models/fact.py:26 msgid "Date and time of the corresponding fact scan gathering time." msgstr "" -#: main/models/fact.py:29 +#: awx/main/models/fact.py:29 msgid "" "Arbitrary JSON structure of module facts captured at timestamp for a single " "host." msgstr "" -#: main/models/inventory.py:45 +#: awx/main/models/inventory.py:45 msgid "inventories" msgstr "" -#: main/models/inventory.py:52 +#: awx/main/models/inventory.py:52 msgid "Organization containing this inventory." msgstr "" -#: main/models/inventory.py:58 +#: awx/main/models/inventory.py:58 msgid "Inventory variables in JSON or YAML format." msgstr "" -#: main/models/inventory.py:63 +#: awx/main/models/inventory.py:63 msgid "Flag indicating whether any hosts in this inventory have failed." msgstr "" -#: main/models/inventory.py:68 +#: awx/main/models/inventory.py:68 msgid "Total number of hosts in this inventory." msgstr "" -#: main/models/inventory.py:73 +#: awx/main/models/inventory.py:73 msgid "Number of hosts in this inventory with active failures." msgstr "" -#: main/models/inventory.py:78 +#: awx/main/models/inventory.py:78 msgid "Total number of groups in this inventory." msgstr "" -#: main/models/inventory.py:83 +#: awx/main/models/inventory.py:83 msgid "Number of groups in this inventory with active failures." msgstr "" -#: main/models/inventory.py:88 +#: awx/main/models/inventory.py:88 msgid "" "Flag indicating whether this inventory has any external inventory sources." msgstr "" -#: main/models/inventory.py:93 +#: awx/main/models/inventory.py:93 msgid "" "Total number of external inventory sources configured within this inventory." msgstr "" -#: main/models/inventory.py:98 +#: awx/main/models/inventory.py:98 msgid "Number of external inventory sources in this inventory with failures." msgstr "" -#: main/models/inventory.py:339 +#: awx/main/models/inventory.py:339 msgid "Is this host online and available for running jobs?" msgstr "" -#: main/models/inventory.py:345 +#: awx/main/models/inventory.py:345 msgid "" "The value used by the remote inventory source to uniquely identify the host" msgstr "" -#: main/models/inventory.py:350 +#: awx/main/models/inventory.py:350 msgid "Host variables in JSON or YAML format." msgstr "" -#: main/models/inventory.py:372 +#: awx/main/models/inventory.py:372 msgid "Flag indicating whether the last job failed for this host." msgstr "" -#: main/models/inventory.py:377 +#: awx/main/models/inventory.py:377 msgid "" "Flag indicating whether this host was created/updated from any external " "inventory sources." msgstr "" -#: main/models/inventory.py:383 +#: awx/main/models/inventory.py:383 msgid "Inventory source(s) that created or modified this host." msgstr "" -#: main/models/inventory.py:474 +#: awx/main/models/inventory.py:474 msgid "Group variables in JSON or YAML format." msgstr "" -#: main/models/inventory.py:480 +#: awx/main/models/inventory.py:480 msgid "Hosts associated directly with this group." msgstr "" -#: main/models/inventory.py:485 +#: awx/main/models/inventory.py:485 msgid "Total number of hosts directly or indirectly in this group." msgstr "" -#: main/models/inventory.py:490 +#: awx/main/models/inventory.py:490 msgid "Flag indicating whether this group has any hosts with active failures." msgstr "" -#: main/models/inventory.py:495 +#: awx/main/models/inventory.py:495 msgid "Number of hosts in this group with active failures." msgstr "" -#: main/models/inventory.py:500 +#: awx/main/models/inventory.py:500 msgid "Total number of child groups contained within this group." msgstr "" -#: main/models/inventory.py:505 +#: awx/main/models/inventory.py:505 msgid "Number of child groups within this group that have active failures." msgstr "" -#: main/models/inventory.py:510 +#: awx/main/models/inventory.py:510 msgid "" "Flag indicating whether this group was created/updated from any external " "inventory sources." msgstr "" -#: main/models/inventory.py:516 +#: awx/main/models/inventory.py:516 msgid "Inventory source(s) that created or modified this group." msgstr "" -#: main/models/inventory.py:706 main/models/projects.py:42 -#: main/models/unified_jobs.py:402 +#: awx/main/models/inventory.py:706 awx/main/models/projects.py:42 +#: awx/main/models/unified_jobs.py:402 msgid "Manual" msgstr "" -#: main/models/inventory.py:707 +#: awx/main/models/inventory.py:707 msgid "Local File, Directory or Script" msgstr "" -#: main/models/inventory.py:708 +#: awx/main/models/inventory.py:708 msgid "Rackspace Cloud Servers" msgstr "" -#: main/models/inventory.py:709 +#: awx/main/models/inventory.py:709 msgid "Amazon EC2" msgstr "" -#: main/models/inventory.py:717 +#: awx/main/models/inventory.py:717 msgid "Custom Script" msgstr "" -#: main/models/inventory.py:828 +#: awx/main/models/inventory.py:828 msgid "Inventory source variables in YAML or JSON format." msgstr "" -#: main/models/inventory.py:847 +#: awx/main/models/inventory.py:847 msgid "" "Comma-separated list of filter expressions (EC2 only). Hosts are imported " "when ANY of the filters match." msgstr "" -#: main/models/inventory.py:853 +#: awx/main/models/inventory.py:853 msgid "Limit groups automatically created from inventory source (EC2 only)." msgstr "" -#: main/models/inventory.py:857 +#: awx/main/models/inventory.py:857 msgid "Overwrite local groups and hosts from remote inventory source." msgstr "" -#: main/models/inventory.py:861 +#: awx/main/models/inventory.py:861 msgid "Overwrite local variables from remote inventory source." msgstr "" -#: main/models/inventory.py:893 +#: awx/main/models/inventory.py:893 msgid "Availability Zone" msgstr "" -#: main/models/inventory.py:894 +#: awx/main/models/inventory.py:894 msgid "Image ID" msgstr "" -#: main/models/inventory.py:895 +#: awx/main/models/inventory.py:895 msgid "Instance ID" msgstr "" -#: main/models/inventory.py:896 +#: awx/main/models/inventory.py:896 msgid "Instance Type" msgstr "" -#: main/models/inventory.py:897 +#: awx/main/models/inventory.py:897 msgid "Key Name" msgstr "" -#: main/models/inventory.py:898 +#: awx/main/models/inventory.py:898 msgid "Region" msgstr "" -#: main/models/inventory.py:899 +#: awx/main/models/inventory.py:899 msgid "Security Group" msgstr "" -#: main/models/inventory.py:900 +#: awx/main/models/inventory.py:900 msgid "Tags" msgstr "" -#: main/models/inventory.py:901 +#: awx/main/models/inventory.py:901 msgid "VPC ID" msgstr "" -#: main/models/inventory.py:902 +#: awx/main/models/inventory.py:902 msgid "Tag None" msgstr "" -#: main/models/inventory.py:973 +#: awx/main/models/inventory.py:973 #, python-format msgid "" "Cloud-based inventory sources (such as %s) require credentials for the " "matching cloud service." msgstr "" -#: main/models/inventory.py:980 +#: awx/main/models/inventory.py:980 msgid "Credential is required for a cloud source." msgstr "" -#: main/models/inventory.py:1005 +#: awx/main/models/inventory.py:1005 #, python-format msgid "Invalid %(source)s region: %(region)s" msgstr "" -#: main/models/inventory.py:1030 +#: awx/main/models/inventory.py:1030 #, python-format msgid "Invalid filter expression: %(filter)s" msgstr "" -#: main/models/inventory.py:1048 +#: awx/main/models/inventory.py:1048 #, python-format msgid "Invalid group by choice: %(choice)s" msgstr "" -#: main/models/inventory.py:1195 +#: awx/main/models/inventory.py:1195 #, python-format msgid "" "Unable to configure this item for cloud sync. It is already managed by %s." msgstr "" -#: main/models/inventory.py:1290 +#: awx/main/models/inventory.py:1290 msgid "Inventory script contents" msgstr "" -#: main/models/inventory.py:1295 +#: awx/main/models/inventory.py:1295 msgid "Organization owning this inventory script" msgstr "" -#: main/models/jobs.py:169 +#: awx/main/models/jobs.py:169 msgid "You must provide a network credential." msgstr "" -#: main/models/jobs.py:177 +#: awx/main/models/jobs.py:177 msgid "" "Must provide a credential for a cloud provider, such as Amazon Web Services " "or Rackspace." msgstr "" -#: main/models/jobs.py:269 +#: awx/main/models/jobs.py:269 msgid "Job Template must provide 'inventory' or allow prompting for it." msgstr "" -#: main/models/jobs.py:273 +#: awx/main/models/jobs.py:273 msgid "Job Template must provide 'credential' or allow prompting for it." msgstr "" -#: main/models/jobs.py:362 +#: awx/main/models/jobs.py:362 msgid "Cannot override job_type to or from a scan job." msgstr "" -#: main/models/jobs.py:365 +#: awx/main/models/jobs.py:365 msgid "Inventory cannot be changed at runtime for scan jobs." msgstr "" -#: main/models/jobs.py:431 main/models/projects.py:243 +#: awx/main/models/jobs.py:431 awx/main/models/projects.py:243 msgid "SCM Revision" msgstr "" -#: main/models/jobs.py:432 +#: awx/main/models/jobs.py:432 msgid "The SCM Revision from the Project used for this job, if available" msgstr "" -#: main/models/jobs.py:440 +#: awx/main/models/jobs.py:440 msgid "" "The SCM Refresh task used to make sure the playbooks were available for the " "job run" msgstr "" -#: main/models/jobs.py:662 +#: awx/main/models/jobs.py:665 msgid "job host summaries" msgstr "" -#: main/models/jobs.py:765 +#: awx/main/models/jobs.py:768 msgid "Host Failure" msgstr "" -#: main/models/jobs.py:768 main/models/jobs.py:782 +#: awx/main/models/jobs.py:771 awx/main/models/jobs.py:785 msgid "No Hosts Remaining" msgstr "" -#: main/models/jobs.py:769 +#: awx/main/models/jobs.py:772 msgid "Host Polling" msgstr "" -#: main/models/jobs.py:770 +#: awx/main/models/jobs.py:773 msgid "Host Async OK" msgstr "" -#: main/models/jobs.py:771 +#: awx/main/models/jobs.py:774 msgid "Host Async Failure" msgstr "" -#: main/models/jobs.py:772 +#: awx/main/models/jobs.py:775 msgid "Item OK" msgstr "" -#: main/models/jobs.py:773 +#: awx/main/models/jobs.py:776 msgid "Item Failed" msgstr "" -#: main/models/jobs.py:774 +#: awx/main/models/jobs.py:777 msgid "Item Skipped" msgstr "" -#: main/models/jobs.py:775 +#: awx/main/models/jobs.py:778 msgid "Host Retry" msgstr "" -#: main/models/jobs.py:777 +#: awx/main/models/jobs.py:780 msgid "File Difference" msgstr "" -#: main/models/jobs.py:778 +#: awx/main/models/jobs.py:781 msgid "Playbook Started" msgstr "" -#: main/models/jobs.py:779 +#: awx/main/models/jobs.py:782 msgid "Running Handlers" msgstr "" -#: main/models/jobs.py:780 +#: awx/main/models/jobs.py:783 msgid "Including File" msgstr "" -#: main/models/jobs.py:781 +#: awx/main/models/jobs.py:784 msgid "No Hosts Matched" msgstr "" -#: main/models/jobs.py:783 +#: awx/main/models/jobs.py:786 msgid "Task Started" msgstr "" -#: main/models/jobs.py:785 +#: awx/main/models/jobs.py:788 msgid "Variables Prompted" msgstr "" -#: main/models/jobs.py:786 +#: awx/main/models/jobs.py:789 msgid "Gathering Facts" msgstr "" -#: main/models/jobs.py:787 +#: awx/main/models/jobs.py:790 msgid "internal: on Import for Host" msgstr "" -#: main/models/jobs.py:788 +#: awx/main/models/jobs.py:791 msgid "internal: on Not Import for Host" msgstr "" -#: main/models/jobs.py:789 +#: awx/main/models/jobs.py:792 msgid "Play Started" msgstr "" -#: main/models/jobs.py:790 +#: awx/main/models/jobs.py:793 msgid "Playbook Complete" msgstr "" -#: main/models/jobs.py:1200 +#: awx/main/models/jobs.py:1203 msgid "Remove jobs older than a certain number of days" msgstr "" -#: main/models/jobs.py:1201 +#: awx/main/models/jobs.py:1204 msgid "Remove activity stream entries older than a certain number of days" msgstr "" -#: main/models/jobs.py:1202 +#: awx/main/models/jobs.py:1205 msgid "Purge and/or reduce the granularity of system tracking data" msgstr "" -#: main/models/label.py:29 +#: awx/main/models/label.py:29 msgid "Organization this label belongs to." msgstr "" -#: main/models/notifications.py:31 +#: awx/main/models/notifications.py:31 msgid "Email" msgstr "" -#: main/models/notifications.py:32 +#: awx/main/models/notifications.py:32 msgid "Slack" msgstr "" -#: main/models/notifications.py:33 +#: awx/main/models/notifications.py:33 msgid "Twilio" msgstr "" -#: main/models/notifications.py:34 +#: awx/main/models/notifications.py:34 msgid "Pagerduty" msgstr "" -#: main/models/notifications.py:35 +#: awx/main/models/notifications.py:35 msgid "HipChat" msgstr "" -#: main/models/notifications.py:36 +#: awx/main/models/notifications.py:36 msgid "Webhook" msgstr "" -#: main/models/notifications.py:37 +#: awx/main/models/notifications.py:37 msgid "IRC" msgstr "" -#: main/models/notifications.py:127 main/models/unified_jobs.py:59 +#: awx/main/models/notifications.py:127 awx/main/models/unified_jobs.py:59 msgid "Pending" msgstr "" -#: main/models/notifications.py:128 main/models/unified_jobs.py:62 +#: awx/main/models/notifications.py:128 awx/main/models/unified_jobs.py:62 msgid "Successful" msgstr "" -#: main/models/notifications.py:129 main/models/unified_jobs.py:63 +#: awx/main/models/notifications.py:129 awx/main/models/unified_jobs.py:63 msgid "Failed" msgstr "" -#: main/models/organization.py:157 +#: awx/main/models/organization.py:157 msgid "Execute Commands on the Inventory" msgstr "" -#: main/models/organization.py:211 +#: awx/main/models/organization.py:211 msgid "Token not invalidated" msgstr "" -#: main/models/organization.py:212 +#: awx/main/models/organization.py:212 msgid "Token is expired" msgstr "" -#: main/models/organization.py:213 +#: awx/main/models/organization.py:213 msgid "The maximum number of allowed sessions for this user has been exceeded." msgstr "" -#: main/models/organization.py:216 +#: awx/main/models/organization.py:216 msgid "Invalid token" msgstr "" -#: main/models/organization.py:233 +#: awx/main/models/organization.py:233 msgid "Reason the auth token was invalidated." msgstr "" -#: main/models/organization.py:272 +#: awx/main/models/organization.py:272 msgid "Invalid reason specified" msgstr "" -#: main/models/projects.py:43 +#: awx/main/models/projects.py:43 msgid "Git" msgstr "" -#: main/models/projects.py:44 +#: awx/main/models/projects.py:44 msgid "Mercurial" msgstr "" -#: main/models/projects.py:45 +#: awx/main/models/projects.py:45 msgid "Subversion" msgstr "" -#: main/models/projects.py:71 +#: awx/main/models/projects.py:71 msgid "" "Local path (relative to PROJECTS_ROOT) containing playbooks and related " "files for this project." msgstr "" -#: main/models/projects.py:80 +#: awx/main/models/projects.py:80 msgid "SCM Type" msgstr "" -#: main/models/projects.py:81 +#: awx/main/models/projects.py:81 msgid "Specifies the source control system used to store the project." msgstr "" -#: main/models/projects.py:87 +#: awx/main/models/projects.py:87 msgid "SCM URL" msgstr "" -#: main/models/projects.py:88 +#: awx/main/models/projects.py:88 msgid "The location where the project is stored." msgstr "" -#: main/models/projects.py:94 +#: awx/main/models/projects.py:94 msgid "SCM Branch" msgstr "" -#: main/models/projects.py:95 +#: awx/main/models/projects.py:95 msgid "Specific branch, tag or commit to checkout." msgstr "" -#: main/models/projects.py:99 +#: awx/main/models/projects.py:99 msgid "Discard any local changes before syncing the project." msgstr "" -#: main/models/projects.py:103 +#: awx/main/models/projects.py:103 msgid "Delete the project before syncing." msgstr "" -#: main/models/projects.py:116 +#: awx/main/models/projects.py:116 msgid "The amount of time to run before the task is canceled." msgstr "" -#: main/models/projects.py:130 +#: awx/main/models/projects.py:130 msgid "Invalid SCM URL." msgstr "" -#: main/models/projects.py:133 +#: awx/main/models/projects.py:133 msgid "SCM URL is required." msgstr "" -#: main/models/projects.py:142 +#: awx/main/models/projects.py:142 msgid "Credential kind must be 'scm'." msgstr "" -#: main/models/projects.py:157 +#: awx/main/models/projects.py:157 msgid "Invalid credential." msgstr "" -#: main/models/projects.py:229 +#: awx/main/models/projects.py:229 msgid "Update the project when a job is launched that uses the project." msgstr "" -#: main/models/projects.py:234 +#: awx/main/models/projects.py:234 msgid "" "The number of seconds after the last project update ran that a newproject " "update will be launched as a job dependency." msgstr "" -#: main/models/projects.py:244 +#: awx/main/models/projects.py:244 msgid "The last revision fetched by a project update" msgstr "" -#: main/models/projects.py:251 +#: awx/main/models/projects.py:251 msgid "Playbook Files" msgstr "" -#: main/models/projects.py:252 +#: awx/main/models/projects.py:252 msgid "List of playbooks found in the project" msgstr "" -#: main/models/rbac.py:122 +#: awx/main/models/rbac.py:36 +msgid "System Administrator" +msgstr "" + +#: awx/main/models/rbac.py:37 +msgid "System Auditor" +msgstr "" + +#: awx/main/models/rbac.py:38 +msgid "Ad Hoc" +msgstr "" + +#: awx/main/models/rbac.py:39 +msgid "Admin" +msgstr "" + +#: awx/main/models/rbac.py:40 +msgid "Auditor" +msgstr "" + +#: awx/main/models/rbac.py:41 +msgid "Execute" +msgstr "" + +#: awx/main/models/rbac.py:42 +msgid "Member" +msgstr "" + +#: awx/main/models/rbac.py:43 +msgid "Read" +msgstr "" + +#: awx/main/models/rbac.py:44 +msgid "Update" +msgstr "" + +#: awx/main/models/rbac.py:45 +msgid "Use" +msgstr "" + +#: awx/main/models/rbac.py:49 +msgid "Can manage all aspects of the system" +msgstr "" + +#: awx/main/models/rbac.py:50 +msgid "Can view all settings on the system" +msgstr "" + +#: awx/main/models/rbac.py:51 +msgid "May run ad hoc commands on an inventory" +msgstr "" + +#: awx/main/models/rbac.py:52 +#, python-format +msgid "Can manage all aspects of the %s" +msgstr "" + +#: awx/main/models/rbac.py:53 +#, python-format +msgid "Can view all settings for the %s" +msgstr "" + +#: awx/main/models/rbac.py:54 +#, python-format +msgid "May run the %s" +msgstr "" + +#: awx/main/models/rbac.py:55 +#, python-format +msgid "User is a member of the %s" +msgstr "" + +#: awx/main/models/rbac.py:56 +#, python-format +msgid "May view settings for the %s" +msgstr "" + +#: awx/main/models/rbac.py:57 +msgid "" +"May update project or inventory or group using the configured source update " +"system" +msgstr "" + +#: awx/main/models/rbac.py:58 +#, python-format +msgid "Can use the %s in a job template" +msgstr "" + +#: awx/main/models/rbac.py:122 msgid "roles" msgstr "" -#: main/models/rbac.py:438 +#: awx/main/models/rbac.py:438 msgid "role_ancestors" msgstr "" -#: main/models/schedules.py:69 +#: awx/main/models/schedules.py:69 msgid "Enables processing of this schedule by Tower." msgstr "" -#: main/models/schedules.py:75 +#: awx/main/models/schedules.py:75 msgid "The first occurrence of the schedule occurs on or after this time." msgstr "" -#: main/models/schedules.py:81 +#: awx/main/models/schedules.py:81 msgid "" "The last occurrence of the schedule occurs before this time, aftewards the " "schedule expires." msgstr "" -#: main/models/schedules.py:85 +#: awx/main/models/schedules.py:85 msgid "A value representing the schedules iCal recurrence rule." msgstr "" -#: main/models/schedules.py:91 +#: awx/main/models/schedules.py:91 msgid "The next time that the scheduled action will run." msgstr "" -#: main/models/unified_jobs.py:58 +#: awx/main/models/unified_jobs.py:58 msgid "New" msgstr "" -#: main/models/unified_jobs.py:60 +#: awx/main/models/unified_jobs.py:60 msgid "Waiting" msgstr "" -#: main/models/unified_jobs.py:61 +#: awx/main/models/unified_jobs.py:61 msgid "Running" msgstr "" -#: main/models/unified_jobs.py:65 +#: awx/main/models/unified_jobs.py:65 msgid "Canceled" msgstr "" -#: main/models/unified_jobs.py:69 +#: awx/main/models/unified_jobs.py:69 msgid "Never Updated" msgstr "" -#: main/models/unified_jobs.py:73 ui/templates/ui/index.html:85 -#: ui/templates/ui/index.html.py:104 +#: awx/main/models/unified_jobs.py:73 awx/ui/templates/ui/index.html:85 +#: awx/ui/templates/ui/index.html.py:104 msgid "OK" msgstr "" -#: main/models/unified_jobs.py:74 +#: awx/main/models/unified_jobs.py:74 msgid "Missing" msgstr "" -#: main/models/unified_jobs.py:78 +#: awx/main/models/unified_jobs.py:78 msgid "No External Source" msgstr "" -#: main/models/unified_jobs.py:85 +#: awx/main/models/unified_jobs.py:85 msgid "Updating" msgstr "" -#: main/models/unified_jobs.py:403 +#: awx/main/models/unified_jobs.py:403 msgid "Relaunch" msgstr "" -#: main/models/unified_jobs.py:404 +#: awx/main/models/unified_jobs.py:404 msgid "Callback" msgstr "" -#: main/models/unified_jobs.py:405 +#: awx/main/models/unified_jobs.py:405 msgid "Scheduled" msgstr "" -#: main/models/unified_jobs.py:406 +#: awx/main/models/unified_jobs.py:406 msgid "Dependency" msgstr "" -#: main/models/unified_jobs.py:407 +#: awx/main/models/unified_jobs.py:407 msgid "Workflow" msgstr "" -#: main/models/unified_jobs.py:408 +#: awx/main/models/unified_jobs.py:408 msgid "Sync" msgstr "" -#: main/models/unified_jobs.py:454 +#: awx/main/models/unified_jobs.py:454 msgid "The Tower node the job executed on." msgstr "" -#: main/models/unified_jobs.py:480 +#: awx/main/models/unified_jobs.py:480 msgid "The date and time the job was queued for starting." msgstr "" -#: main/models/unified_jobs.py:486 +#: awx/main/models/unified_jobs.py:486 msgid "The date and time the job finished execution." msgstr "" -#: main/models/unified_jobs.py:492 +#: awx/main/models/unified_jobs.py:492 msgid "Elapsed time in seconds that the job ran." msgstr "" -#: main/models/unified_jobs.py:514 +#: awx/main/models/unified_jobs.py:514 msgid "" "A status field to indicate the state of the job if it wasn't able to run and " "capture stdout" msgstr "" -#: main/notifications/base.py:17 main/notifications/email_backend.py:28 +#: awx/main/notifications/base.py:17 +#: awx/main/notifications/email_backend.py:28 msgid "" "{} #{} had status {} on Ansible Tower, view details at {}\n" "\n" msgstr "" -#: main/notifications/hipchat_backend.py:46 +#: awx/main/notifications/hipchat_backend.py:46 msgid "Error sending messages: {}" msgstr "" -#: main/notifications/hipchat_backend.py:48 +#: awx/main/notifications/hipchat_backend.py:48 msgid "Error sending message to hipchat: {}" msgstr "" -#: main/notifications/irc_backend.py:54 +#: awx/main/notifications/irc_backend.py:54 msgid "Exception connecting to irc server: {}" msgstr "" -#: main/notifications/pagerduty_backend.py:39 +#: awx/main/notifications/pagerduty_backend.py:39 msgid "Exception connecting to PagerDuty: {}" msgstr "" -#: main/notifications/pagerduty_backend.py:48 -#: main/notifications/slack_backend.py:52 -#: main/notifications/twilio_backend.py:46 +#: awx/main/notifications/pagerduty_backend.py:48 +#: awx/main/notifications/slack_backend.py:52 +#: awx/main/notifications/twilio_backend.py:46 msgid "Exception sending messages: {}" msgstr "" -#: main/notifications/twilio_backend.py:36 +#: awx/main/notifications/twilio_backend.py:36 msgid "Exception connecting to Twilio: {}" msgstr "" -#: main/notifications/webhook_backend.py:38 -#: main/notifications/webhook_backend.py:40 +#: awx/main/notifications/webhook_backend.py:38 +#: awx/main/notifications/webhook_backend.py:40 msgid "Error sending notification webhook: {}" msgstr "" -#: main/scheduler/__init__.py:130 +#: awx/main/scheduler/__init__.py:130 msgid "" "Job spawned from workflow could not start because it was not in the right " "state or required manual credentials" msgstr "" -#: main/tasks.py:180 +#: awx/main/tasks.py:180 msgid "Ansible Tower host usage over 90%" msgstr "" -#: main/tasks.py:185 +#: awx/main/tasks.py:185 msgid "Ansible Tower license will expire soon" msgstr "" -#: main/tasks.py:240 +#: awx/main/tasks.py:249 msgid "status_str must be either succeeded or failed" msgstr "" -#: main/utils/common.py:89 +#: awx/main/utils/common.py:89 #, python-format msgid "Unable to convert \"%s\" to boolean" msgstr "" -#: main/utils/common.py:243 +#: awx/main/utils/common.py:243 #, python-format msgid "Unsupported SCM type \"%s\"" msgstr "" -#: main/utils/common.py:250 main/utils/common.py:262 main/utils/common.py:281 +#: awx/main/utils/common.py:250 awx/main/utils/common.py:262 +#: awx/main/utils/common.py:281 #, python-format msgid "Invalid %s URL" msgstr "" -#: main/utils/common.py:252 main/utils/common.py:290 +#: awx/main/utils/common.py:252 awx/main/utils/common.py:290 #, python-format msgid "Unsupported %s URL" msgstr "" -#: main/utils/common.py:292 +#: awx/main/utils/common.py:292 #, python-format msgid "Unsupported host \"%s\" for file:// URL" msgstr "" -#: main/utils/common.py:294 +#: awx/main/utils/common.py:294 #, python-format msgid "Host is required for %s URL" msgstr "" -#: main/utils/common.py:312 +#: awx/main/utils/common.py:312 #, python-format msgid "Username must be \"git\" for SSH access to %s." msgstr "" -#: main/utils/common.py:318 +#: awx/main/utils/common.py:318 #, python-format msgid "Username must be \"hg\" for SSH access to %s." msgstr "" -#: main/validators.py:60 +#: awx/main/validators.py:60 #, python-format msgid "Invalid certificate or key: %r..." msgstr "" -#: main/validators.py:74 +#: awx/main/validators.py:74 #, python-format msgid "Invalid private key: unsupported type \"%s\"" msgstr "" -#: main/validators.py:78 +#: awx/main/validators.py:78 #, python-format msgid "Unsupported PEM object type: \"%s\"" msgstr "" -#: main/validators.py:103 +#: awx/main/validators.py:103 msgid "Invalid base64-encoded data" msgstr "" -#: main/validators.py:122 +#: awx/main/validators.py:122 msgid "Exactly one private key is required." msgstr "" -#: main/validators.py:124 +#: awx/main/validators.py:124 msgid "At least one private key is required." msgstr "" -#: main/validators.py:126 +#: awx/main/validators.py:126 #, python-format msgid "" "At least %(min_keys)d private keys are required, only %(key_count)d provided." msgstr "" -#: main/validators.py:129 +#: awx/main/validators.py:129 #, python-format msgid "Only one private key is allowed, %(key_count)d provided." msgstr "" -#: main/validators.py:131 +#: awx/main/validators.py:131 #, python-format msgid "" "No more than %(max_keys)d private keys are allowed, %(key_count)d provided." msgstr "" -#: main/validators.py:136 +#: awx/main/validators.py:136 msgid "Exactly one certificate is required." msgstr "" -#: main/validators.py:138 +#: awx/main/validators.py:138 msgid "At least one certificate is required." msgstr "" -#: main/validators.py:140 +#: awx/main/validators.py:140 #, python-format msgid "" "At least %(min_certs)d certificates are required, only %(cert_count)d " "provided." msgstr "" -#: main/validators.py:143 +#: awx/main/validators.py:143 #, python-format msgid "Only one certificate is allowed, %(cert_count)d provided." msgstr "" -#: main/validators.py:145 +#: awx/main/validators.py:145 #, python-format msgid "" "No more than %(max_certs)d certificates are allowed, %(cert_count)d provided." msgstr "" -#: main/views.py:20 +#: awx/main/views.py:20 msgid "API Error" msgstr "" -#: main/views.py:49 +#: awx/main/views.py:49 msgid "Bad Request" msgstr "" -#: main/views.py:50 +#: awx/main/views.py:50 msgid "The request could not be understood by the server." msgstr "" -#: main/views.py:57 +#: awx/main/views.py:57 msgid "Forbidden" msgstr "" -#: main/views.py:58 +#: awx/main/views.py:58 msgid "You don't have permission to access the requested resource." msgstr "" -#: main/views.py:65 +#: awx/main/views.py:65 msgid "Not Found" msgstr "" -#: main/views.py:66 +#: awx/main/views.py:66 msgid "The requested resource could not be found." msgstr "" -#: main/views.py:73 +#: awx/main/views.py:73 msgid "Server Error" msgstr "" -#: main/views.py:74 +#: awx/main/views.py:74 msgid "A server error has occurred." msgstr "" -#: settings/defaults.py:611 +#: awx/settings/defaults.py:624 msgid "Chicago" msgstr "" -#: settings/defaults.py:612 +#: awx/settings/defaults.py:625 msgid "Dallas/Ft. Worth" msgstr "" -#: settings/defaults.py:613 +#: awx/settings/defaults.py:626 msgid "Northern Virginia" msgstr "" -#: settings/defaults.py:614 +#: awx/settings/defaults.py:627 msgid "London" msgstr "" -#: settings/defaults.py:615 +#: awx/settings/defaults.py:628 msgid "Sydney" msgstr "" -#: settings/defaults.py:616 +#: awx/settings/defaults.py:629 msgid "Hong Kong" msgstr "" -#: settings/defaults.py:643 +#: awx/settings/defaults.py:656 msgid "US East (Northern Virginia)" msgstr "" -#: settings/defaults.py:644 +#: awx/settings/defaults.py:657 msgid "US East (Ohio)" msgstr "" -#: settings/defaults.py:645 +#: awx/settings/defaults.py:658 msgid "US West (Oregon)" msgstr "" -#: settings/defaults.py:646 +#: awx/settings/defaults.py:659 msgid "US West (Northern California)" msgstr "" -#: settings/defaults.py:647 +#: awx/settings/defaults.py:660 msgid "Canada (Central)" msgstr "" -#: settings/defaults.py:648 +#: awx/settings/defaults.py:661 msgid "EU (Frankfurt)" msgstr "" -#: settings/defaults.py:649 +#: awx/settings/defaults.py:662 msgid "EU (Ireland)" msgstr "" -#: settings/defaults.py:650 +#: awx/settings/defaults.py:663 msgid "EU (London)" msgstr "" -#: settings/defaults.py:651 +#: awx/settings/defaults.py:664 msgid "Asia Pacific (Singapore)" msgstr "" -#: settings/defaults.py:652 +#: awx/settings/defaults.py:665 msgid "Asia Pacific (Sydney)" msgstr "" -#: settings/defaults.py:653 +#: awx/settings/defaults.py:666 msgid "Asia Pacific (Tokyo)" msgstr "" -#: settings/defaults.py:654 +#: awx/settings/defaults.py:667 msgid "Asia Pacific (Seoul)" msgstr "" -#: settings/defaults.py:655 +#: awx/settings/defaults.py:668 msgid "Asia Pacific (Mumbai)" msgstr "" -#: settings/defaults.py:656 +#: awx/settings/defaults.py:669 msgid "South America (Sao Paulo)" msgstr "" -#: settings/defaults.py:657 +#: awx/settings/defaults.py:670 msgid "US West (GovCloud)" msgstr "" -#: settings/defaults.py:658 +#: awx/settings/defaults.py:671 msgid "China (Beijing)" msgstr "" -#: settings/defaults.py:707 +#: awx/settings/defaults.py:720 msgid "US East (B)" msgstr "" -#: settings/defaults.py:708 +#: awx/settings/defaults.py:721 msgid "US East (C)" msgstr "" -#: settings/defaults.py:709 +#: awx/settings/defaults.py:722 msgid "US East (D)" msgstr "" -#: settings/defaults.py:710 +#: awx/settings/defaults.py:723 msgid "US Central (A)" msgstr "" -#: settings/defaults.py:711 +#: awx/settings/defaults.py:724 msgid "US Central (B)" msgstr "" -#: settings/defaults.py:712 +#: awx/settings/defaults.py:725 msgid "US Central (C)" msgstr "" -#: settings/defaults.py:713 +#: awx/settings/defaults.py:726 msgid "US Central (F)" msgstr "" -#: settings/defaults.py:714 +#: awx/settings/defaults.py:727 msgid "Europe West (B)" msgstr "" -#: settings/defaults.py:715 +#: awx/settings/defaults.py:728 msgid "Europe West (C)" msgstr "" -#: settings/defaults.py:716 +#: awx/settings/defaults.py:729 msgid "Europe West (D)" msgstr "" -#: settings/defaults.py:717 +#: awx/settings/defaults.py:730 msgid "Asia East (A)" msgstr "" -#: settings/defaults.py:718 +#: awx/settings/defaults.py:731 msgid "Asia East (B)" msgstr "" -#: settings/defaults.py:719 +#: awx/settings/defaults.py:732 msgid "Asia East (C)" msgstr "" -#: settings/defaults.py:743 +#: awx/settings/defaults.py:756 msgid "US Central" msgstr "" -#: settings/defaults.py:744 +#: awx/settings/defaults.py:757 msgid "US East" msgstr "" -#: settings/defaults.py:745 +#: awx/settings/defaults.py:758 msgid "US East 2" msgstr "" -#: settings/defaults.py:746 +#: awx/settings/defaults.py:759 msgid "US North Central" msgstr "" -#: settings/defaults.py:747 +#: awx/settings/defaults.py:760 msgid "US South Central" msgstr "" -#: settings/defaults.py:748 +#: awx/settings/defaults.py:761 msgid "US West" msgstr "" -#: settings/defaults.py:749 +#: awx/settings/defaults.py:762 msgid "Europe North" msgstr "" -#: settings/defaults.py:750 +#: awx/settings/defaults.py:763 msgid "Europe West" msgstr "" -#: settings/defaults.py:751 +#: awx/settings/defaults.py:764 msgid "Asia Pacific East" msgstr "" -#: settings/defaults.py:752 +#: awx/settings/defaults.py:765 msgid "Asia Pacific Southeast" msgstr "" -#: settings/defaults.py:753 +#: awx/settings/defaults.py:766 msgid "Japan East" msgstr "" -#: settings/defaults.py:754 +#: awx/settings/defaults.py:767 msgid "Japan West" msgstr "" -#: settings/defaults.py:755 +#: awx/settings/defaults.py:768 msgid "Brazil South" msgstr "" -#: sso/apps.py:9 +#: awx/sso/apps.py:9 msgid "Single Sign-On" msgstr "" -#: sso/conf.py:27 +#: awx/sso/conf.py:27 msgid "" "Mapping to organization admins/users from social auth accounts. This " "setting\n" @@ -2725,7 +2881,7 @@ msgid "" " remove_admins." msgstr "" -#: sso/conf.py:76 +#: awx/sso/conf.py:76 msgid "" "Mapping of team members (users) from social auth accounts. Keys are team\n" "names (will be created if not present). Values are dictionaries of options\n" @@ -2754,40 +2910,40 @@ msgid "" " the rules above will be removed from the team." msgstr "" -#: sso/conf.py:119 +#: awx/sso/conf.py:119 msgid "Authentication Backends" msgstr "" -#: sso/conf.py:120 +#: awx/sso/conf.py:120 msgid "" "List of authentication backends that are enabled based on license features " "and other authentication settings." msgstr "" -#: sso/conf.py:133 +#: awx/sso/conf.py:133 msgid "Social Auth Organization Map" msgstr "" -#: sso/conf.py:145 +#: awx/sso/conf.py:145 msgid "Social Auth Team Map" msgstr "" -#: sso/conf.py:157 +#: awx/sso/conf.py:157 msgid "Social Auth User Fields" msgstr "" -#: sso/conf.py:158 +#: awx/sso/conf.py:158 msgid "" "When set to an empty list `[]`, this setting prevents new user accounts from " "being created. Only users who have previously logged in using social auth or " "have a user account with a matching email address will be able to login." msgstr "" -#: sso/conf.py:176 +#: awx/sso/conf.py:176 msgid "LDAP Server URI" msgstr "" -#: sso/conf.py:177 +#: awx/sso/conf.py:177 msgid "" "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-" "SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be " @@ -2795,18 +2951,19 @@ msgid "" "disabled if this parameter is empty." msgstr "" -#: sso/conf.py:181 sso/conf.py:199 sso/conf.py:211 sso/conf.py:223 -#: sso/conf.py:239 sso/conf.py:258 sso/conf.py:280 sso/conf.py:296 -#: sso/conf.py:315 sso/conf.py:332 sso/conf.py:349 sso/conf.py:365 -#: sso/conf.py:382 sso/conf.py:420 sso/conf.py:461 +#: awx/sso/conf.py:181 awx/sso/conf.py:199 awx/sso/conf.py:211 +#: awx/sso/conf.py:223 awx/sso/conf.py:239 awx/sso/conf.py:258 +#: awx/sso/conf.py:280 awx/sso/conf.py:296 awx/sso/conf.py:315 +#: awx/sso/conf.py:332 awx/sso/conf.py:349 awx/sso/conf.py:365 +#: awx/sso/conf.py:382 awx/sso/conf.py:420 awx/sso/conf.py:461 msgid "LDAP" msgstr "" -#: sso/conf.py:193 +#: awx/sso/conf.py:193 msgid "LDAP Bind DN" msgstr "" -#: sso/conf.py:194 +#: awx/sso/conf.py:194 msgid "" "DN (Distinguished Name) of user to bind for all search queries. Normally in " "the format \"CN=Some User,OU=Users,DC=example,DC=com\" but may also be " @@ -2814,27 +2971,27 @@ msgid "" "user account we will use to login to query LDAP for other user information." msgstr "" -#: sso/conf.py:209 +#: awx/sso/conf.py:209 msgid "LDAP Bind Password" msgstr "" -#: sso/conf.py:210 +#: awx/sso/conf.py:210 msgid "Password used to bind LDAP user account." msgstr "" -#: sso/conf.py:221 +#: awx/sso/conf.py:221 msgid "LDAP Start TLS" msgstr "" -#: sso/conf.py:222 +#: awx/sso/conf.py:222 msgid "Whether to enable TLS when the LDAP connection is not using SSL." msgstr "" -#: sso/conf.py:232 +#: awx/sso/conf.py:232 msgid "LDAP Connection Options" msgstr "" -#: sso/conf.py:233 +#: awx/sso/conf.py:233 msgid "" "Additional options to set for the LDAP connection. LDAP referrals are " "disabled by default (to prevent certain LDAP queries from hanging with AD). " @@ -2843,11 +3000,11 @@ msgid "" "values that can be set." msgstr "" -#: sso/conf.py:251 +#: awx/sso/conf.py:251 msgid "LDAP User Search" msgstr "" -#: sso/conf.py:252 +#: awx/sso/conf.py:252 msgid "" "LDAP search query to find users. Any user that matches the given pattern " "will be able to login to Tower. The user should also be mapped into an " @@ -2856,11 +3013,11 @@ msgid "" "possible. See python-ldap documentation as linked at the top of this section." msgstr "" -#: sso/conf.py:274 +#: awx/sso/conf.py:274 msgid "LDAP User DN Template" msgstr "" -#: sso/conf.py:275 +#: awx/sso/conf.py:275 msgid "" "Alternative to user search, if user DNs are all of the same format. This " "approach will be more efficient for user lookups than searching if it is " @@ -2868,11 +3025,11 @@ msgid "" "will be used instead of AUTH_LDAP_USER_SEARCH." msgstr "" -#: sso/conf.py:290 +#: awx/sso/conf.py:290 msgid "LDAP User Attribute Map" msgstr "" -#: sso/conf.py:291 +#: awx/sso/conf.py:291 msgid "" "Mapping of LDAP user schema to Tower API user attributes (key is user " "attribute name, value is LDAP attribute name). The default setting is valid " @@ -2880,54 +3037,54 @@ msgid "" "change the values (not the keys) of the dictionary/hash-table." msgstr "" -#: sso/conf.py:310 +#: awx/sso/conf.py:310 msgid "LDAP Group Search" msgstr "" -#: sso/conf.py:311 +#: awx/sso/conf.py:311 msgid "" "Users in Tower are mapped to organizations based on their membership in LDAP " "groups. This setting defines the LDAP search query to find groups. Note that " "this, unlike the user search above, does not support LDAPSearchUnion." msgstr "" -#: sso/conf.py:328 +#: awx/sso/conf.py:328 msgid "LDAP Group Type" msgstr "" -#: sso/conf.py:329 +#: awx/sso/conf.py:329 msgid "" "The group type may need to be changed based on the type of the LDAP server. " "Values are listed at: http://pythonhosted.org/django-auth-ldap/groups." "html#types-of-groups" msgstr "" -#: sso/conf.py:344 +#: awx/sso/conf.py:344 msgid "LDAP Require Group" msgstr "" -#: sso/conf.py:345 +#: awx/sso/conf.py:345 msgid "" "Group DN required to login. If specified, user must be a member of this " "group to login via LDAP. If not set, everyone in LDAP that matches the user " "search will be able to login via Tower. Only one require group is supported." msgstr "" -#: sso/conf.py:361 +#: awx/sso/conf.py:361 msgid "LDAP Deny Group" msgstr "" -#: sso/conf.py:362 +#: awx/sso/conf.py:362 msgid "" "Group DN denied from login. If specified, user will not be allowed to login " "if a member of this group. Only one deny group is supported." msgstr "" -#: sso/conf.py:375 +#: awx/sso/conf.py:375 msgid "LDAP User Flags By Group" msgstr "" -#: sso/conf.py:376 +#: awx/sso/conf.py:376 msgid "" "User profile flags updated from group membership (key is user attribute " "name, value is group DN). These are boolean fields that are matched based " @@ -2936,11 +3093,11 @@ msgid "" "false at login time based on current LDAP settings." msgstr "" -#: sso/conf.py:394 +#: awx/sso/conf.py:394 msgid "LDAP Organization Map" msgstr "" -#: sso/conf.py:395 +#: awx/sso/conf.py:395 msgid "" "Mapping between organization admins/users and LDAP groups. This controls " "what users are placed into what Tower organizations relative to their LDAP " @@ -2967,11 +3124,11 @@ msgid "" "remove_admins." msgstr "" -#: sso/conf.py:443 +#: awx/sso/conf.py:443 msgid "LDAP Team Map" msgstr "" -#: sso/conf.py:444 +#: awx/sso/conf.py:444 msgid "" "Mapping between team members (users) and LDAP groups. Keys are team names " "(will be created if not present). Values are dictionaries of options for " @@ -2990,87 +3147,88 @@ msgid "" "of the given groups will be removed from the team." msgstr "" -#: sso/conf.py:487 +#: awx/sso/conf.py:487 msgid "RADIUS Server" msgstr "" -#: sso/conf.py:488 +#: awx/sso/conf.py:488 msgid "" "Hostname/IP of RADIUS server. RADIUS authentication will be disabled if this " "setting is empty." msgstr "" -#: sso/conf.py:490 sso/conf.py:504 sso/conf.py:516 +#: awx/sso/conf.py:490 awx/sso/conf.py:504 awx/sso/conf.py:516 msgid "RADIUS" msgstr "" -#: sso/conf.py:502 +#: awx/sso/conf.py:502 msgid "RADIUS Port" msgstr "" -#: sso/conf.py:503 +#: awx/sso/conf.py:503 msgid "Port of RADIUS server." msgstr "" -#: sso/conf.py:514 +#: awx/sso/conf.py:514 msgid "RADIUS Secret" msgstr "" -#: sso/conf.py:515 +#: awx/sso/conf.py:515 msgid "Shared secret for authenticating to RADIUS server." msgstr "" -#: sso/conf.py:531 +#: awx/sso/conf.py:531 msgid "Google OAuth2 Callback URL" msgstr "" -#: sso/conf.py:532 +#: awx/sso/conf.py:532 msgid "" "Create a project at https://console.developers.google.com/ to obtain an " "OAuth2 key and secret for a web application. Ensure that the Google+ API is " "enabled. Provide this URL as the callback URL for your application." msgstr "" -#: sso/conf.py:536 sso/conf.py:547 sso/conf.py:558 sso/conf.py:571 -#: sso/conf.py:585 sso/conf.py:597 sso/conf.py:609 +#: awx/sso/conf.py:536 awx/sso/conf.py:547 awx/sso/conf.py:558 +#: awx/sso/conf.py:571 awx/sso/conf.py:585 awx/sso/conf.py:597 +#: awx/sso/conf.py:609 msgid "Google OAuth2" msgstr "" -#: sso/conf.py:545 +#: awx/sso/conf.py:545 msgid "Google OAuth2 Key" msgstr "" -#: sso/conf.py:546 +#: awx/sso/conf.py:546 msgid "" "The OAuth2 key from your web application at https://console.developers." "google.com/." msgstr "" -#: sso/conf.py:556 +#: awx/sso/conf.py:556 msgid "Google OAuth2 Secret" msgstr "" -#: sso/conf.py:557 +#: awx/sso/conf.py:557 msgid "" "The OAuth2 secret from your web application at https://console.developers." "google.com/." msgstr "" -#: sso/conf.py:568 +#: awx/sso/conf.py:568 msgid "Google OAuth2 Whitelisted Domains" msgstr "" -#: sso/conf.py:569 +#: awx/sso/conf.py:569 msgid "" "Update this setting to restrict the domains who are allowed to login using " "Google OAuth2." msgstr "" -#: sso/conf.py:580 +#: awx/sso/conf.py:580 msgid "Google OAuth2 Extra Arguments" msgstr "" -#: sso/conf.py:581 +#: awx/sso/conf.py:581 msgid "" "Extra arguments for Google OAuth2 login. When only allowing a single domain " "to authenticate, set to `{\"hd\": \"yourdomain.com\"}` and Google will not " @@ -3078,60 +3236,60 @@ msgid "" "Google accounts." msgstr "" -#: sso/conf.py:595 +#: awx/sso/conf.py:595 msgid "Google OAuth2 Organization Map" msgstr "" -#: sso/conf.py:607 +#: awx/sso/conf.py:607 msgid "Google OAuth2 Team Map" msgstr "" -#: sso/conf.py:623 +#: awx/sso/conf.py:623 msgid "GitHub OAuth2 Callback URL" msgstr "" -#: sso/conf.py:624 +#: awx/sso/conf.py:624 msgid "" "Create a developer application at https://github.com/settings/developers to " "obtain an OAuth2 key (Client ID) and secret (Client Secret). Provide this " "URL as the callback URL for your application." msgstr "" -#: sso/conf.py:628 sso/conf.py:639 sso/conf.py:649 sso/conf.py:661 -#: sso/conf.py:673 +#: awx/sso/conf.py:628 awx/sso/conf.py:639 awx/sso/conf.py:649 +#: awx/sso/conf.py:661 awx/sso/conf.py:673 msgid "GitHub OAuth2" msgstr "" -#: sso/conf.py:637 +#: awx/sso/conf.py:637 msgid "GitHub OAuth2 Key" msgstr "" -#: sso/conf.py:638 +#: awx/sso/conf.py:638 msgid "The OAuth2 key (Client ID) from your GitHub developer application." msgstr "" -#: sso/conf.py:647 +#: awx/sso/conf.py:647 msgid "GitHub OAuth2 Secret" msgstr "" -#: sso/conf.py:648 +#: awx/sso/conf.py:648 msgid "" "The OAuth2 secret (Client Secret) from your GitHub developer application." msgstr "" -#: sso/conf.py:659 +#: awx/sso/conf.py:659 msgid "GitHub OAuth2 Organization Map" msgstr "" -#: sso/conf.py:671 +#: awx/sso/conf.py:671 msgid "GitHub OAuth2 Team Map" msgstr "" -#: sso/conf.py:687 +#: awx/sso/conf.py:687 msgid "GitHub Organization OAuth2 Callback URL" msgstr "" -#: sso/conf.py:688 sso/conf.py:763 +#: awx/sso/conf.py:688 awx/sso/conf.py:763 msgid "" "Create an organization-owned application at https://github.com/organizations/" "/settings/applications and obtain an OAuth2 key (Client ID) and " @@ -3139,86 +3297,86 @@ msgid "" "application." msgstr "" -#: sso/conf.py:692 sso/conf.py:703 sso/conf.py:713 sso/conf.py:725 -#: sso/conf.py:736 sso/conf.py:748 +#: awx/sso/conf.py:692 awx/sso/conf.py:703 awx/sso/conf.py:713 +#: awx/sso/conf.py:725 awx/sso/conf.py:736 awx/sso/conf.py:748 msgid "GitHub Organization OAuth2" msgstr "" -#: sso/conf.py:701 +#: awx/sso/conf.py:701 msgid "GitHub Organization OAuth2 Key" msgstr "" -#: sso/conf.py:702 sso/conf.py:777 +#: awx/sso/conf.py:702 awx/sso/conf.py:777 msgid "The OAuth2 key (Client ID) from your GitHub organization application." msgstr "" -#: sso/conf.py:711 +#: awx/sso/conf.py:711 msgid "GitHub Organization OAuth2 Secret" msgstr "" -#: sso/conf.py:712 sso/conf.py:787 +#: awx/sso/conf.py:712 awx/sso/conf.py:787 msgid "" "The OAuth2 secret (Client Secret) from your GitHub organization application." msgstr "" -#: sso/conf.py:722 +#: awx/sso/conf.py:722 msgid "GitHub Organization Name" msgstr "" -#: sso/conf.py:723 +#: awx/sso/conf.py:723 msgid "" "The name of your GitHub organization, as used in your organization's URL: " "https://github.com//." msgstr "" -#: sso/conf.py:734 +#: awx/sso/conf.py:734 msgid "GitHub Organization OAuth2 Organization Map" msgstr "" -#: sso/conf.py:746 +#: awx/sso/conf.py:746 msgid "GitHub Organization OAuth2 Team Map" msgstr "" -#: sso/conf.py:762 +#: awx/sso/conf.py:762 msgid "GitHub Team OAuth2 Callback URL" msgstr "" -#: sso/conf.py:767 sso/conf.py:778 sso/conf.py:788 sso/conf.py:800 -#: sso/conf.py:811 sso/conf.py:823 +#: awx/sso/conf.py:767 awx/sso/conf.py:778 awx/sso/conf.py:788 +#: awx/sso/conf.py:800 awx/sso/conf.py:811 awx/sso/conf.py:823 msgid "GitHub Team OAuth2" msgstr "" -#: sso/conf.py:776 +#: awx/sso/conf.py:776 msgid "GitHub Team OAuth2 Key" msgstr "" -#: sso/conf.py:786 +#: awx/sso/conf.py:786 msgid "GitHub Team OAuth2 Secret" msgstr "" -#: sso/conf.py:797 +#: awx/sso/conf.py:797 msgid "GitHub Team ID" msgstr "" -#: sso/conf.py:798 +#: awx/sso/conf.py:798 msgid "" "Find the numeric team ID using the Github API: http://fabian-kostadinov." "github.io/2015/01/16/how-to-find-a-github-team-id/." msgstr "" -#: sso/conf.py:809 +#: awx/sso/conf.py:809 msgid "GitHub Team OAuth2 Organization Map" msgstr "" -#: sso/conf.py:821 +#: awx/sso/conf.py:821 msgid "GitHub Team OAuth2 Team Map" msgstr "" -#: sso/conf.py:837 +#: awx/sso/conf.py:837 msgid "Azure AD OAuth2 Callback URL" msgstr "" -#: sso/conf.py:838 +#: awx/sso/conf.py:838 msgid "" "Register an Azure AD application as described by https://msdn.microsoft.com/" "en-us/library/azure/dn132599.aspx and obtain an OAuth2 key (Client ID) and " @@ -3226,117 +3384,118 @@ msgid "" "application." msgstr "" -#: sso/conf.py:842 sso/conf.py:853 sso/conf.py:863 sso/conf.py:875 -#: sso/conf.py:887 +#: awx/sso/conf.py:842 awx/sso/conf.py:853 awx/sso/conf.py:863 +#: awx/sso/conf.py:875 awx/sso/conf.py:887 msgid "Azure AD OAuth2" msgstr "" -#: sso/conf.py:851 +#: awx/sso/conf.py:851 msgid "Azure AD OAuth2 Key" msgstr "" -#: sso/conf.py:852 +#: awx/sso/conf.py:852 msgid "The OAuth2 key (Client ID) from your Azure AD application." msgstr "" -#: sso/conf.py:861 +#: awx/sso/conf.py:861 msgid "Azure AD OAuth2 Secret" msgstr "" -#: sso/conf.py:862 +#: awx/sso/conf.py:862 msgid "The OAuth2 secret (Client Secret) from your Azure AD application." msgstr "" -#: sso/conf.py:873 +#: awx/sso/conf.py:873 msgid "Azure AD OAuth2 Organization Map" msgstr "" -#: sso/conf.py:885 +#: awx/sso/conf.py:885 msgid "Azure AD OAuth2 Team Map" msgstr "" -#: sso/conf.py:906 +#: awx/sso/conf.py:906 msgid "SAML Service Provider Callback URL" msgstr "" -#: sso/conf.py:907 +#: awx/sso/conf.py:907 msgid "" "Register Tower as a service provider (SP) with each identity provider (IdP) " "you have configured. Provide your SP Entity ID and this callback URL for " "your application." msgstr "" -#: sso/conf.py:910 sso/conf.py:924 sso/conf.py:937 sso/conf.py:951 -#: sso/conf.py:965 sso/conf.py:983 sso/conf.py:1005 sso/conf.py:1024 -#: sso/conf.py:1044 sso/conf.py:1078 sso/conf.py:1091 +#: awx/sso/conf.py:910 awx/sso/conf.py:924 awx/sso/conf.py:937 +#: awx/sso/conf.py:951 awx/sso/conf.py:965 awx/sso/conf.py:983 +#: awx/sso/conf.py:1005 awx/sso/conf.py:1024 awx/sso/conf.py:1044 +#: awx/sso/conf.py:1078 awx/sso/conf.py:1091 msgid "SAML" msgstr "" -#: sso/conf.py:921 +#: awx/sso/conf.py:921 msgid "SAML Service Provider Metadata URL" msgstr "" -#: sso/conf.py:922 +#: awx/sso/conf.py:922 msgid "" "If your identity provider (IdP) allows uploading an XML metadata file, you " "can download one from this URL." msgstr "" -#: sso/conf.py:934 +#: awx/sso/conf.py:934 msgid "SAML Service Provider Entity ID" msgstr "" -#: sso/conf.py:935 +#: awx/sso/conf.py:935 msgid "" "The application-defined unique identifier used as the audience of the SAML " "service provider (SP) configuration." msgstr "" -#: sso/conf.py:948 +#: awx/sso/conf.py:948 msgid "SAML Service Provider Public Certificate" msgstr "" -#: sso/conf.py:949 +#: awx/sso/conf.py:949 msgid "" "Create a keypair for Tower to use as a service provider (SP) and include the " "certificate content here." msgstr "" -#: sso/conf.py:962 +#: awx/sso/conf.py:962 msgid "SAML Service Provider Private Key" msgstr "" -#: sso/conf.py:963 +#: awx/sso/conf.py:963 msgid "" "Create a keypair for Tower to use as a service provider (SP) and include the " "private key content here." msgstr "" -#: sso/conf.py:981 +#: awx/sso/conf.py:981 msgid "SAML Service Provider Organization Info" msgstr "" -#: sso/conf.py:982 +#: awx/sso/conf.py:982 msgid "Configure this setting with information about your app." msgstr "" -#: sso/conf.py:1003 +#: awx/sso/conf.py:1003 msgid "SAML Service Provider Technical Contact" msgstr "" -#: sso/conf.py:1004 sso/conf.py:1023 +#: awx/sso/conf.py:1004 awx/sso/conf.py:1023 msgid "Configure this setting with your contact information." msgstr "" -#: sso/conf.py:1022 +#: awx/sso/conf.py:1022 msgid "SAML Service Provider Support Contact" msgstr "" -#: sso/conf.py:1037 +#: awx/sso/conf.py:1037 msgid "SAML Enabled Identity Providers" msgstr "" -#: sso/conf.py:1038 +#: awx/sso/conf.py:1038 msgid "" "Configure the Entity ID, SSO URL and certificate for each identity provider " "(IdP) in use. Multiple SAML IdPs are supported. Some IdPs may provide user " @@ -3345,217 +3504,218 @@ msgid "" "Attribute names may be overridden for each IdP." msgstr "" -#: sso/conf.py:1076 +#: awx/sso/conf.py:1076 msgid "SAML Organization Map" msgstr "" -#: sso/conf.py:1089 +#: awx/sso/conf.py:1089 msgid "SAML Team Map" msgstr "" -#: sso/fields.py:123 +#: awx/sso/fields.py:123 msgid "Invalid connection option(s): {invalid_options}." msgstr "" -#: sso/fields.py:194 +#: awx/sso/fields.py:194 msgid "Base" msgstr "" -#: sso/fields.py:195 +#: awx/sso/fields.py:195 msgid "One Level" msgstr "" -#: sso/fields.py:196 +#: awx/sso/fields.py:196 msgid "Subtree" msgstr "" -#: sso/fields.py:214 +#: awx/sso/fields.py:214 msgid "Expected a list of three items but got {length} instead." msgstr "" -#: sso/fields.py:215 +#: awx/sso/fields.py:215 msgid "Expected an instance of LDAPSearch but got {input_type} instead." msgstr "" -#: sso/fields.py:251 +#: awx/sso/fields.py:251 msgid "" "Expected an instance of LDAPSearch or LDAPSearchUnion but got {input_type} " "instead." msgstr "" -#: sso/fields.py:278 +#: awx/sso/fields.py:278 msgid "Invalid user attribute(s): {invalid_attrs}." msgstr "" -#: sso/fields.py:295 +#: awx/sso/fields.py:295 msgid "Expected an instance of LDAPGroupType but got {input_type} instead." msgstr "" -#: sso/fields.py:323 +#: awx/sso/fields.py:323 msgid "Invalid user flag: \"{invalid_flag}\"." msgstr "" -#: sso/fields.py:339 sso/fields.py:506 +#: awx/sso/fields.py:339 awx/sso/fields.py:506 msgid "" "Expected None, True, False, a string or list of strings but got {input_type} " "instead." msgstr "" -#: sso/fields.py:375 +#: awx/sso/fields.py:375 msgid "Missing key(s): {missing_keys}." msgstr "" -#: sso/fields.py:376 +#: awx/sso/fields.py:376 msgid "Invalid key(s): {invalid_keys}." msgstr "" -#: sso/fields.py:425 sso/fields.py:542 +#: awx/sso/fields.py:425 awx/sso/fields.py:542 msgid "Invalid key(s) for organization map: {invalid_keys}." msgstr "" -#: sso/fields.py:443 +#: awx/sso/fields.py:443 msgid "Missing required key for team map: {invalid_keys}." msgstr "" -#: sso/fields.py:444 sso/fields.py:561 +#: awx/sso/fields.py:444 awx/sso/fields.py:561 msgid "Invalid key(s) for team map: {invalid_keys}." msgstr "" -#: sso/fields.py:560 +#: awx/sso/fields.py:560 msgid "Missing required key for team map: {missing_keys}." msgstr "" -#: sso/fields.py:578 +#: awx/sso/fields.py:578 msgid "Missing required key(s) for org info record: {missing_keys}." msgstr "" -#: sso/fields.py:591 +#: awx/sso/fields.py:591 msgid "Invalid language code(s) for org info: {invalid_lang_codes}." msgstr "" -#: sso/fields.py:610 +#: awx/sso/fields.py:610 msgid "Missing required key(s) for contact: {missing_keys}." msgstr "" -#: sso/fields.py:622 +#: awx/sso/fields.py:622 msgid "Missing required key(s) for IdP: {missing_keys}." msgstr "" -#: sso/pipeline.py:24 +#: awx/sso/pipeline.py:24 msgid "An account cannot be found for {0}" msgstr "" -#: sso/pipeline.py:30 +#: awx/sso/pipeline.py:30 msgid "Your account is inactive" msgstr "" -#: sso/validators.py:19 sso/validators.py:44 +#: awx/sso/validators.py:19 awx/sso/validators.py:44 #, python-format msgid "DN must include \"%%(user)s\" placeholder for username: %s" msgstr "" -#: sso/validators.py:26 +#: awx/sso/validators.py:26 #, python-format msgid "Invalid DN: %s" msgstr "" -#: sso/validators.py:56 +#: awx/sso/validators.py:56 #, python-format msgid "Invalid filter: %s" msgstr "" -#: templates/error.html:4 ui/templates/ui/index.html:8 +#: awx/templates/error.html:4 awx/ui/templates/ui/index.html:8 msgid "Ansible Tower" msgstr "" -#: templates/rest_framework/api.html:39 +#: awx/templates/rest_framework/api.html:39 msgid "Ansible Tower API Guide" msgstr "" -#: templates/rest_framework/api.html:40 +#: awx/templates/rest_framework/api.html:40 msgid "Back to Ansible Tower" msgstr "" -#: templates/rest_framework/api.html:41 +#: awx/templates/rest_framework/api.html:41 msgid "Resize" msgstr "" -#: templates/rest_framework/base.html:78 templates/rest_framework/base.html:92 +#: awx/templates/rest_framework/base.html:78 +#: awx/templates/rest_framework/base.html:92 #, python-format msgid "Make a GET request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:80 +#: awx/templates/rest_framework/base.html:80 msgid "Specify a format for the GET request" msgstr "" -#: templates/rest_framework/base.html:86 +#: awx/templates/rest_framework/base.html:86 #, python-format msgid "" "Make a GET request on the %(name)s resource with the format set to `" "%(format)s`" msgstr "" -#: templates/rest_framework/base.html:100 +#: awx/templates/rest_framework/base.html:100 #, python-format msgid "Make an OPTIONS request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:106 +#: awx/templates/rest_framework/base.html:106 #, python-format msgid "Make a DELETE request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:113 +#: awx/templates/rest_framework/base.html:113 msgid "Filters" msgstr "" -#: templates/rest_framework/base.html:172 -#: templates/rest_framework/base.html:186 +#: awx/templates/rest_framework/base.html:172 +#: awx/templates/rest_framework/base.html:186 #, python-format msgid "Make a POST request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:216 -#: templates/rest_framework/base.html:230 +#: awx/templates/rest_framework/base.html:216 +#: awx/templates/rest_framework/base.html:230 #, python-format msgid "Make a PUT request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:233 +#: awx/templates/rest_framework/base.html:233 #, python-format msgid "Make a PATCH request on the %(name)s resource" msgstr "" -#: ui/apps.py:9 ui/conf.py:22 ui/conf.py:38 ui/conf.py:53 +#: awx/ui/apps.py:9 awx/ui/conf.py:22 awx/ui/conf.py:38 awx/ui/conf.py:53 msgid "UI" msgstr "" -#: ui/conf.py:16 +#: awx/ui/conf.py:16 msgid "Off" msgstr "" -#: ui/conf.py:17 +#: awx/ui/conf.py:17 msgid "Anonymous" msgstr "" -#: ui/conf.py:18 +#: awx/ui/conf.py:18 msgid "Detailed" msgstr "" -#: ui/conf.py:20 +#: awx/ui/conf.py:20 msgid "Analytics Tracking State" msgstr "" -#: ui/conf.py:21 +#: awx/ui/conf.py:21 msgid "Enable or Disable Analytics Tracking." msgstr "" -#: ui/conf.py:31 +#: awx/ui/conf.py:31 msgid "Custom Login Info" msgstr "" -#: ui/conf.py:32 +#: awx/ui/conf.py:32 msgid "" "If needed, you can add specific information (such as a legal notice or a " "disclaimer) to a text box in the login modal using this setting. Any content " @@ -3564,42 +3724,42 @@ msgid "" "(paragraphs) must be escaped as `\\n` within the block of text." msgstr "" -#: ui/conf.py:48 +#: awx/ui/conf.py:48 msgid "Custom Logo" msgstr "" -#: ui/conf.py:49 +#: awx/ui/conf.py:49 msgid "" "To set up a custom logo, provide a file that you create. For the custom logo " "to look its best, use a `.png` file with a transparent background. GIF, PNG " "and JPEG formats are supported." msgstr "" -#: ui/fields.py:29 +#: awx/ui/fields.py:29 msgid "" "Invalid format for custom logo. Must be a data URL with a base64-encoded " "GIF, PNG or JPEG image." msgstr "" -#: ui/fields.py:30 +#: awx/ui/fields.py:30 msgid "Invalid base64-encoded data in data URL." msgstr "" -#: ui/templates/ui/index.html:49 +#: awx/ui/templates/ui/index.html:49 msgid "" "Your session will expire in 60 seconds, would you like to continue?" msgstr "" -#: ui/templates/ui/index.html:64 +#: awx/ui/templates/ui/index.html:64 msgid "CANCEL" msgstr "" -#: ui/templates/ui/index.html:116 +#: awx/ui/templates/ui/index.html:116 msgid "Set how many days of data should be retained." msgstr "" -#: ui/templates/ui/index.html:122 +#: awx/ui/templates/ui/index.html:122 msgid "" "Please enter an integer that is not " @@ -3608,7 +3768,7 @@ msgid "" "span>." msgstr "" -#: ui/templates/ui/index.html:127 +#: awx/ui/templates/ui/index.html:127 msgid "" "For facts collected older than the time period specified, save one fact scan " "(snapshot) per time window (frequency). For example, facts older than 30 " @@ -3620,11 +3780,11 @@ msgid "" "
" msgstr "" -#: ui/templates/ui/index.html:136 +#: awx/ui/templates/ui/index.html:136 msgid "Select a time period after which to remove old facts" msgstr "" -#: ui/templates/ui/index.html:150 +#: awx/ui/templates/ui/index.html:150 msgid "" "Please enter an integer " @@ -3633,11 +3793,11 @@ msgid "" "that is lower than 9999." msgstr "" -#: ui/templates/ui/index.html:155 +#: awx/ui/templates/ui/index.html:155 msgid "Select a frequency for snapshot retention" msgstr "" -#: ui/templates/ui/index.html:169 +#: awx/ui/templates/ui/index.html:169 msgid "" "Please enter an integer." msgstr "" -#: ui/templates/ui/index.html:175 +#: awx/ui/templates/ui/index.html:175 msgid "working..." msgstr "" diff --git a/awx/locale/en-us/LC_MESSAGES/django.po b/awx/locale/en-us/LC_MESSAGES/django.po index 99aef1ef20..56771e6f92 100644 --- a/awx/locale/en-us/LC_MESSAGES/django.po +++ b/awx/locale/en-us/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-12-14 21:27+0000\n" +"POT-Creation-Date: 2017-01-31 20:58+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,1039 +17,1090 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: api/authentication.py:67 +#: awx/api/authentication.py:67 msgid "Invalid token header. No credentials provided." msgstr "" -#: api/authentication.py:70 +#: awx/api/authentication.py:70 msgid "Invalid token header. Token string should not contain spaces." msgstr "" -#: api/authentication.py:105 +#: awx/api/authentication.py:105 msgid "User inactive or deleted" msgstr "" -#: api/authentication.py:161 +#: awx/api/authentication.py:161 msgid "Invalid task token" msgstr "" -#: api/conf.py:12 +#: awx/api/conf.py:12 msgid "Idle Time Force Log Out" msgstr "" -#: api/conf.py:13 +#: awx/api/conf.py:13 msgid "" "Number of seconds that a user is inactive before they will need to login " "again." msgstr "" -#: api/conf.py:14 api/conf.py:24 api/conf.py:33 sso/conf.py:124 -#: sso/conf.py:135 sso/conf.py:147 sso/conf.py:162 +#: awx/api/conf.py:14 awx/api/conf.py:24 awx/api/conf.py:33 +#: awx/sso/conf.py:124 awx/sso/conf.py:135 awx/sso/conf.py:147 +#: awx/sso/conf.py:162 msgid "Authentication" msgstr "" -#: api/conf.py:22 +#: awx/api/conf.py:22 msgid "Maximum number of simultaneous logins" msgstr "" -#: api/conf.py:23 +#: awx/api/conf.py:23 msgid "" "Maximum number of simultaneous logins a user may have. To disable enter -1." msgstr "" -#: api/conf.py:31 +#: awx/api/conf.py:31 msgid "Enable HTTP Basic Auth" msgstr "" -#: api/conf.py:32 +#: awx/api/conf.py:32 msgid "Enable HTTP Basic Auth for the API Browser." msgstr "" -#: api/generics.py:446 +#: awx/api/generics.py:466 msgid "\"id\" is required to disassociate" msgstr "" -#: api/metadata.py:50 +#: awx/api/metadata.py:50 msgid "Database ID for this {}." msgstr "" -#: api/metadata.py:51 +#: awx/api/metadata.py:51 msgid "Name of this {}." msgstr "" -#: api/metadata.py:52 +#: awx/api/metadata.py:52 msgid "Optional description of this {}." msgstr "" -#: api/metadata.py:53 +#: awx/api/metadata.py:53 msgid "Data type for this {}." msgstr "" -#: api/metadata.py:54 +#: awx/api/metadata.py:54 msgid "URL for this {}." msgstr "" -#: api/metadata.py:55 +#: awx/api/metadata.py:55 msgid "Data structure with URLs of related resources." msgstr "" -#: api/metadata.py:56 +#: awx/api/metadata.py:56 msgid "Data structure with name/description for related resources." msgstr "" -#: api/metadata.py:57 +#: awx/api/metadata.py:57 msgid "Timestamp when this {} was created." msgstr "" -#: api/metadata.py:58 +#: awx/api/metadata.py:58 msgid "Timestamp when this {} was last modified." msgstr "" -#: api/parsers.py:31 +#: awx/api/parsers.py:31 #, python-format msgid "JSON parse error - %s" msgstr "" -#: api/serializers.py:248 +#: awx/api/serializers.py:250 msgid "Playbook Run" msgstr "" -#: api/serializers.py:249 +#: awx/api/serializers.py:251 msgid "Command" msgstr "" -#: api/serializers.py:250 +#: awx/api/serializers.py:252 msgid "SCM Update" msgstr "" -#: api/serializers.py:251 +#: awx/api/serializers.py:253 msgid "Inventory Sync" msgstr "" -#: api/serializers.py:252 +#: awx/api/serializers.py:254 msgid "Management Job" msgstr "" -#: api/serializers.py:253 +#: awx/api/serializers.py:255 msgid "Workflow Job" msgstr "" -#: api/serializers.py:655 api/serializers.py:713 api/views.py:3914 +#: awx/api/serializers.py:256 +msgid "Workflow Template" +msgstr "" + +#: awx/api/serializers.py:658 awx/api/serializers.py:716 awx/api/views.py:3819 #, python-format msgid "" "Standard Output too large to display (%(text_size)d bytes), only download " "supported for sizes over %(supported_size)d bytes" msgstr "" -#: api/serializers.py:728 +#: awx/api/serializers.py:731 msgid "Write-only field used to change the password." msgstr "" -#: api/serializers.py:730 +#: awx/api/serializers.py:733 msgid "Set if the account is managed by an external service" msgstr "" -#: api/serializers.py:754 +#: awx/api/serializers.py:757 msgid "Password required for new User." msgstr "" -#: api/serializers.py:838 +#: awx/api/serializers.py:841 #, python-format msgid "Unable to change %s on user managed by LDAP." msgstr "" -#: api/serializers.py:990 +#: awx/api/serializers.py:1002 msgid "Organization is missing" msgstr "" -#: api/serializers.py:996 +#: awx/api/serializers.py:1006 +msgid "Update options must be set to false for manual projects." +msgstr "" + +#: awx/api/serializers.py:1012 msgid "Array of playbooks available within this project." msgstr "" -#: api/serializers.py:1178 +#: awx/api/serializers.py:1194 #, python-format msgid "Invalid port specification: %s" msgstr "" -#: api/serializers.py:1206 main/validators.py:192 +#: awx/api/serializers.py:1222 awx/main/validators.py:193 msgid "Must be valid JSON or YAML." msgstr "" -#: api/serializers.py:1263 +#: awx/api/serializers.py:1279 msgid "Invalid group name." msgstr "" -#: api/serializers.py:1338 +#: awx/api/serializers.py:1354 msgid "" "Script must begin with a hashbang sequence: i.e.... #!/usr/bin/env python" msgstr "" -#: api/serializers.py:1391 +#: awx/api/serializers.py:1407 msgid "If 'source' is 'custom', 'source_script' must be provided." msgstr "" -#: api/serializers.py:1395 +#: awx/api/serializers.py:1411 msgid "" "The 'source_script' does not belong to the same organization as the " "inventory." msgstr "" -#: api/serializers.py:1397 +#: awx/api/serializers.py:1413 msgid "'source_script' doesn't exist." msgstr "" -#: api/serializers.py:1756 +#: awx/api/serializers.py:1772 msgid "" "Write-only field used to add user to owner role. If provided, do not give " "either team or organization. Only valid for creation." msgstr "" -#: api/serializers.py:1761 +#: awx/api/serializers.py:1777 msgid "" "Write-only field used to add team to owner role. If provided, do not give " "either user or organization. Only valid for creation." msgstr "" -#: api/serializers.py:1766 +#: awx/api/serializers.py:1782 msgid "" "Inherit permissions from organization roles. If provided on creation, do not " "give either user or team." msgstr "" -#: api/serializers.py:1782 +#: awx/api/serializers.py:1798 msgid "Missing 'user', 'team', or 'organization'." msgstr "" -#: api/serializers.py:1795 +#: awx/api/serializers.py:1811 msgid "" "Credential organization must be set and match before assigning to a team" msgstr "" -#: api/serializers.py:1887 +#: awx/api/serializers.py:1903 msgid "This field is required." msgstr "" -#: api/serializers.py:1889 api/serializers.py:1891 +#: awx/api/serializers.py:1905 awx/api/serializers.py:1907 msgid "Playbook not found for project." msgstr "" -#: api/serializers.py:1893 +#: awx/api/serializers.py:1909 msgid "Must select playbook for project." msgstr "" -#: api/serializers.py:1957 main/models/jobs.py:280 +#: awx/api/serializers.py:1975 +msgid "Must either set a default value or ask to prompt on launch." +msgstr "" + +#: awx/api/serializers.py:1978 awx/main/models/jobs.py:278 msgid "Scan jobs must be assigned a fixed inventory." msgstr "" -#: api/serializers.py:1959 main/models/jobs.py:283 +#: awx/api/serializers.py:1980 awx/main/models/jobs.py:281 msgid "Job types 'run' and 'check' must have assigned a project." msgstr "" -#: api/serializers.py:1962 +#: awx/api/serializers.py:1987 msgid "Survey Enabled cannot be used with scan jobs." msgstr "" -#: api/serializers.py:2024 +#: awx/api/serializers.py:2047 msgid "Invalid job template." msgstr "" -#: api/serializers.py:2109 +#: awx/api/serializers.py:2132 msgid "Credential not found or deleted." msgstr "" -#: api/serializers.py:2111 +#: awx/api/serializers.py:2134 msgid "Job Template Project is missing or undefined." msgstr "" -#: api/serializers.py:2113 +#: awx/api/serializers.py:2136 msgid "Job Template Inventory is missing or undefined." msgstr "" -#: api/serializers.py:2398 +#: awx/api/serializers.py:2421 #, python-format msgid "%(job_type)s is not a valid job type. The choices are %(choices)s." msgstr "" -#: api/serializers.py:2403 +#: awx/api/serializers.py:2426 msgid "Workflow job template is missing during creation." msgstr "" -#: api/serializers.py:2408 +#: awx/api/serializers.py:2431 #, python-format msgid "Cannot nest a %s inside a WorkflowJobTemplate" msgstr "" -#: api/serializers.py:2646 +#: awx/api/serializers.py:2669 #, python-format msgid "Job Template '%s' is missing or undefined." msgstr "" -#: api/serializers.py:2672 +#: awx/api/serializers.py:2695 msgid "Must be a valid JSON or YAML dictionary." msgstr "" -#: api/serializers.py:2817 +#: awx/api/serializers.py:2837 msgid "" "Missing required fields for Notification Configuration: notification_type" msgstr "" -#: api/serializers.py:2840 +#: awx/api/serializers.py:2860 msgid "No values specified for field '{}'" msgstr "" -#: api/serializers.py:2845 +#: awx/api/serializers.py:2865 msgid "Missing required fields for Notification Configuration: {}." msgstr "" -#: api/serializers.py:2848 +#: awx/api/serializers.py:2868 msgid "Configuration field '{}' incorrect type, expected {}." msgstr "" -#: api/serializers.py:2901 +#: awx/api/serializers.py:2921 msgid "Inventory Source must be a cloud resource." msgstr "" -#: api/serializers.py:2903 +#: awx/api/serializers.py:2923 msgid "Manual Project can not have a schedule set." msgstr "" -#: api/serializers.py:2925 +#: awx/api/serializers.py:2945 msgid "DTSTART required in rrule. Value should match: DTSTART:YYYYMMDDTHHMMSSZ" msgstr "" -#: api/serializers.py:2927 +#: awx/api/serializers.py:2947 msgid "Multiple DTSTART is not supported." msgstr "" -#: api/serializers.py:2929 +#: awx/api/serializers.py:2949 msgid "RRULE require in rrule." msgstr "" -#: api/serializers.py:2931 +#: awx/api/serializers.py:2951 msgid "Multiple RRULE is not supported." msgstr "" -#: api/serializers.py:2933 +#: awx/api/serializers.py:2953 msgid "INTERVAL required in rrule." msgstr "" -#: api/serializers.py:2935 +#: awx/api/serializers.py:2955 msgid "TZID is not supported." msgstr "" -#: api/serializers.py:2937 +#: awx/api/serializers.py:2957 msgid "SECONDLY is not supported." msgstr "" -#: api/serializers.py:2939 +#: awx/api/serializers.py:2959 msgid "Multiple BYMONTHDAYs not supported." msgstr "" -#: api/serializers.py:2941 +#: awx/api/serializers.py:2961 msgid "Multiple BYMONTHs not supported." msgstr "" -#: api/serializers.py:2943 +#: awx/api/serializers.py:2963 msgid "BYDAY with numeric prefix not supported." msgstr "" -#: api/serializers.py:2945 +#: awx/api/serializers.py:2965 msgid "BYYEARDAY not supported." msgstr "" -#: api/serializers.py:2947 +#: awx/api/serializers.py:2967 msgid "BYWEEKNO not supported." msgstr "" -#: api/serializers.py:2951 +#: awx/api/serializers.py:2971 msgid "COUNT > 999 is unsupported." msgstr "" -#: api/serializers.py:2955 +#: awx/api/serializers.py:2975 msgid "rrule parsing failed validation." msgstr "" -#: api/serializers.py:2973 +#: awx/api/serializers.py:2997 msgid "" "A summary of the new and changed values when an object is created, updated, " "or deleted" msgstr "" -#: api/serializers.py:2975 +#: awx/api/serializers.py:2999 msgid "" "For create, update, and delete events this is the object type that was " "affected. For associate and disassociate events this is the object type " "associated or disassociated with object2." msgstr "" -#: api/serializers.py:2978 +#: awx/api/serializers.py:3002 msgid "" "Unpopulated for create, update, and delete events. For associate and " "disassociate events this is the object type that object1 is being associated " "with." msgstr "" -#: api/serializers.py:2981 +#: awx/api/serializers.py:3005 msgid "The action taken with respect to the given object(s)." msgstr "" -#: api/serializers.py:3081 +#: awx/api/serializers.py:3112 msgid "Unable to login with provided credentials." msgstr "" -#: api/serializers.py:3083 +#: awx/api/serializers.py:3114 msgid "Must include \"username\" and \"password\"." msgstr "" -#: api/views.py:96 +#: awx/api/views.py:101 msgid "Your license does not allow use of the activity stream." msgstr "" -#: api/views.py:106 +#: awx/api/views.py:111 msgid "Your license does not permit use of system tracking." msgstr "" -#: api/views.py:116 +#: awx/api/views.py:121 msgid "Your license does not allow use of workflows." msgstr "" -#: api/views.py:124 templates/rest_framework/api.html:28 +#: awx/api/views.py:129 awx/templates/rest_framework/api.html:28 msgid "REST API" msgstr "" -#: api/views.py:131 templates/rest_framework/api.html:4 +#: awx/api/views.py:136 awx/templates/rest_framework/api.html:4 msgid "Ansible Tower REST API" msgstr "" -#: api/views.py:147 +#: awx/api/views.py:152 msgid "Version 1" msgstr "" -#: api/views.py:198 +#: awx/api/views.py:203 msgid "Ping" msgstr "" -#: api/views.py:227 conf/apps.py:12 +#: awx/api/views.py:232 awx/conf/apps.py:12 msgid "Configuration" msgstr "" -#: api/views.py:280 +#: awx/api/views.py:285 msgid "Invalid license data" msgstr "" -#: api/views.py:282 +#: awx/api/views.py:287 msgid "Missing 'eula_accepted' property" msgstr "" -#: api/views.py:286 +#: awx/api/views.py:291 msgid "'eula_accepted' value is invalid" msgstr "" -#: api/views.py:289 +#: awx/api/views.py:294 msgid "'eula_accepted' must be True" msgstr "" -#: api/views.py:296 +#: awx/api/views.py:301 msgid "Invalid JSON" msgstr "" -#: api/views.py:304 +#: awx/api/views.py:309 msgid "Invalid License" msgstr "" -#: api/views.py:314 +#: awx/api/views.py:319 msgid "Invalid license" msgstr "" -#: api/views.py:322 +#: awx/api/views.py:327 #, python-format msgid "Failed to remove license (%s)" msgstr "" -#: api/views.py:327 +#: awx/api/views.py:332 msgid "Dashboard" msgstr "" -#: api/views.py:433 +#: awx/api/views.py:438 msgid "Dashboard Jobs Graphs" msgstr "" -#: api/views.py:469 +#: awx/api/views.py:474 #, python-format msgid "Unknown period \"%s\"" msgstr "" -#: api/views.py:483 +#: awx/api/views.py:488 msgid "Schedules" msgstr "" -#: api/views.py:502 +#: awx/api/views.py:507 msgid "Schedule Jobs List" msgstr "" -#: api/views.py:711 +#: awx/api/views.py:717 msgid "Your Tower license only permits a single organization to exist." msgstr "" -#: api/views.py:932 api/views.py:1284 +#: awx/api/views.py:942 awx/api/views.py:1301 msgid "Role 'id' field is missing." msgstr "" -#: api/views.py:938 api/views.py:4182 +#: awx/api/views.py:948 awx/api/views.py:4106 msgid "You cannot assign an Organization role as a child role for a Team." msgstr "" -#: api/views.py:942 api/views.py:4196 +#: awx/api/views.py:952 awx/api/views.py:4120 msgid "You cannot grant system-level permissions to a team." msgstr "" -#: api/views.py:949 api/views.py:4188 +#: awx/api/views.py:959 awx/api/views.py:4112 msgid "" "You cannot grant credential access to a team when the Organization field " "isn't set, or belongs to a different organization" msgstr "" -#: api/views.py:1039 +#: awx/api/views.py:1049 msgid "Cannot delete project." msgstr "" -#: api/views.py:1068 +#: awx/api/views.py:1078 msgid "Project Schedules" msgstr "" -#: api/views.py:1168 api/views.py:2252 api/views.py:3225 +#: awx/api/views.py:1182 awx/api/views.py:2273 awx/api/views.py:3286 msgid "Cannot delete job resource when associated workflow job is running." msgstr "" -#: api/views.py:1244 +#: awx/api/views.py:1259 msgid "Me" msgstr "" -#: api/views.py:1288 api/views.py:4137 +#: awx/api/views.py:1305 awx/api/views.py:4061 msgid "You may not perform any action with your own admin_role." msgstr "" -#: api/views.py:1294 api/views.py:4141 +#: awx/api/views.py:1311 awx/api/views.py:4065 msgid "You may not change the membership of a users admin_role" msgstr "" -#: api/views.py:1299 api/views.py:4146 +#: awx/api/views.py:1316 awx/api/views.py:4070 msgid "" "You cannot grant credential access to a user not in the credentials' " "organization" msgstr "" -#: api/views.py:1303 api/views.py:4150 +#: awx/api/views.py:1320 awx/api/views.py:4074 msgid "You cannot grant private credential access to another user" msgstr "" -#: api/views.py:1401 +#: awx/api/views.py:1418 #, python-format msgid "Cannot change %s." msgstr "" -#: api/views.py:1407 +#: awx/api/views.py:1424 msgid "Cannot delete user." msgstr "" -#: api/views.py:1553 +#: awx/api/views.py:1572 msgid "Cannot delete inventory script." msgstr "" -#: api/views.py:1788 +#: awx/api/views.py:1808 msgid "Fact not found." msgstr "" -#: api/views.py:2108 +#: awx/api/views.py:2128 msgid "Inventory Source List" msgstr "" -#: api/views.py:2136 +#: awx/api/views.py:2156 msgid "Cannot delete inventory source." msgstr "" -#: api/views.py:2144 +#: awx/api/views.py:2164 msgid "Inventory Source Schedules" msgstr "" -#: api/views.py:2173 +#: awx/api/views.py:2194 msgid "Notification Templates can only be assigned when source is one of {}." msgstr "" -#: api/views.py:2380 +#: awx/api/views.py:2405 msgid "Job Template Schedules" msgstr "" -#: api/views.py:2399 api/views.py:2409 +#: awx/api/views.py:2425 awx/api/views.py:2441 msgid "Your license does not allow adding surveys." msgstr "" -#: api/views.py:2416 +#: awx/api/views.py:2448 msgid "'name' missing from survey spec." msgstr "" -#: api/views.py:2418 +#: awx/api/views.py:2450 msgid "'description' missing from survey spec." msgstr "" -#: api/views.py:2420 +#: awx/api/views.py:2452 msgid "'spec' missing from survey spec." msgstr "" -#: api/views.py:2422 +#: awx/api/views.py:2454 msgid "'spec' must be a list of items." msgstr "" -#: api/views.py:2424 +#: awx/api/views.py:2456 msgid "'spec' doesn't contain any items." msgstr "" -#: api/views.py:2429 +#: awx/api/views.py:2462 #, python-format msgid "Survey question %s is not a json object." msgstr "" -#: api/views.py:2431 +#: awx/api/views.py:2464 #, python-format msgid "'type' missing from survey question %s." msgstr "" -#: api/views.py:2433 +#: awx/api/views.py:2466 #, python-format msgid "'question_name' missing from survey question %s." msgstr "" -#: api/views.py:2435 +#: awx/api/views.py:2468 #, python-format msgid "'variable' missing from survey question %s." msgstr "" -#: api/views.py:2437 +#: awx/api/views.py:2470 #, python-format msgid "'variable' '%(item)s' duplicated in survey question %(survey)s." msgstr "" -#: api/views.py:2442 +#: awx/api/views.py:2475 #, python-format msgid "'required' missing from survey question %s." msgstr "" -#: api/views.py:2641 +#: awx/api/views.py:2686 msgid "No matching host could be found!" msgstr "" -#: api/views.py:2644 +#: awx/api/views.py:2689 msgid "Multiple hosts matched the request!" msgstr "" -#: api/views.py:2649 +#: awx/api/views.py:2694 msgid "Cannot start automatically, user input required!" msgstr "" -#: api/views.py:2656 +#: awx/api/views.py:2701 msgid "Host callback job already pending." msgstr "" -#: api/views.py:2669 +#: awx/api/views.py:2714 msgid "Error starting job!" msgstr "" -#: api/views.py:2995 +#: awx/api/views.py:3043 msgid "Workflow Job Template Schedules" msgstr "" -#: api/views.py:3131 api/views.py:3853 +#: awx/api/views.py:3185 awx/api/views.py:3728 msgid "Superuser privileges needed." msgstr "" -#: api/views.py:3161 +#: awx/api/views.py:3217 msgid "System Job Template Schedules" msgstr "" -#: api/views.py:3344 +#: awx/api/views.py:3409 msgid "Job Host Summaries List" msgstr "" -#: api/views.py:3386 +#: awx/api/views.py:3451 msgid "Job Event Children List" msgstr "" -#: api/views.py:3395 +#: awx/api/views.py:3460 msgid "Job Event Hosts List" msgstr "" -#: api/views.py:3404 +#: awx/api/views.py:3469 msgid "Job Events List" msgstr "" -#: api/views.py:3436 -msgid "Job Plays List" -msgstr "" - -#: api/views.py:3513 -msgid "Job Play Tasks List" -msgstr "" - -#: api/views.py:3529 -msgid "Job not found." -msgstr "" - -#: api/views.py:3533 -msgid "'event_id' not provided." -msgstr "" - -#: api/views.py:3537 -msgid "Parent event not found." -msgstr "" - -#: api/views.py:3809 +#: awx/api/views.py:3682 msgid "Ad Hoc Command Events List" msgstr "" -#: api/views.py:3963 +#: awx/api/views.py:3874 +msgid "Error generating stdout download file: {}" +msgstr "" + +#: awx/api/views.py:3887 #, python-format msgid "Error generating stdout download file: %s" msgstr "" -#: api/views.py:4009 +#: awx/api/views.py:3932 msgid "Delete not allowed while there are pending notifications" msgstr "" -#: api/views.py:4016 -msgid "NotificationTemplate Test" +#: awx/api/views.py:3939 +msgid "Notification Template Test" msgstr "" -#: api/views.py:4131 +#: awx/api/views.py:4055 msgid "User 'id' field is missing." msgstr "" -#: api/views.py:4174 +#: awx/api/views.py:4098 msgid "Team 'id' field is missing." msgstr "" -#: conf/conf.py:20 +#: awx/conf/conf.py:20 msgid "Bud Frogs" msgstr "" -#: conf/conf.py:21 +#: awx/conf/conf.py:21 msgid "Bunny" msgstr "" -#: conf/conf.py:22 +#: awx/conf/conf.py:22 msgid "Cheese" msgstr "" -#: conf/conf.py:23 +#: awx/conf/conf.py:23 msgid "Daemon" msgstr "" -#: conf/conf.py:24 +#: awx/conf/conf.py:24 msgid "Default Cow" msgstr "" -#: conf/conf.py:25 +#: awx/conf/conf.py:25 msgid "Dragon" msgstr "" -#: conf/conf.py:26 +#: awx/conf/conf.py:26 msgid "Elephant in Snake" msgstr "" -#: conf/conf.py:27 +#: awx/conf/conf.py:27 msgid "Elephant" msgstr "" -#: conf/conf.py:28 +#: awx/conf/conf.py:28 msgid "Eyes" msgstr "" -#: conf/conf.py:29 +#: awx/conf/conf.py:29 msgid "Hello Kitty" msgstr "" -#: conf/conf.py:30 +#: awx/conf/conf.py:30 msgid "Kitty" msgstr "" -#: conf/conf.py:31 +#: awx/conf/conf.py:31 msgid "Luke Koala" msgstr "" -#: conf/conf.py:32 +#: awx/conf/conf.py:32 msgid "Meow" msgstr "" -#: conf/conf.py:33 +#: awx/conf/conf.py:33 msgid "Milk" msgstr "" -#: conf/conf.py:34 +#: awx/conf/conf.py:34 msgid "Moofasa" msgstr "" -#: conf/conf.py:35 +#: awx/conf/conf.py:35 msgid "Moose" msgstr "" -#: conf/conf.py:36 +#: awx/conf/conf.py:36 msgid "Ren" msgstr "" -#: conf/conf.py:37 +#: awx/conf/conf.py:37 msgid "Sheep" msgstr "" -#: conf/conf.py:38 +#: awx/conf/conf.py:38 msgid "Small Cow" msgstr "" -#: conf/conf.py:39 +#: awx/conf/conf.py:39 msgid "Stegosaurus" msgstr "" -#: conf/conf.py:40 +#: awx/conf/conf.py:40 msgid "Stimpy" msgstr "" -#: conf/conf.py:41 +#: awx/conf/conf.py:41 msgid "Super Milker" msgstr "" -#: conf/conf.py:42 +#: awx/conf/conf.py:42 msgid "Three Eyes" msgstr "" -#: conf/conf.py:43 +#: awx/conf/conf.py:43 msgid "Turkey" msgstr "" -#: conf/conf.py:44 +#: awx/conf/conf.py:44 msgid "Turtle" msgstr "" -#: conf/conf.py:45 +#: awx/conf/conf.py:45 msgid "Tux" msgstr "" -#: conf/conf.py:46 +#: awx/conf/conf.py:46 msgid "Udder" msgstr "" -#: conf/conf.py:47 +#: awx/conf/conf.py:47 msgid "Vader Koala" msgstr "" -#: conf/conf.py:48 +#: awx/conf/conf.py:48 msgid "Vader" msgstr "" -#: conf/conf.py:49 +#: awx/conf/conf.py:49 msgid "WWW" msgstr "" -#: conf/conf.py:52 +#: awx/conf/conf.py:52 msgid "Cow Selection" msgstr "" -#: conf/conf.py:53 +#: awx/conf/conf.py:53 msgid "Select which cow to use with cowsay when running jobs." msgstr "" -#: conf/conf.py:54 conf/conf.py:75 +#: awx/conf/conf.py:54 awx/conf/conf.py:75 msgid "Cows" msgstr "" -#: conf/conf.py:73 +#: awx/conf/conf.py:73 msgid "Example Read-Only Setting" msgstr "" -#: conf/conf.py:74 +#: awx/conf/conf.py:74 msgid "Example setting that cannot be changed." msgstr "" -#: conf/conf.py:93 +#: awx/conf/conf.py:93 msgid "Example Setting" msgstr "" -#: conf/conf.py:94 +#: awx/conf/conf.py:94 msgid "Example setting which can be different for each user." msgstr "" -#: conf/conf.py:95 conf/registry.py:67 conf/views.py:46 +#: awx/conf/conf.py:95 awx/conf/registry.py:76 awx/conf/views.py:46 msgid "User" msgstr "" -#: conf/fields.py:38 +#: awx/conf/fields.py:38 msgid "Enter a valid URL" msgstr "" -#: conf/license.py:19 +#: awx/conf/license.py:19 msgid "Your Tower license does not allow that." msgstr "" -#: conf/management/commands/migrate_to_database_settings.py:41 +#: awx/conf/management/commands/migrate_to_database_settings.py:41 msgid "Only show which settings would be commented/migrated." msgstr "" -#: conf/management/commands/migrate_to_database_settings.py:48 +#: awx/conf/management/commands/migrate_to_database_settings.py:48 msgid "Skip over settings that would raise an error when commenting/migrating." msgstr "" -#: conf/management/commands/migrate_to_database_settings.py:55 +#: awx/conf/management/commands/migrate_to_database_settings.py:55 msgid "Skip commenting out settings in files." msgstr "" -#: conf/management/commands/migrate_to_database_settings.py:61 +#: awx/conf/management/commands/migrate_to_database_settings.py:61 msgid "Backup existing settings files with this suffix." msgstr "" -#: conf/registry.py:55 +#: awx/conf/registry.py:64 awx/conf/tests/unit/test_registry.py:169 +#: awx/conf/tests/unit/test_registry.py:192 +#: awx/conf/tests/unit/test_registry.py:196 +#: awx/conf/tests/unit/test_registry.py:201 +#: awx/conf/tests/unit/test_registry.py:208 msgid "All" msgstr "" -#: conf/registry.py:56 +#: awx/conf/registry.py:65 awx/conf/tests/unit/test_registry.py:170 +#: awx/conf/tests/unit/test_registry.py:193 +#: awx/conf/tests/unit/test_registry.py:197 +#: awx/conf/tests/unit/test_registry.py:202 +#: awx/conf/tests/unit/test_registry.py:209 msgid "Changed" msgstr "" -#: conf/registry.py:68 +#: awx/conf/registry.py:77 msgid "User-Defaults" msgstr "" -#: conf/views.py:38 +#: awx/conf/tests/unit/test_registry.py:46 +#: awx/conf/tests/unit/test_registry.py:56 +#: awx/conf/tests/unit/test_registry.py:72 +#: awx/conf/tests/unit/test_registry.py:87 +#: awx/conf/tests/unit/test_registry.py:100 +#: awx/conf/tests/unit/test_registry.py:106 +#: awx/conf/tests/unit/test_registry.py:126 +#: awx/conf/tests/unit/test_registry.py:140 +#: awx/conf/tests/unit/test_registry.py:146 +#: awx/conf/tests/unit/test_registry.py:159 +#: awx/conf/tests/unit/test_registry.py:171 +#: awx/conf/tests/unit/test_registry.py:180 +#: awx/conf/tests/unit/test_registry.py:198 +#: awx/conf/tests/unit/test_registry.py:210 +#: awx/conf/tests/unit/test_registry.py:219 +#: awx/conf/tests/unit/test_registry.py:225 +#: awx/conf/tests/unit/test_registry.py:237 +#: awx/conf/tests/unit/test_registry.py:245 +#: awx/conf/tests/unit/test_registry.py:288 +#: awx/conf/tests/unit/test_registry.py:306 +#: awx/conf/tests/unit/test_settings.py:67 +#: awx/conf/tests/unit/test_settings.py:81 +#: awx/conf/tests/unit/test_settings.py:97 +#: awx/conf/tests/unit/test_settings.py:110 +#: awx/conf/tests/unit/test_settings.py:127 +#: awx/conf/tests/unit/test_settings.py:143 +#: awx/conf/tests/unit/test_settings.py:162 +#: awx/conf/tests/unit/test_settings.py:183 +#: awx/conf/tests/unit/test_settings.py:197 +#: awx/conf/tests/unit/test_settings.py:221 +#: awx/conf/tests/unit/test_settings.py:241 +#: awx/conf/tests/unit/test_settings.py:258 awx/main/conf.py:19 +#: awx/main/conf.py:29 awx/main/conf.py:39 awx/main/conf.py:48 +#: awx/main/conf.py:60 awx/main/conf.py:78 awx/main/conf.py:103 +msgid "System" +msgstr "" + +#: awx/conf/tests/unit/test_registry.py:165 +#: awx/conf/tests/unit/test_registry.py:172 +#: awx/conf/tests/unit/test_registry.py:187 +#: awx/conf/tests/unit/test_registry.py:203 +#: awx/conf/tests/unit/test_registry.py:211 +msgid "OtherSystem" +msgstr "" + +#: awx/conf/views.py:38 msgid "Setting Categories" msgstr "" -#: conf/views.py:61 +#: awx/conf/views.py:61 msgid "Setting Detail" msgstr "" -#: main/access.py:255 +#: awx/main/access.py:255 #, python-format msgid "Bad data found in related field %s." msgstr "" -#: main/access.py:296 +#: awx/main/access.py:296 msgid "License is missing." msgstr "" -#: main/access.py:298 +#: awx/main/access.py:298 msgid "License has expired." msgstr "" -#: main/access.py:303 +#: awx/main/access.py:306 #, python-format msgid "License count of %s instances has been reached." msgstr "" -#: main/access.py:305 +#: awx/main/access.py:308 #, python-format msgid "License count of %s instances has been exceeded." msgstr "" -#: main/access.py:307 +#: awx/main/access.py:310 msgid "Host count exceeds available instances." msgstr "" -#: main/access.py:311 +#: awx/main/access.py:314 #, python-format msgid "Feature %s is not enabled in the active license." msgstr "" -#: main/access.py:313 +#: awx/main/access.py:316 msgid "Features not found in active license." msgstr "" -#: main/access.py:507 main/access.py:574 main/access.py:694 main/access.py:957 -#: main/access.py:1198 main/access.py:1587 +#: awx/main/access.py:514 awx/main/access.py:581 awx/main/access.py:706 +#: awx/main/access.py:969 awx/main/access.py:1208 awx/main/access.py:1605 msgid "Resource is being used by running jobs" msgstr "" -#: main/access.py:618 +#: awx/main/access.py:625 msgid "Unable to change inventory on a host." msgstr "" -#: main/access.py:630 main/access.py:675 +#: awx/main/access.py:642 awx/main/access.py:687 msgid "Cannot associate two items from different inventories." msgstr "" -#: main/access.py:663 +#: awx/main/access.py:675 msgid "Unable to change inventory on a group." msgstr "" -#: main/access.py:877 +#: awx/main/access.py:889 msgid "Unable to change organization on a team." msgstr "" -#: main/access.py:890 +#: awx/main/access.py:902 msgid "The {} role cannot be assigned to a team" msgstr "" -#: main/access.py:892 +#: awx/main/access.py:904 msgid "The admin_role for a User cannot be assigned to a team" msgstr "" -#: main/apps.py:9 +#: awx/main/access.py:1678 +msgid "" +"You do not have permission to the workflow job resources required for " +"relaunch." +msgstr "" + +#: awx/main/apps.py:9 msgid "Main" msgstr "" -#: main/conf.py:17 +#: awx/main/conf.py:17 msgid "Enable Activity Stream" msgstr "" -#: main/conf.py:18 +#: awx/main/conf.py:18 msgid "Enable capturing activity for the Tower activity stream." msgstr "" -#: main/conf.py:19 main/conf.py:29 main/conf.py:39 main/conf.py:48 -#: main/conf.py:60 main/conf.py:78 main/conf.py:103 -msgid "System" -msgstr "" - -#: main/conf.py:27 +#: awx/main/conf.py:27 msgid "Enable Activity Stream for Inventory Sync" msgstr "" -#: main/conf.py:28 +#: awx/main/conf.py:28 msgid "" "Enable capturing activity for the Tower activity stream when running " "inventory sync." msgstr "" -#: main/conf.py:37 +#: awx/main/conf.py:37 msgid "All Users Visible to Organization Admins" msgstr "" -#: main/conf.py:38 +#: awx/main/conf.py:38 msgid "" "Controls whether any Organization Admin can view all users, even those not " "associated with their Organization." msgstr "" -#: main/conf.py:46 +#: awx/main/conf.py:46 msgid "Enable Tower Administrator Alerts" msgstr "" -#: main/conf.py:47 +#: awx/main/conf.py:47 msgid "" "Allow Tower to email Admin users for system events that may require " "attention." msgstr "" -#: main/conf.py:57 +#: awx/main/conf.py:57 msgid "Base URL of the Tower host" msgstr "" -#: main/conf.py:58 +#: awx/main/conf.py:58 msgid "" "This setting is used by services like notifications to render a valid url to " "the Tower host." msgstr "" -#: main/conf.py:67 +#: awx/main/conf.py:67 msgid "Remote Host Headers" msgstr "" -#: main/conf.py:68 +#: awx/main/conf.py:68 msgid "" "HTTP headers and meta keys to search to determine remote host name or IP. " "Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if " @@ -1064,1615 +1115,1735 @@ msgid "" "REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']" msgstr "" -#: main/conf.py:99 +#: awx/main/conf.py:99 msgid "Tower License" msgstr "" -#: main/conf.py:100 +#: awx/main/conf.py:100 msgid "" "The license controls which features and functionality are enabled in Tower. " "Use /api/v1/config/ to update or change the license." msgstr "" -#: main/conf.py:110 +#: awx/main/conf.py:110 msgid "Ansible Modules Allowed for Ad Hoc Jobs" msgstr "" -#: main/conf.py:111 +#: awx/main/conf.py:111 msgid "List of modules allowed to be used by ad-hoc jobs." msgstr "" -#: main/conf.py:112 main/conf.py:121 main/conf.py:130 main/conf.py:139 -#: main/conf.py:148 main/conf.py:158 main/conf.py:168 main/conf.py:178 -#: main/conf.py:187 main/conf.py:199 main/conf.py:211 main/conf.py:223 +#: awx/main/conf.py:112 awx/main/conf.py:121 awx/main/conf.py:130 +#: awx/main/conf.py:140 awx/main/conf.py:150 awx/main/conf.py:160 +#: awx/main/conf.py:170 awx/main/conf.py:180 awx/main/conf.py:190 +#: awx/main/conf.py:202 awx/main/conf.py:214 awx/main/conf.py:226 msgid "Jobs" msgstr "" -#: main/conf.py:119 +#: awx/main/conf.py:119 msgid "Enable job isolation" msgstr "" -#: main/conf.py:120 +#: awx/main/conf.py:120 msgid "" "Isolates an Ansible job from protected parts of the Tower system to prevent " "exposing sensitive information." msgstr "" -#: main/conf.py:128 +#: awx/main/conf.py:128 msgid "Job isolation execution path" msgstr "" -#: main/conf.py:129 +#: awx/main/conf.py:129 msgid "" "Create temporary working directories for isolated jobs in this location." msgstr "" -#: main/conf.py:137 +#: awx/main/conf.py:138 msgid "Paths to hide from isolated jobs" msgstr "" -#: main/conf.py:138 +#: awx/main/conf.py:139 msgid "Additional paths to hide from isolated processes." msgstr "" -#: main/conf.py:146 +#: awx/main/conf.py:148 msgid "Paths to expose to isolated jobs" msgstr "" -#: main/conf.py:147 +#: awx/main/conf.py:149 msgid "" "Whitelist of paths that would otherwise be hidden to expose to isolated jobs." msgstr "" -#: main/conf.py:156 +#: awx/main/conf.py:158 msgid "Standard Output Maximum Display Size" msgstr "" -#: main/conf.py:157 +#: awx/main/conf.py:159 msgid "" "Maximum Size of Standard Output in bytes to display before requiring the " "output be downloaded." msgstr "" -#: main/conf.py:166 +#: awx/main/conf.py:168 msgid "Job Event Standard Output Maximum Display Size" msgstr "" -#: main/conf.py:167 +#: awx/main/conf.py:169 msgid "" "Maximum Size of Standard Output in bytes to display for a single job or ad " "hoc command event. `stdout` will end with `…` when truncated." msgstr "" -#: main/conf.py:176 +#: awx/main/conf.py:178 msgid "Maximum Scheduled Jobs" msgstr "" -#: main/conf.py:177 +#: awx/main/conf.py:179 msgid "" "Maximum number of the same job template that can be waiting to run when " "launching from a schedule before no more are created." msgstr "" -#: main/conf.py:185 +#: awx/main/conf.py:188 msgid "Ansible Callback Plugins" msgstr "" -#: main/conf.py:186 +#: awx/main/conf.py:189 msgid "" "List of paths to search for extra callback plugins to be used when running " "jobs." msgstr "" -#: main/conf.py:196 +#: awx/main/conf.py:199 msgid "Default Job Timeout" msgstr "" -#: main/conf.py:197 +#: awx/main/conf.py:200 msgid "" "Maximum time to allow jobs to run. Use value of 0 to indicate that no " "timeout should be imposed. A timeout set on an individual job template will " "override this." msgstr "" -#: main/conf.py:208 +#: awx/main/conf.py:211 msgid "Default Inventory Update Timeout" msgstr "" -#: main/conf.py:209 +#: awx/main/conf.py:212 msgid "" "Maximum time to allow inventory updates to run. Use value of 0 to indicate " "that no timeout should be imposed. A timeout set on an individual inventory " "source will override this." msgstr "" -#: main/conf.py:220 +#: awx/main/conf.py:223 msgid "Default Project Update Timeout" msgstr "" -#: main/conf.py:221 +#: awx/main/conf.py:224 msgid "" "Maximum time to allow project updates to run. Use value of 0 to indicate " "that no timeout should be imposed. A timeout set on an individual project " "will override this." msgstr "" -#: main/conf.py:231 -msgid "Logging Aggregator Receiving Host" +#: awx/main/conf.py:234 +msgid "Logging Aggregator" msgstr "" -#: main/conf.py:232 -msgid "External host maintain a log collector to send logs to" +#: awx/main/conf.py:235 +msgid "Hostname/IP where external logs will be sent to." msgstr "" -#: main/conf.py:233 main/conf.py:242 main/conf.py:252 main/conf.py:261 -#: main/conf.py:271 main/conf.py:286 main/conf.py:297 main/conf.py:306 +#: awx/main/conf.py:236 awx/main/conf.py:245 awx/main/conf.py:255 +#: awx/main/conf.py:264 awx/main/conf.py:274 awx/main/conf.py:288 +#: awx/main/conf.py:300 awx/main/conf.py:309 msgid "Logging" msgstr "" -#: main/conf.py:240 -msgid "Logging Aggregator Receiving Port" +#: awx/main/conf.py:243 +msgid "Logging Aggregator Port" msgstr "" -#: main/conf.py:241 -msgid "Port that the log collector is listening on" +#: awx/main/conf.py:244 +msgid "Port on Logging Aggregator to send logs to (if required)." msgstr "" -#: main/conf.py:250 -msgid "Logging Aggregator Type: Logstash, Loggly, Datadog, etc" +#: awx/main/conf.py:253 +msgid "Logging Aggregator Type" msgstr "" -#: main/conf.py:251 -msgid "The type of log aggregator service to format messages for" +#: awx/main/conf.py:254 +msgid "Format messages for the chosen log aggregator." msgstr "" -#: main/conf.py:259 -msgid "Logging Aggregator Username to Authenticate With" +#: awx/main/conf.py:262 +msgid "Logging Aggregator Username" msgstr "" -#: main/conf.py:260 -msgid "Username for Logstash or others (basic auth)" +#: awx/main/conf.py:263 +msgid "Username for external log aggregator (if required)." msgstr "" -#: main/conf.py:269 -msgid "Logging Aggregator Password to Authenticate With" +#: awx/main/conf.py:272 +msgid "Logging Aggregator Password/Token" msgstr "" -#: main/conf.py:270 -msgid "Password for Logstash or others (basic auth)" +#: awx/main/conf.py:273 +msgid "" +"Password or authentication token for external log aggregator (if required)." msgstr "" -#: main/conf.py:278 +#: awx/main/conf.py:281 msgid "Loggers to send data to the log aggregator from" msgstr "" -#: main/conf.py:279 +#: awx/main/conf.py:282 msgid "" "List of loggers that will send HTTP logs to the collector, these can include " "any or all of: \n" -"activity_stream - logs duplicate to records entered in activity stream\n" +"awx - Tower service logs\n" +"activity_stream - activity stream records\n" "job_events - callback data from Ansible job events\n" -"system_tracking - data generated from scan jobs\n" -"Sending generic Tower logs must be configured through local_settings." -"pyinstead of this mechanism." +"system_tracking - facts gathered from scan jobs." msgstr "" -#: main/conf.py:293 +#: awx/main/conf.py:295 +msgid "Log System Tracking Facts Individually" +msgstr "" + +#: awx/main/conf.py:296 msgid "" -"Flag denoting to send individual messages for each fact in system tracking" +"If set, system tracking facts will be sent for each package, service, " +"orother item found in a scan, allowing for greater search query granularity. " +"If unset, facts will be sent as a single dictionary, allowing for greater " +"efficiency in fact processing." msgstr "" -#: main/conf.py:294 -msgid "" -"If not set, the data from system tracking will be sent inside of a single " -"dictionary, but if set, separate requests will be sent for each package, " -"service, etc. that is found in the scan." +#: awx/main/conf.py:307 +msgid "Enable External Logging" msgstr "" -#: main/conf.py:304 -msgid "Flag denoting whether to use the external logger system" +#: awx/main/conf.py:308 +msgid "Enable sending logs to external log aggregator." msgstr "" -#: main/conf.py:305 -msgid "" -"If not set, only normal settings data will be used to configure loggers." -msgstr "" - -#: main/models/activity_stream.py:22 +#: awx/main/models/activity_stream.py:22 msgid "Entity Created" msgstr "" -#: main/models/activity_stream.py:23 +#: awx/main/models/activity_stream.py:23 msgid "Entity Updated" msgstr "" -#: main/models/activity_stream.py:24 +#: awx/main/models/activity_stream.py:24 msgid "Entity Deleted" msgstr "" -#: main/models/activity_stream.py:25 +#: awx/main/models/activity_stream.py:25 msgid "Entity Associated with another Entity" msgstr "" -#: main/models/activity_stream.py:26 +#: awx/main/models/activity_stream.py:26 msgid "Entity was Disassociated with another Entity" msgstr "" -#: main/models/ad_hoc_commands.py:96 +#: awx/main/models/ad_hoc_commands.py:96 msgid "No valid inventory." msgstr "" -#: main/models/ad_hoc_commands.py:103 main/models/jobs.py:163 +#: awx/main/models/ad_hoc_commands.py:103 awx/main/models/jobs.py:161 msgid "You must provide a machine / SSH credential." msgstr "" -#: main/models/ad_hoc_commands.py:114 main/models/ad_hoc_commands.py:122 +#: awx/main/models/ad_hoc_commands.py:114 +#: awx/main/models/ad_hoc_commands.py:122 msgid "Invalid type for ad hoc command" msgstr "" -#: main/models/ad_hoc_commands.py:117 +#: awx/main/models/ad_hoc_commands.py:117 msgid "Unsupported module for ad hoc commands." msgstr "" -#: main/models/ad_hoc_commands.py:125 +#: awx/main/models/ad_hoc_commands.py:125 #, python-format msgid "No argument passed to %s module." msgstr "" -#: main/models/ad_hoc_commands.py:220 main/models/jobs.py:767 +#: awx/main/models/ad_hoc_commands.py:222 awx/main/models/jobs.py:766 msgid "Host Failed" msgstr "" -#: main/models/ad_hoc_commands.py:221 main/models/jobs.py:768 +#: awx/main/models/ad_hoc_commands.py:223 awx/main/models/jobs.py:767 msgid "Host OK" msgstr "" -#: main/models/ad_hoc_commands.py:222 main/models/jobs.py:771 +#: awx/main/models/ad_hoc_commands.py:224 awx/main/models/jobs.py:770 msgid "Host Unreachable" msgstr "" -#: main/models/ad_hoc_commands.py:227 main/models/jobs.py:770 +#: awx/main/models/ad_hoc_commands.py:229 awx/main/models/jobs.py:769 msgid "Host Skipped" msgstr "" -#: main/models/ad_hoc_commands.py:237 main/models/jobs.py:798 +#: awx/main/models/ad_hoc_commands.py:239 awx/main/models/jobs.py:797 msgid "Debug" msgstr "" -#: main/models/ad_hoc_commands.py:238 main/models/jobs.py:799 +#: awx/main/models/ad_hoc_commands.py:240 awx/main/models/jobs.py:798 msgid "Verbose" msgstr "" -#: main/models/ad_hoc_commands.py:239 main/models/jobs.py:800 +#: awx/main/models/ad_hoc_commands.py:241 awx/main/models/jobs.py:799 msgid "Deprecated" msgstr "" -#: main/models/ad_hoc_commands.py:240 main/models/jobs.py:801 +#: awx/main/models/ad_hoc_commands.py:242 awx/main/models/jobs.py:800 msgid "Warning" msgstr "" -#: main/models/ad_hoc_commands.py:241 main/models/jobs.py:802 +#: awx/main/models/ad_hoc_commands.py:243 awx/main/models/jobs.py:801 msgid "System Warning" msgstr "" -#: main/models/ad_hoc_commands.py:242 main/models/jobs.py:803 -#: main/models/unified_jobs.py:62 +#: awx/main/models/ad_hoc_commands.py:244 awx/main/models/jobs.py:802 +#: awx/main/models/unified_jobs.py:64 msgid "Error" msgstr "" -#: main/models/base.py:45 main/models/base.py:51 main/models/base.py:56 +#: awx/main/models/base.py:45 awx/main/models/base.py:51 +#: awx/main/models/base.py:56 msgid "Run" msgstr "" -#: main/models/base.py:46 main/models/base.py:52 main/models/base.py:57 +#: awx/main/models/base.py:46 awx/main/models/base.py:52 +#: awx/main/models/base.py:57 msgid "Check" msgstr "" -#: main/models/base.py:47 +#: awx/main/models/base.py:47 msgid "Scan" msgstr "" -#: main/models/base.py:61 +#: awx/main/models/base.py:61 msgid "Read Inventory" msgstr "" -#: main/models/base.py:62 +#: awx/main/models/base.py:62 msgid "Edit Inventory" msgstr "" -#: main/models/base.py:63 +#: awx/main/models/base.py:63 msgid "Administrate Inventory" msgstr "" -#: main/models/base.py:64 +#: awx/main/models/base.py:64 msgid "Deploy To Inventory" msgstr "" -#: main/models/base.py:65 +#: awx/main/models/base.py:65 msgid "Deploy To Inventory (Dry Run)" msgstr "" -#: main/models/base.py:66 +#: awx/main/models/base.py:66 msgid "Scan an Inventory" msgstr "" -#: main/models/base.py:67 +#: awx/main/models/base.py:67 msgid "Create a Job Template" msgstr "" -#: main/models/credential.py:33 +#: awx/main/models/credential.py:33 msgid "Machine" msgstr "" -#: main/models/credential.py:34 +#: awx/main/models/credential.py:34 msgid "Network" msgstr "" -#: main/models/credential.py:35 +#: awx/main/models/credential.py:35 msgid "Source Control" msgstr "" -#: main/models/credential.py:36 +#: awx/main/models/credential.py:36 msgid "Amazon Web Services" msgstr "" -#: main/models/credential.py:37 +#: awx/main/models/credential.py:37 msgid "Rackspace" msgstr "" -#: main/models/credential.py:38 main/models/inventory.py:713 +#: awx/main/models/credential.py:38 awx/main/models/inventory.py:713 msgid "VMware vCenter" msgstr "" -#: main/models/credential.py:39 main/models/inventory.py:714 +#: awx/main/models/credential.py:39 awx/main/models/inventory.py:714 msgid "Red Hat Satellite 6" msgstr "" -#: main/models/credential.py:40 main/models/inventory.py:715 +#: awx/main/models/credential.py:40 awx/main/models/inventory.py:715 msgid "Red Hat CloudForms" msgstr "" -#: main/models/credential.py:41 main/models/inventory.py:710 +#: awx/main/models/credential.py:41 awx/main/models/inventory.py:710 msgid "Google Compute Engine" msgstr "" -#: main/models/credential.py:42 main/models/inventory.py:711 +#: awx/main/models/credential.py:42 awx/main/models/inventory.py:711 msgid "Microsoft Azure Classic (deprecated)" msgstr "" -#: main/models/credential.py:43 main/models/inventory.py:712 +#: awx/main/models/credential.py:43 awx/main/models/inventory.py:712 msgid "Microsoft Azure Resource Manager" msgstr "" -#: main/models/credential.py:44 main/models/inventory.py:716 +#: awx/main/models/credential.py:44 awx/main/models/inventory.py:716 msgid "OpenStack" msgstr "" -#: main/models/credential.py:48 +#: awx/main/models/credential.py:48 msgid "None" msgstr "" -#: main/models/credential.py:49 +#: awx/main/models/credential.py:49 msgid "Sudo" msgstr "" -#: main/models/credential.py:50 +#: awx/main/models/credential.py:50 msgid "Su" msgstr "" -#: main/models/credential.py:51 +#: awx/main/models/credential.py:51 msgid "Pbrun" msgstr "" -#: main/models/credential.py:52 +#: awx/main/models/credential.py:52 msgid "Pfexec" msgstr "" -#: main/models/credential.py:101 +#: awx/main/models/credential.py:53 +msgid "DZDO" +msgstr "" + +#: awx/main/models/credential.py:54 +msgid "Pmrun" +msgstr "" + +#: awx/main/models/credential.py:103 msgid "Host" msgstr "" -#: main/models/credential.py:102 +#: awx/main/models/credential.py:104 msgid "The hostname or IP address to use." msgstr "" -#: main/models/credential.py:108 +#: awx/main/models/credential.py:110 msgid "Username" msgstr "" -#: main/models/credential.py:109 +#: awx/main/models/credential.py:111 msgid "Username for this credential." msgstr "" -#: main/models/credential.py:115 +#: awx/main/models/credential.py:117 msgid "Password" msgstr "" -#: main/models/credential.py:116 +#: awx/main/models/credential.py:118 msgid "" "Password for this credential (or \"ASK\" to prompt the user for machine " "credentials)." msgstr "" -#: main/models/credential.py:123 +#: awx/main/models/credential.py:125 msgid "Security Token" msgstr "" -#: main/models/credential.py:124 +#: awx/main/models/credential.py:126 msgid "Security Token for this credential" msgstr "" -#: main/models/credential.py:130 +#: awx/main/models/credential.py:132 msgid "Project" msgstr "" -#: main/models/credential.py:131 +#: awx/main/models/credential.py:133 msgid "The identifier for the project." msgstr "" -#: main/models/credential.py:137 +#: awx/main/models/credential.py:139 msgid "Domain" msgstr "" -#: main/models/credential.py:138 +#: awx/main/models/credential.py:140 msgid "The identifier for the domain." msgstr "" -#: main/models/credential.py:143 +#: awx/main/models/credential.py:145 msgid "SSH private key" msgstr "" -#: main/models/credential.py:144 +#: awx/main/models/credential.py:146 msgid "RSA or DSA private key to be used instead of password." msgstr "" -#: main/models/credential.py:150 +#: awx/main/models/credential.py:152 msgid "SSH key unlock" msgstr "" -#: main/models/credential.py:151 +#: awx/main/models/credential.py:153 msgid "" "Passphrase to unlock SSH private key if encrypted (or \"ASK\" to prompt the " "user for machine credentials)." msgstr "" -#: main/models/credential.py:159 +#: awx/main/models/credential.py:161 msgid "Privilege escalation method." msgstr "" -#: main/models/credential.py:165 +#: awx/main/models/credential.py:167 msgid "Privilege escalation username." msgstr "" -#: main/models/credential.py:171 +#: awx/main/models/credential.py:173 msgid "Password for privilege escalation method." msgstr "" -#: main/models/credential.py:177 +#: awx/main/models/credential.py:179 msgid "Vault password (or \"ASK\" to prompt the user)." msgstr "" -#: main/models/credential.py:181 +#: awx/main/models/credential.py:183 msgid "Whether to use the authorize mechanism." msgstr "" -#: main/models/credential.py:187 +#: awx/main/models/credential.py:189 msgid "Password used by the authorize mechanism." msgstr "" -#: main/models/credential.py:193 +#: awx/main/models/credential.py:195 msgid "Client Id or Application Id for the credential" msgstr "" -#: main/models/credential.py:199 +#: awx/main/models/credential.py:201 msgid "Secret Token for this credential" msgstr "" -#: main/models/credential.py:205 +#: awx/main/models/credential.py:207 msgid "Subscription identifier for this credential" msgstr "" -#: main/models/credential.py:211 +#: awx/main/models/credential.py:213 msgid "Tenant identifier for this credential" msgstr "" -#: main/models/credential.py:281 +#: awx/main/models/credential.py:283 msgid "Host required for VMware credential." msgstr "" -#: main/models/credential.py:283 +#: awx/main/models/credential.py:285 msgid "Host required for OpenStack credential." msgstr "" -#: main/models/credential.py:292 +#: awx/main/models/credential.py:294 msgid "Access key required for AWS credential." msgstr "" -#: main/models/credential.py:294 +#: awx/main/models/credential.py:296 msgid "Username required for Rackspace credential." msgstr "" -#: main/models/credential.py:297 +#: awx/main/models/credential.py:299 msgid "Username required for VMware credential." msgstr "" -#: main/models/credential.py:299 +#: awx/main/models/credential.py:301 msgid "Username required for OpenStack credential." msgstr "" -#: main/models/credential.py:305 +#: awx/main/models/credential.py:307 msgid "Secret key required for AWS credential." msgstr "" -#: main/models/credential.py:307 +#: awx/main/models/credential.py:309 msgid "API key required for Rackspace credential." msgstr "" -#: main/models/credential.py:309 +#: awx/main/models/credential.py:311 msgid "Password required for VMware credential." msgstr "" -#: main/models/credential.py:311 +#: awx/main/models/credential.py:313 msgid "Password or API key required for OpenStack credential." msgstr "" -#: main/models/credential.py:317 +#: awx/main/models/credential.py:319 msgid "Project name required for OpenStack credential." msgstr "" -#: main/models/credential.py:344 +#: awx/main/models/credential.py:346 msgid "SSH key unlock must be set when SSH key is encrypted." msgstr "" -#: main/models/credential.py:350 +#: awx/main/models/credential.py:352 msgid "Credential cannot be assigned to both a user and team." msgstr "" -#: main/models/fact.py:21 +#: awx/main/models/fact.py:21 msgid "Host for the facts that the fact scan captured." msgstr "" -#: main/models/fact.py:26 +#: awx/main/models/fact.py:26 msgid "Date and time of the corresponding fact scan gathering time." msgstr "" -#: main/models/fact.py:29 +#: awx/main/models/fact.py:29 msgid "" "Arbitrary JSON structure of module facts captured at timestamp for a single " "host." msgstr "" -#: main/models/inventory.py:45 +#: awx/main/models/inventory.py:45 msgid "inventories" msgstr "" -#: main/models/inventory.py:52 +#: awx/main/models/inventory.py:52 msgid "Organization containing this inventory." msgstr "" -#: main/models/inventory.py:58 +#: awx/main/models/inventory.py:58 msgid "Inventory variables in JSON or YAML format." msgstr "" -#: main/models/inventory.py:63 +#: awx/main/models/inventory.py:63 msgid "Flag indicating whether any hosts in this inventory have failed." msgstr "" -#: main/models/inventory.py:68 +#: awx/main/models/inventory.py:68 msgid "Total number of hosts in this inventory." msgstr "" -#: main/models/inventory.py:73 +#: awx/main/models/inventory.py:73 msgid "Number of hosts in this inventory with active failures." msgstr "" -#: main/models/inventory.py:78 +#: awx/main/models/inventory.py:78 msgid "Total number of groups in this inventory." msgstr "" -#: main/models/inventory.py:83 +#: awx/main/models/inventory.py:83 msgid "Number of groups in this inventory with active failures." msgstr "" -#: main/models/inventory.py:88 +#: awx/main/models/inventory.py:88 msgid "" "Flag indicating whether this inventory has any external inventory sources." msgstr "" -#: main/models/inventory.py:93 +#: awx/main/models/inventory.py:93 msgid "" "Total number of external inventory sources configured within this inventory." msgstr "" -#: main/models/inventory.py:98 +#: awx/main/models/inventory.py:98 msgid "Number of external inventory sources in this inventory with failures." msgstr "" -#: main/models/inventory.py:339 +#: awx/main/models/inventory.py:339 msgid "Is this host online and available for running jobs?" msgstr "" -#: main/models/inventory.py:345 +#: awx/main/models/inventory.py:345 msgid "" "The value used by the remote inventory source to uniquely identify the host" msgstr "" -#: main/models/inventory.py:350 +#: awx/main/models/inventory.py:350 msgid "Host variables in JSON or YAML format." msgstr "" -#: main/models/inventory.py:372 +#: awx/main/models/inventory.py:372 msgid "Flag indicating whether the last job failed for this host." msgstr "" -#: main/models/inventory.py:377 +#: awx/main/models/inventory.py:377 msgid "" "Flag indicating whether this host was created/updated from any external " "inventory sources." msgstr "" -#: main/models/inventory.py:383 +#: awx/main/models/inventory.py:383 msgid "Inventory source(s) that created or modified this host." msgstr "" -#: main/models/inventory.py:474 +#: awx/main/models/inventory.py:474 msgid "Group variables in JSON or YAML format." msgstr "" -#: main/models/inventory.py:480 +#: awx/main/models/inventory.py:480 msgid "Hosts associated directly with this group." msgstr "" -#: main/models/inventory.py:485 +#: awx/main/models/inventory.py:485 msgid "Total number of hosts directly or indirectly in this group." msgstr "" -#: main/models/inventory.py:490 +#: awx/main/models/inventory.py:490 msgid "Flag indicating whether this group has any hosts with active failures." msgstr "" -#: main/models/inventory.py:495 +#: awx/main/models/inventory.py:495 msgid "Number of hosts in this group with active failures." msgstr "" -#: main/models/inventory.py:500 +#: awx/main/models/inventory.py:500 msgid "Total number of child groups contained within this group." msgstr "" -#: main/models/inventory.py:505 +#: awx/main/models/inventory.py:505 msgid "Number of child groups within this group that have active failures." msgstr "" -#: main/models/inventory.py:510 +#: awx/main/models/inventory.py:510 msgid "" "Flag indicating whether this group was created/updated from any external " "inventory sources." msgstr "" -#: main/models/inventory.py:516 +#: awx/main/models/inventory.py:516 msgid "Inventory source(s) that created or modified this group." msgstr "" -#: main/models/inventory.py:706 main/models/projects.py:42 -#: main/models/unified_jobs.py:386 +#: awx/main/models/inventory.py:706 awx/main/models/projects.py:42 +#: awx/main/models/unified_jobs.py:402 msgid "Manual" msgstr "" -#: main/models/inventory.py:707 +#: awx/main/models/inventory.py:707 msgid "Local File, Directory or Script" msgstr "" -#: main/models/inventory.py:708 +#: awx/main/models/inventory.py:708 msgid "Rackspace Cloud Servers" msgstr "" -#: main/models/inventory.py:709 +#: awx/main/models/inventory.py:709 msgid "Amazon EC2" msgstr "" -#: main/models/inventory.py:717 +#: awx/main/models/inventory.py:717 msgid "Custom Script" msgstr "" -#: main/models/inventory.py:828 +#: awx/main/models/inventory.py:828 msgid "Inventory source variables in YAML or JSON format." msgstr "" -#: main/models/inventory.py:847 +#: awx/main/models/inventory.py:847 msgid "" "Comma-separated list of filter expressions (EC2 only). Hosts are imported " "when ANY of the filters match." msgstr "" -#: main/models/inventory.py:853 +#: awx/main/models/inventory.py:853 msgid "Limit groups automatically created from inventory source (EC2 only)." msgstr "" -#: main/models/inventory.py:857 +#: awx/main/models/inventory.py:857 msgid "Overwrite local groups and hosts from remote inventory source." msgstr "" -#: main/models/inventory.py:861 +#: awx/main/models/inventory.py:861 msgid "Overwrite local variables from remote inventory source." msgstr "" -#: main/models/inventory.py:893 +#: awx/main/models/inventory.py:893 msgid "Availability Zone" msgstr "" -#: main/models/inventory.py:894 +#: awx/main/models/inventory.py:894 msgid "Image ID" msgstr "" -#: main/models/inventory.py:895 +#: awx/main/models/inventory.py:895 msgid "Instance ID" msgstr "" -#: main/models/inventory.py:896 +#: awx/main/models/inventory.py:896 msgid "Instance Type" msgstr "" -#: main/models/inventory.py:897 +#: awx/main/models/inventory.py:897 msgid "Key Name" msgstr "" -#: main/models/inventory.py:898 +#: awx/main/models/inventory.py:898 msgid "Region" msgstr "" -#: main/models/inventory.py:899 +#: awx/main/models/inventory.py:899 msgid "Security Group" msgstr "" -#: main/models/inventory.py:900 +#: awx/main/models/inventory.py:900 msgid "Tags" msgstr "" -#: main/models/inventory.py:901 +#: awx/main/models/inventory.py:901 msgid "VPC ID" msgstr "" -#: main/models/inventory.py:902 +#: awx/main/models/inventory.py:902 msgid "Tag None" msgstr "" -#: main/models/inventory.py:973 +#: awx/main/models/inventory.py:973 #, python-format msgid "" "Cloud-based inventory sources (such as %s) require credentials for the " "matching cloud service." msgstr "" -#: main/models/inventory.py:980 +#: awx/main/models/inventory.py:980 msgid "Credential is required for a cloud source." msgstr "" -#: main/models/inventory.py:1005 +#: awx/main/models/inventory.py:1005 #, python-format -msgid "Invalid %(source)s region%(plural)s: %(region)s" +msgid "Invalid %(source)s region: %(region)s" msgstr "" -#: main/models/inventory.py:1031 +#: awx/main/models/inventory.py:1030 #, python-format -msgid "Invalid filter expression%(plural)s: %(filter)s" +msgid "Invalid filter expression: %(filter)s" msgstr "" -#: main/models/inventory.py:1050 +#: awx/main/models/inventory.py:1048 #, python-format -msgid "Invalid group by choice%(plural)s: %(choice)s" +msgid "Invalid group by choice: %(choice)s" msgstr "" -#: main/models/inventory.py:1198 +#: awx/main/models/inventory.py:1195 #, python-format msgid "" "Unable to configure this item for cloud sync. It is already managed by %s." msgstr "" -#: main/models/inventory.py:1293 +#: awx/main/models/inventory.py:1290 msgid "Inventory script contents" msgstr "" -#: main/models/inventory.py:1298 +#: awx/main/models/inventory.py:1295 msgid "Organization owning this inventory script" msgstr "" -#: main/models/jobs.py:171 +#: awx/main/models/jobs.py:169 msgid "You must provide a network credential." msgstr "" -#: main/models/jobs.py:179 +#: awx/main/models/jobs.py:177 msgid "" "Must provide a credential for a cloud provider, such as Amazon Web Services " "or Rackspace." msgstr "" -#: main/models/jobs.py:271 +#: awx/main/models/jobs.py:269 msgid "Job Template must provide 'inventory' or allow prompting for it." msgstr "" -#: main/models/jobs.py:275 +#: awx/main/models/jobs.py:273 msgid "Job Template must provide 'credential' or allow prompting for it." msgstr "" -#: main/models/jobs.py:364 +#: awx/main/models/jobs.py:362 msgid "Cannot override job_type to or from a scan job." msgstr "" -#: main/models/jobs.py:367 +#: awx/main/models/jobs.py:365 msgid "Inventory cannot be changed at runtime for scan jobs." msgstr "" -#: main/models/jobs.py:433 main/models/projects.py:243 +#: awx/main/models/jobs.py:431 awx/main/models/projects.py:243 msgid "SCM Revision" msgstr "" -#: main/models/jobs.py:434 +#: awx/main/models/jobs.py:432 msgid "The SCM Revision from the Project used for this job, if available" msgstr "" -#: main/models/jobs.py:442 +#: awx/main/models/jobs.py:440 msgid "" "The SCM Refresh task used to make sure the playbooks were available for the " "job run" msgstr "" -#: main/models/jobs.py:666 +#: awx/main/models/jobs.py:665 msgid "job host summaries" msgstr "" -#: main/models/jobs.py:769 +#: awx/main/models/jobs.py:768 msgid "Host Failure" msgstr "" -#: main/models/jobs.py:772 main/models/jobs.py:786 +#: awx/main/models/jobs.py:771 awx/main/models/jobs.py:785 msgid "No Hosts Remaining" msgstr "" -#: main/models/jobs.py:773 +#: awx/main/models/jobs.py:772 msgid "Host Polling" msgstr "" -#: main/models/jobs.py:774 +#: awx/main/models/jobs.py:773 msgid "Host Async OK" msgstr "" -#: main/models/jobs.py:775 +#: awx/main/models/jobs.py:774 msgid "Host Async Failure" msgstr "" -#: main/models/jobs.py:776 +#: awx/main/models/jobs.py:775 msgid "Item OK" msgstr "" -#: main/models/jobs.py:777 +#: awx/main/models/jobs.py:776 msgid "Item Failed" msgstr "" -#: main/models/jobs.py:778 +#: awx/main/models/jobs.py:777 msgid "Item Skipped" msgstr "" -#: main/models/jobs.py:779 +#: awx/main/models/jobs.py:778 msgid "Host Retry" msgstr "" -#: main/models/jobs.py:781 +#: awx/main/models/jobs.py:780 msgid "File Difference" msgstr "" -#: main/models/jobs.py:782 +#: awx/main/models/jobs.py:781 msgid "Playbook Started" msgstr "" -#: main/models/jobs.py:783 +#: awx/main/models/jobs.py:782 msgid "Running Handlers" msgstr "" -#: main/models/jobs.py:784 +#: awx/main/models/jobs.py:783 msgid "Including File" msgstr "" -#: main/models/jobs.py:785 +#: awx/main/models/jobs.py:784 msgid "No Hosts Matched" msgstr "" -#: main/models/jobs.py:787 +#: awx/main/models/jobs.py:786 msgid "Task Started" msgstr "" -#: main/models/jobs.py:789 +#: awx/main/models/jobs.py:788 msgid "Variables Prompted" msgstr "" -#: main/models/jobs.py:790 +#: awx/main/models/jobs.py:789 msgid "Gathering Facts" msgstr "" -#: main/models/jobs.py:791 +#: awx/main/models/jobs.py:790 msgid "internal: on Import for Host" msgstr "" -#: main/models/jobs.py:792 +#: awx/main/models/jobs.py:791 msgid "internal: on Not Import for Host" msgstr "" -#: main/models/jobs.py:793 +#: awx/main/models/jobs.py:792 msgid "Play Started" msgstr "" -#: main/models/jobs.py:794 +#: awx/main/models/jobs.py:793 msgid "Playbook Complete" msgstr "" -#: main/models/jobs.py:1240 +#: awx/main/models/jobs.py:1203 msgid "Remove jobs older than a certain number of days" msgstr "" -#: main/models/jobs.py:1241 +#: awx/main/models/jobs.py:1204 msgid "Remove activity stream entries older than a certain number of days" msgstr "" -#: main/models/jobs.py:1242 +#: awx/main/models/jobs.py:1205 msgid "Purge and/or reduce the granularity of system tracking data" msgstr "" -#: main/models/label.py:29 +#: awx/main/models/label.py:29 msgid "Organization this label belongs to." msgstr "" -#: main/models/notifications.py:31 +#: awx/main/models/notifications.py:31 msgid "Email" msgstr "" -#: main/models/notifications.py:32 +#: awx/main/models/notifications.py:32 msgid "Slack" msgstr "" -#: main/models/notifications.py:33 +#: awx/main/models/notifications.py:33 msgid "Twilio" msgstr "" -#: main/models/notifications.py:34 +#: awx/main/models/notifications.py:34 msgid "Pagerduty" msgstr "" -#: main/models/notifications.py:35 +#: awx/main/models/notifications.py:35 msgid "HipChat" msgstr "" -#: main/models/notifications.py:36 +#: awx/main/models/notifications.py:36 msgid "Webhook" msgstr "" -#: main/models/notifications.py:37 +#: awx/main/models/notifications.py:37 msgid "IRC" msgstr "" -#: main/models/notifications.py:127 main/models/unified_jobs.py:57 +#: awx/main/models/notifications.py:127 awx/main/models/unified_jobs.py:59 msgid "Pending" msgstr "" -#: main/models/notifications.py:128 main/models/unified_jobs.py:60 +#: awx/main/models/notifications.py:128 awx/main/models/unified_jobs.py:62 msgid "Successful" msgstr "" -#: main/models/notifications.py:129 main/models/unified_jobs.py:61 +#: awx/main/models/notifications.py:129 awx/main/models/unified_jobs.py:63 msgid "Failed" msgstr "" -#: main/models/organization.py:157 +#: awx/main/models/organization.py:157 msgid "Execute Commands on the Inventory" msgstr "" -#: main/models/organization.py:211 +#: awx/main/models/organization.py:211 msgid "Token not invalidated" msgstr "" -#: main/models/organization.py:212 +#: awx/main/models/organization.py:212 msgid "Token is expired" msgstr "" -#: main/models/organization.py:213 -msgid "Maximum per-user sessions reached" +#: awx/main/models/organization.py:213 +msgid "The maximum number of allowed sessions for this user has been exceeded." msgstr "" -#: main/models/organization.py:216 +#: awx/main/models/organization.py:216 msgid "Invalid token" msgstr "" -#: main/models/organization.py:233 +#: awx/main/models/organization.py:233 msgid "Reason the auth token was invalidated." msgstr "" -#: main/models/organization.py:272 +#: awx/main/models/organization.py:272 msgid "Invalid reason specified" msgstr "" -#: main/models/projects.py:43 +#: awx/main/models/projects.py:43 msgid "Git" msgstr "" -#: main/models/projects.py:44 +#: awx/main/models/projects.py:44 msgid "Mercurial" msgstr "" -#: main/models/projects.py:45 +#: awx/main/models/projects.py:45 msgid "Subversion" msgstr "" -#: main/models/projects.py:71 +#: awx/main/models/projects.py:71 msgid "" "Local path (relative to PROJECTS_ROOT) containing playbooks and related " "files for this project." msgstr "" -#: main/models/projects.py:80 +#: awx/main/models/projects.py:80 msgid "SCM Type" msgstr "" -#: main/models/projects.py:81 +#: awx/main/models/projects.py:81 msgid "Specifies the source control system used to store the project." msgstr "" -#: main/models/projects.py:87 +#: awx/main/models/projects.py:87 msgid "SCM URL" msgstr "" -#: main/models/projects.py:88 +#: awx/main/models/projects.py:88 msgid "The location where the project is stored." msgstr "" -#: main/models/projects.py:94 +#: awx/main/models/projects.py:94 msgid "SCM Branch" msgstr "" -#: main/models/projects.py:95 +#: awx/main/models/projects.py:95 msgid "Specific branch, tag or commit to checkout." msgstr "" -#: main/models/projects.py:99 +#: awx/main/models/projects.py:99 msgid "Discard any local changes before syncing the project." msgstr "" -#: main/models/projects.py:103 +#: awx/main/models/projects.py:103 msgid "Delete the project before syncing." msgstr "" -#: main/models/projects.py:116 +#: awx/main/models/projects.py:116 msgid "The amount of time to run before the task is canceled." msgstr "" -#: main/models/projects.py:130 +#: awx/main/models/projects.py:130 msgid "Invalid SCM URL." msgstr "" -#: main/models/projects.py:133 +#: awx/main/models/projects.py:133 msgid "SCM URL is required." msgstr "" -#: main/models/projects.py:142 +#: awx/main/models/projects.py:142 msgid "Credential kind must be 'scm'." msgstr "" -#: main/models/projects.py:157 +#: awx/main/models/projects.py:157 msgid "Invalid credential." msgstr "" -#: main/models/projects.py:229 +#: awx/main/models/projects.py:229 msgid "Update the project when a job is launched that uses the project." msgstr "" -#: main/models/projects.py:234 +#: awx/main/models/projects.py:234 msgid "" "The number of seconds after the last project update ran that a newproject " "update will be launched as a job dependency." msgstr "" -#: main/models/projects.py:244 +#: awx/main/models/projects.py:244 msgid "The last revision fetched by a project update" msgstr "" -#: main/models/projects.py:251 +#: awx/main/models/projects.py:251 msgid "Playbook Files" msgstr "" -#: main/models/projects.py:252 +#: awx/main/models/projects.py:252 msgid "List of playbooks found in the project" msgstr "" -#: main/models/rbac.py:122 +#: awx/main/models/rbac.py:36 +msgid "System Administrator" +msgstr "" + +#: awx/main/models/rbac.py:37 +msgid "System Auditor" +msgstr "" + +#: awx/main/models/rbac.py:38 +msgid "Ad Hoc" +msgstr "" + +#: awx/main/models/rbac.py:39 +msgid "Admin" +msgstr "" + +#: awx/main/models/rbac.py:40 +msgid "Auditor" +msgstr "" + +#: awx/main/models/rbac.py:41 +msgid "Execute" +msgstr "" + +#: awx/main/models/rbac.py:42 +msgid "Member" +msgstr "" + +#: awx/main/models/rbac.py:43 +msgid "Read" +msgstr "" + +#: awx/main/models/rbac.py:44 +msgid "Update" +msgstr "" + +#: awx/main/models/rbac.py:45 +msgid "Use" +msgstr "" + +#: awx/main/models/rbac.py:49 +msgid "Can manage all aspects of the system" +msgstr "" + +#: awx/main/models/rbac.py:50 +msgid "Can view all settings on the system" +msgstr "" + +#: awx/main/models/rbac.py:51 +msgid "May run ad hoc commands on an inventory" +msgstr "" + +#: awx/main/models/rbac.py:52 +#, python-format +msgid "Can manage all aspects of the %s" +msgstr "" + +#: awx/main/models/rbac.py:53 +#, python-format +msgid "Can view all settings for the %s" +msgstr "" + +#: awx/main/models/rbac.py:54 +#, python-format +msgid "May run the %s" +msgstr "" + +#: awx/main/models/rbac.py:55 +#, python-format +msgid "User is a member of the %s" +msgstr "" + +#: awx/main/models/rbac.py:56 +#, python-format +msgid "May view settings for the %s" +msgstr "" + +#: awx/main/models/rbac.py:57 +msgid "" +"May update project or inventory or group using the configured source update " +"system" +msgstr "" + +#: awx/main/models/rbac.py:58 +#, python-format +msgid "Can use the %s in a job template" +msgstr "" + +#: awx/main/models/rbac.py:122 msgid "roles" msgstr "" -#: main/models/rbac.py:438 +#: awx/main/models/rbac.py:438 msgid "role_ancestors" msgstr "" -#: main/models/schedules.py:69 +#: awx/main/models/schedules.py:69 msgid "Enables processing of this schedule by Tower." msgstr "" -#: main/models/schedules.py:75 +#: awx/main/models/schedules.py:75 msgid "The first occurrence of the schedule occurs on or after this time." msgstr "" -#: main/models/schedules.py:81 +#: awx/main/models/schedules.py:81 msgid "" "The last occurrence of the schedule occurs before this time, aftewards the " "schedule expires." msgstr "" -#: main/models/schedules.py:85 +#: awx/main/models/schedules.py:85 msgid "A value representing the schedules iCal recurrence rule." msgstr "" -#: main/models/schedules.py:91 +#: awx/main/models/schedules.py:91 msgid "The next time that the scheduled action will run." msgstr "" -#: main/models/unified_jobs.py:56 +#: awx/main/models/unified_jobs.py:58 msgid "New" msgstr "" -#: main/models/unified_jobs.py:58 +#: awx/main/models/unified_jobs.py:60 msgid "Waiting" msgstr "" -#: main/models/unified_jobs.py:59 +#: awx/main/models/unified_jobs.py:61 msgid "Running" msgstr "" -#: main/models/unified_jobs.py:63 +#: awx/main/models/unified_jobs.py:65 msgid "Canceled" msgstr "" -#: main/models/unified_jobs.py:67 +#: awx/main/models/unified_jobs.py:69 msgid "Never Updated" msgstr "" -#: main/models/unified_jobs.py:71 ui/templates/ui/index.html:85 -#: ui/templates/ui/index.html.py:104 +#: awx/main/models/unified_jobs.py:73 awx/ui/templates/ui/index.html:85 +#: awx/ui/templates/ui/index.html.py:104 msgid "OK" msgstr "" -#: main/models/unified_jobs.py:72 +#: awx/main/models/unified_jobs.py:74 msgid "Missing" msgstr "" -#: main/models/unified_jobs.py:76 +#: awx/main/models/unified_jobs.py:78 msgid "No External Source" msgstr "" -#: main/models/unified_jobs.py:83 +#: awx/main/models/unified_jobs.py:85 msgid "Updating" msgstr "" -#: main/models/unified_jobs.py:387 +#: awx/main/models/unified_jobs.py:403 msgid "Relaunch" msgstr "" -#: main/models/unified_jobs.py:388 +#: awx/main/models/unified_jobs.py:404 msgid "Callback" msgstr "" -#: main/models/unified_jobs.py:389 +#: awx/main/models/unified_jobs.py:405 msgid "Scheduled" msgstr "" -#: main/models/unified_jobs.py:390 +#: awx/main/models/unified_jobs.py:406 msgid "Dependency" msgstr "" -#: main/models/unified_jobs.py:391 +#: awx/main/models/unified_jobs.py:407 msgid "Workflow" msgstr "" -#: main/models/unified_jobs.py:437 +#: awx/main/models/unified_jobs.py:408 +msgid "Sync" +msgstr "" + +#: awx/main/models/unified_jobs.py:454 msgid "The Tower node the job executed on." msgstr "" -#: main/models/unified_jobs.py:463 +#: awx/main/models/unified_jobs.py:480 msgid "The date and time the job was queued for starting." msgstr "" -#: main/models/unified_jobs.py:469 +#: awx/main/models/unified_jobs.py:486 msgid "The date and time the job finished execution." msgstr "" -#: main/models/unified_jobs.py:475 +#: awx/main/models/unified_jobs.py:492 msgid "Elapsed time in seconds that the job ran." msgstr "" -#: main/models/unified_jobs.py:497 +#: awx/main/models/unified_jobs.py:514 msgid "" "A status field to indicate the state of the job if it wasn't able to run and " "capture stdout" msgstr "" -#: main/notifications/base.py:17 main/notifications/email_backend.py:28 +#: awx/main/notifications/base.py:17 +#: awx/main/notifications/email_backend.py:28 msgid "" "{} #{} had status {} on Ansible Tower, view details at {}\n" "\n" msgstr "" -#: main/notifications/hipchat_backend.py:46 +#: awx/main/notifications/hipchat_backend.py:46 msgid "Error sending messages: {}" msgstr "" -#: main/notifications/hipchat_backend.py:48 +#: awx/main/notifications/hipchat_backend.py:48 msgid "Error sending message to hipchat: {}" msgstr "" -#: main/notifications/irc_backend.py:54 +#: awx/main/notifications/irc_backend.py:54 msgid "Exception connecting to irc server: {}" msgstr "" -#: main/notifications/pagerduty_backend.py:39 +#: awx/main/notifications/pagerduty_backend.py:39 msgid "Exception connecting to PagerDuty: {}" msgstr "" -#: main/notifications/pagerduty_backend.py:48 -#: main/notifications/slack_backend.py:52 -#: main/notifications/twilio_backend.py:46 +#: awx/main/notifications/pagerduty_backend.py:48 +#: awx/main/notifications/slack_backend.py:52 +#: awx/main/notifications/twilio_backend.py:46 msgid "Exception sending messages: {}" msgstr "" -#: main/notifications/twilio_backend.py:36 +#: awx/main/notifications/twilio_backend.py:36 msgid "Exception connecting to Twilio: {}" msgstr "" -#: main/notifications/webhook_backend.py:38 -#: main/notifications/webhook_backend.py:40 +#: awx/main/notifications/webhook_backend.py:38 +#: awx/main/notifications/webhook_backend.py:40 msgid "Error sending notification webhook: {}" msgstr "" -#: main/tasks.py:139 +#: awx/main/scheduler/__init__.py:130 +msgid "" +"Job spawned from workflow could not start because it was not in the right " +"state or required manual credentials" +msgstr "" + +#: awx/main/tasks.py:180 msgid "Ansible Tower host usage over 90%" msgstr "" -#: main/tasks.py:144 +#: awx/main/tasks.py:185 msgid "Ansible Tower license will expire soon" msgstr "" -#: main/tasks.py:197 +#: awx/main/tasks.py:249 msgid "status_str must be either succeeded or failed" msgstr "" -#: main/utils/common.py:88 +#: awx/main/utils/common.py:89 #, python-format msgid "Unable to convert \"%s\" to boolean" msgstr "" -#: main/utils/common.py:242 +#: awx/main/utils/common.py:243 #, python-format msgid "Unsupported SCM type \"%s\"" msgstr "" -#: main/utils/common.py:249 main/utils/common.py:261 main/utils/common.py:280 +#: awx/main/utils/common.py:250 awx/main/utils/common.py:262 +#: awx/main/utils/common.py:281 #, python-format msgid "Invalid %s URL" msgstr "" -#: main/utils/common.py:251 main/utils/common.py:289 +#: awx/main/utils/common.py:252 awx/main/utils/common.py:290 #, python-format msgid "Unsupported %s URL" msgstr "" -#: main/utils/common.py:291 +#: awx/main/utils/common.py:292 #, python-format msgid "Unsupported host \"%s\" for file:// URL" msgstr "" -#: main/utils/common.py:293 +#: awx/main/utils/common.py:294 #, python-format msgid "Host is required for %s URL" msgstr "" -#: main/utils/common.py:311 +#: awx/main/utils/common.py:312 #, python-format msgid "Username must be \"git\" for SSH access to %s." msgstr "" -#: main/utils/common.py:317 +#: awx/main/utils/common.py:318 #, python-format msgid "Username must be \"hg\" for SSH access to %s." msgstr "" -#: main/validators.py:60 +#: awx/main/validators.py:60 #, python-format msgid "Invalid certificate or key: %r..." msgstr "" -#: main/validators.py:74 +#: awx/main/validators.py:74 #, python-format msgid "Invalid private key: unsupported type \"%s\"" msgstr "" -#: main/validators.py:78 +#: awx/main/validators.py:78 #, python-format msgid "Unsupported PEM object type: \"%s\"" msgstr "" -#: main/validators.py:103 +#: awx/main/validators.py:103 msgid "Invalid base64-encoded data" msgstr "" -#: main/validators.py:122 +#: awx/main/validators.py:122 msgid "Exactly one private key is required." msgstr "" -#: main/validators.py:124 +#: awx/main/validators.py:124 msgid "At least one private key is required." msgstr "" -#: main/validators.py:126 +#: awx/main/validators.py:126 #, python-format msgid "" "At least %(min_keys)d private keys are required, only %(key_count)d provided." msgstr "" -#: main/validators.py:129 +#: awx/main/validators.py:129 #, python-format msgid "Only one private key is allowed, %(key_count)d provided." msgstr "" -#: main/validators.py:131 +#: awx/main/validators.py:131 #, python-format msgid "" "No more than %(max_keys)d private keys are allowed, %(key_count)d provided." msgstr "" -#: main/validators.py:136 +#: awx/main/validators.py:136 msgid "Exactly one certificate is required." msgstr "" -#: main/validators.py:138 +#: awx/main/validators.py:138 msgid "At least one certificate is required." msgstr "" -#: main/validators.py:140 +#: awx/main/validators.py:140 #, python-format msgid "" "At least %(min_certs)d certificates are required, only %(cert_count)d " "provided." msgstr "" -#: main/validators.py:143 +#: awx/main/validators.py:143 #, python-format msgid "Only one certificate is allowed, %(cert_count)d provided." msgstr "" -#: main/validators.py:145 +#: awx/main/validators.py:145 #, python-format msgid "" "No more than %(max_certs)d certificates are allowed, %(cert_count)d provided." msgstr "" -#: main/views.py:20 +#: awx/main/views.py:20 msgid "API Error" msgstr "" -#: main/views.py:49 +#: awx/main/views.py:49 msgid "Bad Request" msgstr "" -#: main/views.py:50 +#: awx/main/views.py:50 msgid "The request could not be understood by the server." msgstr "" -#: main/views.py:57 +#: awx/main/views.py:57 msgid "Forbidden" msgstr "" -#: main/views.py:58 +#: awx/main/views.py:58 msgid "You don't have permission to access the requested resource." msgstr "" -#: main/views.py:65 +#: awx/main/views.py:65 msgid "Not Found" msgstr "" -#: main/views.py:66 +#: awx/main/views.py:66 msgid "The requested resource could not be found." msgstr "" -#: main/views.py:73 +#: awx/main/views.py:73 msgid "Server Error" msgstr "" -#: main/views.py:74 +#: awx/main/views.py:74 msgid "A server error has occurred." msgstr "" -#: settings/defaults.py:593 +#: awx/settings/defaults.py:624 msgid "Chicago" msgstr "" -#: settings/defaults.py:594 +#: awx/settings/defaults.py:625 msgid "Dallas/Ft. Worth" msgstr "" -#: settings/defaults.py:595 +#: awx/settings/defaults.py:626 msgid "Northern Virginia" msgstr "" -#: settings/defaults.py:596 +#: awx/settings/defaults.py:627 msgid "London" msgstr "" -#: settings/defaults.py:597 +#: awx/settings/defaults.py:628 msgid "Sydney" msgstr "" -#: settings/defaults.py:598 +#: awx/settings/defaults.py:629 msgid "Hong Kong" msgstr "" -#: settings/defaults.py:625 +#: awx/settings/defaults.py:656 msgid "US East (Northern Virginia)" msgstr "" -#: settings/defaults.py:626 +#: awx/settings/defaults.py:657 msgid "US East (Ohio)" msgstr "" -#: settings/defaults.py:627 +#: awx/settings/defaults.py:658 msgid "US West (Oregon)" msgstr "" -#: settings/defaults.py:628 +#: awx/settings/defaults.py:659 msgid "US West (Northern California)" msgstr "" -#: settings/defaults.py:629 +#: awx/settings/defaults.py:660 +msgid "Canada (Central)" +msgstr "" + +#: awx/settings/defaults.py:661 msgid "EU (Frankfurt)" msgstr "" -#: settings/defaults.py:630 +#: awx/settings/defaults.py:662 msgid "EU (Ireland)" msgstr "" -#: settings/defaults.py:631 +#: awx/settings/defaults.py:663 +msgid "EU (London)" +msgstr "" + +#: awx/settings/defaults.py:664 msgid "Asia Pacific (Singapore)" msgstr "" -#: settings/defaults.py:632 +#: awx/settings/defaults.py:665 msgid "Asia Pacific (Sydney)" msgstr "" -#: settings/defaults.py:633 +#: awx/settings/defaults.py:666 msgid "Asia Pacific (Tokyo)" msgstr "" -#: settings/defaults.py:634 +#: awx/settings/defaults.py:667 msgid "Asia Pacific (Seoul)" msgstr "" -#: settings/defaults.py:635 +#: awx/settings/defaults.py:668 msgid "Asia Pacific (Mumbai)" msgstr "" -#: settings/defaults.py:636 +#: awx/settings/defaults.py:669 msgid "South America (Sao Paulo)" msgstr "" -#: settings/defaults.py:637 +#: awx/settings/defaults.py:670 msgid "US West (GovCloud)" msgstr "" -#: settings/defaults.py:638 +#: awx/settings/defaults.py:671 msgid "China (Beijing)" msgstr "" -#: settings/defaults.py:687 +#: awx/settings/defaults.py:720 msgid "US East (B)" msgstr "" -#: settings/defaults.py:688 +#: awx/settings/defaults.py:721 msgid "US East (C)" msgstr "" -#: settings/defaults.py:689 +#: awx/settings/defaults.py:722 msgid "US East (D)" msgstr "" -#: settings/defaults.py:690 +#: awx/settings/defaults.py:723 msgid "US Central (A)" msgstr "" -#: settings/defaults.py:691 +#: awx/settings/defaults.py:724 msgid "US Central (B)" msgstr "" -#: settings/defaults.py:692 +#: awx/settings/defaults.py:725 msgid "US Central (C)" msgstr "" -#: settings/defaults.py:693 +#: awx/settings/defaults.py:726 msgid "US Central (F)" msgstr "" -#: settings/defaults.py:694 +#: awx/settings/defaults.py:727 msgid "Europe West (B)" msgstr "" -#: settings/defaults.py:695 +#: awx/settings/defaults.py:728 msgid "Europe West (C)" msgstr "" -#: settings/defaults.py:696 +#: awx/settings/defaults.py:729 msgid "Europe West (D)" msgstr "" -#: settings/defaults.py:697 +#: awx/settings/defaults.py:730 msgid "Asia East (A)" msgstr "" -#: settings/defaults.py:698 +#: awx/settings/defaults.py:731 msgid "Asia East (B)" msgstr "" -#: settings/defaults.py:699 +#: awx/settings/defaults.py:732 msgid "Asia East (C)" msgstr "" -#: settings/defaults.py:723 +#: awx/settings/defaults.py:756 msgid "US Central" msgstr "" -#: settings/defaults.py:724 +#: awx/settings/defaults.py:757 msgid "US East" msgstr "" -#: settings/defaults.py:725 +#: awx/settings/defaults.py:758 msgid "US East 2" msgstr "" -#: settings/defaults.py:726 +#: awx/settings/defaults.py:759 msgid "US North Central" msgstr "" -#: settings/defaults.py:727 +#: awx/settings/defaults.py:760 msgid "US South Central" msgstr "" -#: settings/defaults.py:728 +#: awx/settings/defaults.py:761 msgid "US West" msgstr "" -#: settings/defaults.py:729 +#: awx/settings/defaults.py:762 msgid "Europe North" msgstr "" -#: settings/defaults.py:730 +#: awx/settings/defaults.py:763 msgid "Europe West" msgstr "" -#: settings/defaults.py:731 +#: awx/settings/defaults.py:764 msgid "Asia Pacific East" msgstr "" -#: settings/defaults.py:732 +#: awx/settings/defaults.py:765 msgid "Asia Pacific Southeast" msgstr "" -#: settings/defaults.py:733 +#: awx/settings/defaults.py:766 msgid "Japan East" msgstr "" -#: settings/defaults.py:734 +#: awx/settings/defaults.py:767 msgid "Japan West" msgstr "" -#: settings/defaults.py:735 +#: awx/settings/defaults.py:768 msgid "Brazil South" msgstr "" -#: sso/apps.py:9 +#: awx/sso/apps.py:9 msgid "Single Sign-On" msgstr "" -#: sso/conf.py:27 +#: awx/sso/conf.py:27 msgid "" "Mapping to organization admins/users from social auth accounts. This " "setting\n" @@ -2710,7 +2881,7 @@ msgid "" " remove_admins." msgstr "" -#: sso/conf.py:76 +#: awx/sso/conf.py:76 msgid "" "Mapping of team members (users) from social auth accounts. Keys are team\n" "names (will be created if not present). Values are dictionaries of options\n" @@ -2739,40 +2910,40 @@ msgid "" " the rules above will be removed from the team." msgstr "" -#: sso/conf.py:119 +#: awx/sso/conf.py:119 msgid "Authentication Backends" msgstr "" -#: sso/conf.py:120 +#: awx/sso/conf.py:120 msgid "" "List of authentication backends that are enabled based on license features " "and other authentication settings." msgstr "" -#: sso/conf.py:133 +#: awx/sso/conf.py:133 msgid "Social Auth Organization Map" msgstr "" -#: sso/conf.py:145 +#: awx/sso/conf.py:145 msgid "Social Auth Team Map" msgstr "" -#: sso/conf.py:157 +#: awx/sso/conf.py:157 msgid "Social Auth User Fields" msgstr "" -#: sso/conf.py:158 +#: awx/sso/conf.py:158 msgid "" "When set to an empty list `[]`, this setting prevents new user accounts from " "being created. Only users who have previously logged in using social auth or " "have a user account with a matching email address will be able to login." msgstr "" -#: sso/conf.py:176 +#: awx/sso/conf.py:176 msgid "LDAP Server URI" msgstr "" -#: sso/conf.py:177 +#: awx/sso/conf.py:177 msgid "" "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-" "SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be " @@ -2780,18 +2951,19 @@ msgid "" "disabled if this parameter is empty." msgstr "" -#: sso/conf.py:181 sso/conf.py:199 sso/conf.py:211 sso/conf.py:223 -#: sso/conf.py:239 sso/conf.py:258 sso/conf.py:279 sso/conf.py:295 -#: sso/conf.py:314 sso/conf.py:331 sso/conf.py:347 sso/conf.py:362 -#: sso/conf.py:379 sso/conf.py:417 sso/conf.py:458 +#: awx/sso/conf.py:181 awx/sso/conf.py:199 awx/sso/conf.py:211 +#: awx/sso/conf.py:223 awx/sso/conf.py:239 awx/sso/conf.py:258 +#: awx/sso/conf.py:280 awx/sso/conf.py:296 awx/sso/conf.py:315 +#: awx/sso/conf.py:332 awx/sso/conf.py:349 awx/sso/conf.py:365 +#: awx/sso/conf.py:382 awx/sso/conf.py:420 awx/sso/conf.py:461 msgid "LDAP" msgstr "" -#: sso/conf.py:193 +#: awx/sso/conf.py:193 msgid "LDAP Bind DN" msgstr "" -#: sso/conf.py:194 +#: awx/sso/conf.py:194 msgid "" "DN (Distinguished Name) of user to bind for all search queries. Normally in " "the format \"CN=Some User,OU=Users,DC=example,DC=com\" but may also be " @@ -2799,27 +2971,27 @@ msgid "" "user account we will use to login to query LDAP for other user information." msgstr "" -#: sso/conf.py:209 +#: awx/sso/conf.py:209 msgid "LDAP Bind Password" msgstr "" -#: sso/conf.py:210 +#: awx/sso/conf.py:210 msgid "Password used to bind LDAP user account." msgstr "" -#: sso/conf.py:221 +#: awx/sso/conf.py:221 msgid "LDAP Start TLS" msgstr "" -#: sso/conf.py:222 +#: awx/sso/conf.py:222 msgid "Whether to enable TLS when the LDAP connection is not using SSL." msgstr "" -#: sso/conf.py:232 +#: awx/sso/conf.py:232 msgid "LDAP Connection Options" msgstr "" -#: sso/conf.py:233 +#: awx/sso/conf.py:233 msgid "" "Additional options to set for the LDAP connection. LDAP referrals are " "disabled by default (to prevent certain LDAP queries from hanging with AD). " @@ -2828,11 +3000,11 @@ msgid "" "values that can be set." msgstr "" -#: sso/conf.py:251 +#: awx/sso/conf.py:251 msgid "LDAP User Search" msgstr "" -#: sso/conf.py:252 +#: awx/sso/conf.py:252 msgid "" "LDAP search query to find users. Any user that matches the given pattern " "will be able to login to Tower. The user should also be mapped into an " @@ -2841,11 +3013,11 @@ msgid "" "possible. See python-ldap documentation as linked at the top of this section." msgstr "" -#: sso/conf.py:273 +#: awx/sso/conf.py:274 msgid "LDAP User DN Template" msgstr "" -#: sso/conf.py:274 +#: awx/sso/conf.py:275 msgid "" "Alternative to user search, if user DNs are all of the same format. This " "approach will be more efficient for user lookups than searching if it is " @@ -2853,11 +3025,11 @@ msgid "" "will be used instead of AUTH_LDAP_USER_SEARCH." msgstr "" -#: sso/conf.py:289 +#: awx/sso/conf.py:290 msgid "LDAP User Attribute Map" msgstr "" -#: sso/conf.py:290 +#: awx/sso/conf.py:291 msgid "" "Mapping of LDAP user schema to Tower API user attributes (key is user " "attribute name, value is LDAP attribute name). The default setting is valid " @@ -2865,54 +3037,54 @@ msgid "" "change the values (not the keys) of the dictionary/hash-table." msgstr "" -#: sso/conf.py:309 +#: awx/sso/conf.py:310 msgid "LDAP Group Search" msgstr "" -#: sso/conf.py:310 +#: awx/sso/conf.py:311 msgid "" "Users in Tower are mapped to organizations based on their membership in LDAP " "groups. This setting defines the LDAP search query to find groups. Note that " "this, unlike the user search above, does not support LDAPSearchUnion." msgstr "" -#: sso/conf.py:327 +#: awx/sso/conf.py:328 msgid "LDAP Group Type" msgstr "" -#: sso/conf.py:328 +#: awx/sso/conf.py:329 msgid "" "The group type may need to be changed based on the type of the LDAP server. " "Values are listed at: http://pythonhosted.org/django-auth-ldap/groups." "html#types-of-groups" msgstr "" -#: sso/conf.py:342 +#: awx/sso/conf.py:344 msgid "LDAP Require Group" msgstr "" -#: sso/conf.py:343 +#: awx/sso/conf.py:345 msgid "" "Group DN required to login. If specified, user must be a member of this " "group to login via LDAP. If not set, everyone in LDAP that matches the user " "search will be able to login via Tower. Only one require group is supported." msgstr "" -#: sso/conf.py:358 +#: awx/sso/conf.py:361 msgid "LDAP Deny Group" msgstr "" -#: sso/conf.py:359 +#: awx/sso/conf.py:362 msgid "" "Group DN denied from login. If specified, user will not be allowed to login " "if a member of this group. Only one deny group is supported." msgstr "" -#: sso/conf.py:372 +#: awx/sso/conf.py:375 msgid "LDAP User Flags By Group" msgstr "" -#: sso/conf.py:373 +#: awx/sso/conf.py:376 msgid "" "User profile flags updated from group membership (key is user attribute " "name, value is group DN). These are boolean fields that are matched based " @@ -2921,11 +3093,11 @@ msgid "" "false at login time based on current LDAP settings." msgstr "" -#: sso/conf.py:391 +#: awx/sso/conf.py:394 msgid "LDAP Organization Map" msgstr "" -#: sso/conf.py:392 +#: awx/sso/conf.py:395 msgid "" "Mapping between organization admins/users and LDAP groups. This controls " "what users are placed into what Tower organizations relative to their LDAP " @@ -2952,11 +3124,11 @@ msgid "" "remove_admins." msgstr "" -#: sso/conf.py:440 +#: awx/sso/conf.py:443 msgid "LDAP Team Map" msgstr "" -#: sso/conf.py:441 +#: awx/sso/conf.py:444 msgid "" "Mapping between team members (users) and LDAP groups. Keys are team names " "(will be created if not present). Values are dictionaries of options for " @@ -2975,87 +3147,88 @@ msgid "" "of the given groups will be removed from the team." msgstr "" -#: sso/conf.py:484 +#: awx/sso/conf.py:487 msgid "RADIUS Server" msgstr "" -#: sso/conf.py:485 +#: awx/sso/conf.py:488 msgid "" "Hostname/IP of RADIUS server. RADIUS authentication will be disabled if this " "setting is empty." msgstr "" -#: sso/conf.py:487 sso/conf.py:501 sso/conf.py:513 +#: awx/sso/conf.py:490 awx/sso/conf.py:504 awx/sso/conf.py:516 msgid "RADIUS" msgstr "" -#: sso/conf.py:499 +#: awx/sso/conf.py:502 msgid "RADIUS Port" msgstr "" -#: sso/conf.py:500 +#: awx/sso/conf.py:503 msgid "Port of RADIUS server." msgstr "" -#: sso/conf.py:511 +#: awx/sso/conf.py:514 msgid "RADIUS Secret" msgstr "" -#: sso/conf.py:512 +#: awx/sso/conf.py:515 msgid "Shared secret for authenticating to RADIUS server." msgstr "" -#: sso/conf.py:528 +#: awx/sso/conf.py:531 msgid "Google OAuth2 Callback URL" msgstr "" -#: sso/conf.py:529 +#: awx/sso/conf.py:532 msgid "" "Create a project at https://console.developers.google.com/ to obtain an " "OAuth2 key and secret for a web application. Ensure that the Google+ API is " "enabled. Provide this URL as the callback URL for your application." msgstr "" -#: sso/conf.py:533 sso/conf.py:544 sso/conf.py:555 sso/conf.py:568 -#: sso/conf.py:582 sso/conf.py:594 sso/conf.py:606 +#: awx/sso/conf.py:536 awx/sso/conf.py:547 awx/sso/conf.py:558 +#: awx/sso/conf.py:571 awx/sso/conf.py:585 awx/sso/conf.py:597 +#: awx/sso/conf.py:609 msgid "Google OAuth2" msgstr "" -#: sso/conf.py:542 +#: awx/sso/conf.py:545 msgid "Google OAuth2 Key" msgstr "" -#: sso/conf.py:543 +#: awx/sso/conf.py:546 msgid "" "The OAuth2 key from your web application at https://console.developers." "google.com/." msgstr "" -#: sso/conf.py:553 +#: awx/sso/conf.py:556 msgid "Google OAuth2 Secret" msgstr "" -#: sso/conf.py:554 +#: awx/sso/conf.py:557 msgid "" "The OAuth2 secret from your web application at https://console.developers." "google.com/." msgstr "" -#: sso/conf.py:565 +#: awx/sso/conf.py:568 msgid "Google OAuth2 Whitelisted Domains" msgstr "" -#: sso/conf.py:566 +#: awx/sso/conf.py:569 msgid "" "Update this setting to restrict the domains who are allowed to login using " "Google OAuth2." msgstr "" -#: sso/conf.py:577 +#: awx/sso/conf.py:580 msgid "Google OAuth2 Extra Arguments" msgstr "" -#: sso/conf.py:578 +#: awx/sso/conf.py:581 msgid "" "Extra arguments for Google OAuth2 login. When only allowing a single domain " "to authenticate, set to `{\"hd\": \"yourdomain.com\"}` and Google will not " @@ -3063,60 +3236,60 @@ msgid "" "Google accounts." msgstr "" -#: sso/conf.py:592 +#: awx/sso/conf.py:595 msgid "Google OAuth2 Organization Map" msgstr "" -#: sso/conf.py:604 +#: awx/sso/conf.py:607 msgid "Google OAuth2 Team Map" msgstr "" -#: sso/conf.py:620 +#: awx/sso/conf.py:623 msgid "GitHub OAuth2 Callback URL" msgstr "" -#: sso/conf.py:621 +#: awx/sso/conf.py:624 msgid "" "Create a developer application at https://github.com/settings/developers to " "obtain an OAuth2 key (Client ID) and secret (Client Secret). Provide this " "URL as the callback URL for your application." msgstr "" -#: sso/conf.py:625 sso/conf.py:636 sso/conf.py:646 sso/conf.py:658 -#: sso/conf.py:670 +#: awx/sso/conf.py:628 awx/sso/conf.py:639 awx/sso/conf.py:649 +#: awx/sso/conf.py:661 awx/sso/conf.py:673 msgid "GitHub OAuth2" msgstr "" -#: sso/conf.py:634 +#: awx/sso/conf.py:637 msgid "GitHub OAuth2 Key" msgstr "" -#: sso/conf.py:635 +#: awx/sso/conf.py:638 msgid "The OAuth2 key (Client ID) from your GitHub developer application." msgstr "" -#: sso/conf.py:644 +#: awx/sso/conf.py:647 msgid "GitHub OAuth2 Secret" msgstr "" -#: sso/conf.py:645 +#: awx/sso/conf.py:648 msgid "" "The OAuth2 secret (Client Secret) from your GitHub developer application." msgstr "" -#: sso/conf.py:656 +#: awx/sso/conf.py:659 msgid "GitHub OAuth2 Organization Map" msgstr "" -#: sso/conf.py:668 +#: awx/sso/conf.py:671 msgid "GitHub OAuth2 Team Map" msgstr "" -#: sso/conf.py:684 +#: awx/sso/conf.py:687 msgid "GitHub Organization OAuth2 Callback URL" msgstr "" -#: sso/conf.py:685 sso/conf.py:760 +#: awx/sso/conf.py:688 awx/sso/conf.py:763 msgid "" "Create an organization-owned application at https://github.com/organizations/" "/settings/applications and obtain an OAuth2 key (Client ID) and " @@ -3124,86 +3297,86 @@ msgid "" "application." msgstr "" -#: sso/conf.py:689 sso/conf.py:700 sso/conf.py:710 sso/conf.py:722 -#: sso/conf.py:733 sso/conf.py:745 +#: awx/sso/conf.py:692 awx/sso/conf.py:703 awx/sso/conf.py:713 +#: awx/sso/conf.py:725 awx/sso/conf.py:736 awx/sso/conf.py:748 msgid "GitHub Organization OAuth2" msgstr "" -#: sso/conf.py:698 +#: awx/sso/conf.py:701 msgid "GitHub Organization OAuth2 Key" msgstr "" -#: sso/conf.py:699 sso/conf.py:774 +#: awx/sso/conf.py:702 awx/sso/conf.py:777 msgid "The OAuth2 key (Client ID) from your GitHub organization application." msgstr "" -#: sso/conf.py:708 +#: awx/sso/conf.py:711 msgid "GitHub Organization OAuth2 Secret" msgstr "" -#: sso/conf.py:709 sso/conf.py:784 +#: awx/sso/conf.py:712 awx/sso/conf.py:787 msgid "" "The OAuth2 secret (Client Secret) from your GitHub organization application." msgstr "" -#: sso/conf.py:719 +#: awx/sso/conf.py:722 msgid "GitHub Organization Name" msgstr "" -#: sso/conf.py:720 +#: awx/sso/conf.py:723 msgid "" "The name of your GitHub organization, as used in your organization's URL: " "https://github.com//." msgstr "" -#: sso/conf.py:731 +#: awx/sso/conf.py:734 msgid "GitHub Organization OAuth2 Organization Map" msgstr "" -#: sso/conf.py:743 +#: awx/sso/conf.py:746 msgid "GitHub Organization OAuth2 Team Map" msgstr "" -#: sso/conf.py:759 +#: awx/sso/conf.py:762 msgid "GitHub Team OAuth2 Callback URL" msgstr "" -#: sso/conf.py:764 sso/conf.py:775 sso/conf.py:785 sso/conf.py:797 -#: sso/conf.py:808 sso/conf.py:820 +#: awx/sso/conf.py:767 awx/sso/conf.py:778 awx/sso/conf.py:788 +#: awx/sso/conf.py:800 awx/sso/conf.py:811 awx/sso/conf.py:823 msgid "GitHub Team OAuth2" msgstr "" -#: sso/conf.py:773 +#: awx/sso/conf.py:776 msgid "GitHub Team OAuth2 Key" msgstr "" -#: sso/conf.py:783 +#: awx/sso/conf.py:786 msgid "GitHub Team OAuth2 Secret" msgstr "" -#: sso/conf.py:794 +#: awx/sso/conf.py:797 msgid "GitHub Team ID" msgstr "" -#: sso/conf.py:795 +#: awx/sso/conf.py:798 msgid "" "Find the numeric team ID using the Github API: http://fabian-kostadinov." "github.io/2015/01/16/how-to-find-a-github-team-id/." msgstr "" -#: sso/conf.py:806 +#: awx/sso/conf.py:809 msgid "GitHub Team OAuth2 Organization Map" msgstr "" -#: sso/conf.py:818 +#: awx/sso/conf.py:821 msgid "GitHub Team OAuth2 Team Map" msgstr "" -#: sso/conf.py:834 +#: awx/sso/conf.py:837 msgid "Azure AD OAuth2 Callback URL" msgstr "" -#: sso/conf.py:835 +#: awx/sso/conf.py:838 msgid "" "Register an Azure AD application as described by https://msdn.microsoft.com/" "en-us/library/azure/dn132599.aspx and obtain an OAuth2 key (Client ID) and " @@ -3211,117 +3384,118 @@ msgid "" "application." msgstr "" -#: sso/conf.py:839 sso/conf.py:850 sso/conf.py:860 sso/conf.py:872 -#: sso/conf.py:884 +#: awx/sso/conf.py:842 awx/sso/conf.py:853 awx/sso/conf.py:863 +#: awx/sso/conf.py:875 awx/sso/conf.py:887 msgid "Azure AD OAuth2" msgstr "" -#: sso/conf.py:848 +#: awx/sso/conf.py:851 msgid "Azure AD OAuth2 Key" msgstr "" -#: sso/conf.py:849 +#: awx/sso/conf.py:852 msgid "The OAuth2 key (Client ID) from your Azure AD application." msgstr "" -#: sso/conf.py:858 +#: awx/sso/conf.py:861 msgid "Azure AD OAuth2 Secret" msgstr "" -#: sso/conf.py:859 +#: awx/sso/conf.py:862 msgid "The OAuth2 secret (Client Secret) from your Azure AD application." msgstr "" -#: sso/conf.py:870 +#: awx/sso/conf.py:873 msgid "Azure AD OAuth2 Organization Map" msgstr "" -#: sso/conf.py:882 +#: awx/sso/conf.py:885 msgid "Azure AD OAuth2 Team Map" msgstr "" -#: sso/conf.py:903 +#: awx/sso/conf.py:906 msgid "SAML Service Provider Callback URL" msgstr "" -#: sso/conf.py:904 +#: awx/sso/conf.py:907 msgid "" "Register Tower as a service provider (SP) with each identity provider (IdP) " "you have configured. Provide your SP Entity ID and this callback URL for " "your application." msgstr "" -#: sso/conf.py:907 sso/conf.py:921 sso/conf.py:934 sso/conf.py:948 -#: sso/conf.py:962 sso/conf.py:980 sso/conf.py:1002 sso/conf.py:1021 -#: sso/conf.py:1041 sso/conf.py:1075 sso/conf.py:1088 +#: awx/sso/conf.py:910 awx/sso/conf.py:924 awx/sso/conf.py:937 +#: awx/sso/conf.py:951 awx/sso/conf.py:965 awx/sso/conf.py:983 +#: awx/sso/conf.py:1005 awx/sso/conf.py:1024 awx/sso/conf.py:1044 +#: awx/sso/conf.py:1078 awx/sso/conf.py:1091 msgid "SAML" msgstr "" -#: sso/conf.py:918 +#: awx/sso/conf.py:921 msgid "SAML Service Provider Metadata URL" msgstr "" -#: sso/conf.py:919 +#: awx/sso/conf.py:922 msgid "" "If your identity provider (IdP) allows uploading an XML metadata file, you " "can download one from this URL." msgstr "" -#: sso/conf.py:931 +#: awx/sso/conf.py:934 msgid "SAML Service Provider Entity ID" msgstr "" -#: sso/conf.py:932 +#: awx/sso/conf.py:935 msgid "" "The application-defined unique identifier used as the audience of the SAML " "service provider (SP) configuration." msgstr "" -#: sso/conf.py:945 +#: awx/sso/conf.py:948 msgid "SAML Service Provider Public Certificate" msgstr "" -#: sso/conf.py:946 +#: awx/sso/conf.py:949 msgid "" "Create a keypair for Tower to use as a service provider (SP) and include the " "certificate content here." msgstr "" -#: sso/conf.py:959 +#: awx/sso/conf.py:962 msgid "SAML Service Provider Private Key" msgstr "" -#: sso/conf.py:960 +#: awx/sso/conf.py:963 msgid "" "Create a keypair for Tower to use as a service provider (SP) and include the " "private key content here." msgstr "" -#: sso/conf.py:978 +#: awx/sso/conf.py:981 msgid "SAML Service Provider Organization Info" msgstr "" -#: sso/conf.py:979 +#: awx/sso/conf.py:982 msgid "Configure this setting with information about your app." msgstr "" -#: sso/conf.py:1000 +#: awx/sso/conf.py:1003 msgid "SAML Service Provider Technical Contact" msgstr "" -#: sso/conf.py:1001 sso/conf.py:1020 +#: awx/sso/conf.py:1004 awx/sso/conf.py:1023 msgid "Configure this setting with your contact information." msgstr "" -#: sso/conf.py:1019 +#: awx/sso/conf.py:1022 msgid "SAML Service Provider Support Contact" msgstr "" -#: sso/conf.py:1034 +#: awx/sso/conf.py:1037 msgid "SAML Enabled Identity Providers" msgstr "" -#: sso/conf.py:1035 +#: awx/sso/conf.py:1038 msgid "" "Configure the Entity ID, SSO URL and certificate for each identity provider " "(IdP) in use. Multiple SAML IdPs are supported. Some IdPs may provide user " @@ -3330,217 +3504,218 @@ msgid "" "Attribute names may be overridden for each IdP." msgstr "" -#: sso/conf.py:1073 +#: awx/sso/conf.py:1076 msgid "SAML Organization Map" msgstr "" -#: sso/conf.py:1086 +#: awx/sso/conf.py:1089 msgid "SAML Team Map" msgstr "" -#: sso/fields.py:123 +#: awx/sso/fields.py:123 msgid "Invalid connection option(s): {invalid_options}." msgstr "" -#: sso/fields.py:182 +#: awx/sso/fields.py:194 msgid "Base" msgstr "" -#: sso/fields.py:183 +#: awx/sso/fields.py:195 msgid "One Level" msgstr "" -#: sso/fields.py:184 +#: awx/sso/fields.py:196 msgid "Subtree" msgstr "" -#: sso/fields.py:202 +#: awx/sso/fields.py:214 msgid "Expected a list of three items but got {length} instead." msgstr "" -#: sso/fields.py:203 +#: awx/sso/fields.py:215 msgid "Expected an instance of LDAPSearch but got {input_type} instead." msgstr "" -#: sso/fields.py:239 +#: awx/sso/fields.py:251 msgid "" "Expected an instance of LDAPSearch or LDAPSearchUnion but got {input_type} " "instead." msgstr "" -#: sso/fields.py:266 +#: awx/sso/fields.py:278 msgid "Invalid user attribute(s): {invalid_attrs}." msgstr "" -#: sso/fields.py:283 +#: awx/sso/fields.py:295 msgid "Expected an instance of LDAPGroupType but got {input_type} instead." msgstr "" -#: sso/fields.py:308 +#: awx/sso/fields.py:323 msgid "Invalid user flag: \"{invalid_flag}\"." msgstr "" -#: sso/fields.py:324 sso/fields.py:491 +#: awx/sso/fields.py:339 awx/sso/fields.py:506 msgid "" "Expected None, True, False, a string or list of strings but got {input_type} " "instead." msgstr "" -#: sso/fields.py:360 +#: awx/sso/fields.py:375 msgid "Missing key(s): {missing_keys}." msgstr "" -#: sso/fields.py:361 +#: awx/sso/fields.py:376 msgid "Invalid key(s): {invalid_keys}." msgstr "" -#: sso/fields.py:410 sso/fields.py:527 +#: awx/sso/fields.py:425 awx/sso/fields.py:542 msgid "Invalid key(s) for organization map: {invalid_keys}." msgstr "" -#: sso/fields.py:428 +#: awx/sso/fields.py:443 msgid "Missing required key for team map: {invalid_keys}." msgstr "" -#: sso/fields.py:429 sso/fields.py:546 +#: awx/sso/fields.py:444 awx/sso/fields.py:561 msgid "Invalid key(s) for team map: {invalid_keys}." msgstr "" -#: sso/fields.py:545 +#: awx/sso/fields.py:560 msgid "Missing required key for team map: {missing_keys}." msgstr "" -#: sso/fields.py:563 +#: awx/sso/fields.py:578 msgid "Missing required key(s) for org info record: {missing_keys}." msgstr "" -#: sso/fields.py:576 +#: awx/sso/fields.py:591 msgid "Invalid language code(s) for org info: {invalid_lang_codes}." msgstr "" -#: sso/fields.py:595 +#: awx/sso/fields.py:610 msgid "Missing required key(s) for contact: {missing_keys}." msgstr "" -#: sso/fields.py:607 +#: awx/sso/fields.py:622 msgid "Missing required key(s) for IdP: {missing_keys}." msgstr "" -#: sso/pipeline.py:24 +#: awx/sso/pipeline.py:24 msgid "An account cannot be found for {0}" msgstr "" -#: sso/pipeline.py:30 +#: awx/sso/pipeline.py:30 msgid "Your account is inactive" msgstr "" -#: sso/validators.py:19 sso/validators.py:44 +#: awx/sso/validators.py:19 awx/sso/validators.py:44 #, python-format msgid "DN must include \"%%(user)s\" placeholder for username: %s" msgstr "" -#: sso/validators.py:26 +#: awx/sso/validators.py:26 #, python-format msgid "Invalid DN: %s" msgstr "" -#: sso/validators.py:56 +#: awx/sso/validators.py:56 #, python-format msgid "Invalid filter: %s" msgstr "" -#: templates/error.html:4 ui/templates/ui/index.html:8 +#: awx/templates/error.html:4 awx/ui/templates/ui/index.html:8 msgid "Ansible Tower" msgstr "" -#: templates/rest_framework/api.html:39 +#: awx/templates/rest_framework/api.html:39 msgid "Ansible Tower API Guide" msgstr "" -#: templates/rest_framework/api.html:40 +#: awx/templates/rest_framework/api.html:40 msgid "Back to Ansible Tower" msgstr "" -#: templates/rest_framework/api.html:41 +#: awx/templates/rest_framework/api.html:41 msgid "Resize" msgstr "" -#: templates/rest_framework/base.html:78 templates/rest_framework/base.html:92 +#: awx/templates/rest_framework/base.html:78 +#: awx/templates/rest_framework/base.html:92 #, python-format msgid "Make a GET request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:80 +#: awx/templates/rest_framework/base.html:80 msgid "Specify a format for the GET request" msgstr "" -#: templates/rest_framework/base.html:86 +#: awx/templates/rest_framework/base.html:86 #, python-format msgid "" "Make a GET request on the %(name)s resource with the format set to `" "%(format)s`" msgstr "" -#: templates/rest_framework/base.html:100 +#: awx/templates/rest_framework/base.html:100 #, python-format msgid "Make an OPTIONS request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:106 +#: awx/templates/rest_framework/base.html:106 #, python-format msgid "Make a DELETE request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:113 +#: awx/templates/rest_framework/base.html:113 msgid "Filters" msgstr "" -#: templates/rest_framework/base.html:172 -#: templates/rest_framework/base.html:186 +#: awx/templates/rest_framework/base.html:172 +#: awx/templates/rest_framework/base.html:186 #, python-format msgid "Make a POST request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:216 -#: templates/rest_framework/base.html:230 +#: awx/templates/rest_framework/base.html:216 +#: awx/templates/rest_framework/base.html:230 #, python-format msgid "Make a PUT request on the %(name)s resource" msgstr "" -#: templates/rest_framework/base.html:233 +#: awx/templates/rest_framework/base.html:233 #, python-format msgid "Make a PATCH request on the %(name)s resource" msgstr "" -#: ui/apps.py:9 ui/conf.py:22 ui/conf.py:38 ui/conf.py:53 +#: awx/ui/apps.py:9 awx/ui/conf.py:22 awx/ui/conf.py:38 awx/ui/conf.py:53 msgid "UI" msgstr "" -#: ui/conf.py:16 +#: awx/ui/conf.py:16 msgid "Off" msgstr "" -#: ui/conf.py:17 +#: awx/ui/conf.py:17 msgid "Anonymous" msgstr "" -#: ui/conf.py:18 +#: awx/ui/conf.py:18 msgid "Detailed" msgstr "" -#: ui/conf.py:20 +#: awx/ui/conf.py:20 msgid "Analytics Tracking State" msgstr "" -#: ui/conf.py:21 +#: awx/ui/conf.py:21 msgid "Enable or Disable Analytics Tracking." msgstr "" -#: ui/conf.py:31 +#: awx/ui/conf.py:31 msgid "Custom Login Info" msgstr "" -#: ui/conf.py:32 +#: awx/ui/conf.py:32 msgid "" "If needed, you can add specific information (such as a legal notice or a " "disclaimer) to a text box in the login modal using this setting. Any content " @@ -3549,42 +3724,42 @@ msgid "" "(paragraphs) must be escaped as `\\n` within the block of text." msgstr "" -#: ui/conf.py:48 +#: awx/ui/conf.py:48 msgid "Custom Logo" msgstr "" -#: ui/conf.py:49 +#: awx/ui/conf.py:49 msgid "" "To set up a custom logo, provide a file that you create. For the custom logo " "to look its best, use a `.png` file with a transparent background. GIF, PNG " "and JPEG formats are supported." msgstr "" -#: ui/fields.py:29 +#: awx/ui/fields.py:29 msgid "" "Invalid format for custom logo. Must be a data URL with a base64-encoded " "GIF, PNG or JPEG image." msgstr "" -#: ui/fields.py:30 +#: awx/ui/fields.py:30 msgid "Invalid base64-encoded data in data URL." msgstr "" -#: ui/templates/ui/index.html:49 +#: awx/ui/templates/ui/index.html:49 msgid "" "Your session will expire in 60 seconds, would you like to continue?" msgstr "" -#: ui/templates/ui/index.html:64 +#: awx/ui/templates/ui/index.html:64 msgid "CANCEL" msgstr "" -#: ui/templates/ui/index.html:116 +#: awx/ui/templates/ui/index.html:116 msgid "Set how many days of data should be retained." msgstr "" -#: ui/templates/ui/index.html:122 +#: awx/ui/templates/ui/index.html:122 msgid "" "Please enter an integer that is not " @@ -3593,7 +3768,7 @@ msgid "" "span>." msgstr "" -#: ui/templates/ui/index.html:127 +#: awx/ui/templates/ui/index.html:127 msgid "" "For facts collected older than the time period specified, save one fact scan " "(snapshot) per time window (frequency). For example, facts older than 30 " @@ -3605,11 +3780,11 @@ msgid "" "
" msgstr "" -#: ui/templates/ui/index.html:136 +#: awx/ui/templates/ui/index.html:136 msgid "Select a time period after which to remove old facts" msgstr "" -#: ui/templates/ui/index.html:150 +#: awx/ui/templates/ui/index.html:150 msgid "" "Please enter an integer " @@ -3618,11 +3793,11 @@ msgid "" "that is lower than 9999." msgstr "" -#: ui/templates/ui/index.html:155 +#: awx/ui/templates/ui/index.html:155 msgid "Select a frequency for snapshot retention" msgstr "" -#: ui/templates/ui/index.html:169 +#: awx/ui/templates/ui/index.html:169 msgid "" "Please enter an integer." msgstr "" -#: ui/templates/ui/index.html:175 +#: awx/ui/templates/ui/index.html:175 msgid "working..." msgstr "" diff --git a/awx/locale/fr/LC_MESSAGES/django.po b/awx/locale/fr/LC_MESSAGES/django.po index 720fe8b149..23961c10bc 100644 --- a/awx/locale/fr/LC_MESSAGES/django.po +++ b/awx/locale/fr/LC_MESSAGES/django.po @@ -1,11 +1,12 @@ # Corina Roe , 2017. #zanata # Sam Friedmann , 2017. #zanata +# tfujiwar , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-27 17:35+0000\n" -"PO-Revision-Date: 2017-01-18 10:49+0000\n" +"POT-Creation-Date: 2017-01-31 18:51+0000\n" +"PO-Revision-Date: 2017-02-02 01:42+0000\n" "Last-Translator: Corina Roe \n" "Language-Team: French\n" "MIME-Version: 1.0\n" @@ -15,134 +16,141 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Zanata 3.9.6\n" -#: api/authentication.py:67 +#: awx/api/authentication.py:67 msgid "Invalid token header. No credentials provided." msgstr "" "En-tête de token non valide. Aucune information d'identification fournie." -#: api/authentication.py:70 +#: awx/api/authentication.py:70 msgid "Invalid token header. Token string should not contain spaces." msgstr "" "En-tête de token non valide. La chaîne token ne doit pas contenir d'espaces." -#: api/authentication.py:105 +#: awx/api/authentication.py:105 msgid "User inactive or deleted" msgstr "Utilisateur inactif ou supprimé" -#: api/authentication.py:161 +#: awx/api/authentication.py:161 msgid "Invalid task token" msgstr "Token de tâche non valide" -#: api/conf.py:12 +#: awx/api/conf.py:12 msgid "Idle Time Force Log Out" msgstr "Temps d'inactivité - Forcer la déconnexion" -#: api/conf.py:13 +#: awx/api/conf.py:13 msgid "" "Number of seconds that a user is inactive before they will need to login " "again." msgstr "" -"Délai en secondes pendant lequel un utilisateur peut rester inactif avant de" -" devoir se reconnecter." +"Délai en secondes pendant lequel un utilisateur peut rester inactif avant de " +"devoir se reconnecter." -#: api/conf.py:14 api/conf.py:24 api/conf.py:33 sso/conf.py:124 -#: sso/conf.py:135 sso/conf.py:147 sso/conf.py:162 +#: awx/api/conf.py:14 +#: awx/api/conf.py:24 +#: awx/api/conf.py:33 +#: awx/sso/conf.py:124 +#: awx/sso/conf.py:135 +#: awx/sso/conf.py:147 +#: awx/sso/conf.py:162 msgid "Authentication" msgstr "Authentification" -#: api/conf.py:22 +#: awx/api/conf.py:22 msgid "Maximum number of simultaneous logins" msgstr "Nombre maximal de connexions simultanées" -#: api/conf.py:23 +#: awx/api/conf.py:23 msgid "" "Maximum number of simultaneous logins a user may have. To disable enter -1." msgstr "" "Nombre maximal de connexions simultanées dont un utilisateur peut disposer. " "Pour désactiver cette option, entrez -1." -#: api/conf.py:31 +#: awx/api/conf.py:31 msgid "Enable HTTP Basic Auth" msgstr "Activer l'authentification HTTP de base" -#: api/conf.py:32 +#: awx/api/conf.py:32 msgid "Enable HTTP Basic Auth for the API Browser." msgstr "Activer l'authentification HTTP de base pour le navigateur d'API." -#: api/generics.py:462 +#: awx/api/generics.py:466 msgid "\"id\" is required to disassociate" msgstr "\"id\" est nécessaire pour dissocier" -#: api/metadata.py:50 +#: awx/api/metadata.py:50 msgid "Database ID for this {}." msgstr "ID de base de données pour ce {}." -#: api/metadata.py:51 +#: awx/api/metadata.py:51 msgid "Name of this {}." msgstr "Nom de ce {}." -#: api/metadata.py:52 +#: awx/api/metadata.py:52 msgid "Optional description of this {}." msgstr "Description facultative de ce {}." -#: api/metadata.py:53 +#: awx/api/metadata.py:53 msgid "Data type for this {}." msgstr "Type de données pour ce {}." -#: api/metadata.py:54 +#: awx/api/metadata.py:54 msgid "URL for this {}." msgstr "URL de ce {}." -#: api/metadata.py:55 +#: awx/api/metadata.py:55 msgid "Data structure with URLs of related resources." msgstr "Structure de données avec URL des ressources associées." -#: api/metadata.py:56 +#: awx/api/metadata.py:56 msgid "Data structure with name/description for related resources." msgstr "Structure de données avec nom/description des ressources associées." -#: api/metadata.py:57 +#: awx/api/metadata.py:57 msgid "Timestamp when this {} was created." msgstr "Horodatage lors de la création de ce {}." -#: api/metadata.py:58 +#: awx/api/metadata.py:58 msgid "Timestamp when this {} was last modified." msgstr "Horodatage lors de la modification de ce {}." -#: api/parsers.py:31 +#: awx/api/parsers.py:31 #, python-format msgid "JSON parse error - %s" msgstr "Erreur d'analyse JSON - %s" -#: api/serializers.py:248 +#: awx/api/serializers.py:250 msgid "Playbook Run" msgstr "Exécution du playbook" -#: api/serializers.py:249 +#: awx/api/serializers.py:251 msgid "Command" msgstr "Commande" -#: api/serializers.py:250 +#: awx/api/serializers.py:252 msgid "SCM Update" msgstr "Mise à jour SCM" -#: api/serializers.py:251 +#: awx/api/serializers.py:253 msgid "Inventory Sync" msgstr "Synchronisation des inventaires" -#: api/serializers.py:252 +#: awx/api/serializers.py:254 msgid "Management Job" msgstr "Tâche de gestion" -#: api/serializers.py:253 +#: awx/api/serializers.py:255 msgid "Workflow Job" msgstr "Tâche de workflow" -#: api/serializers.py:254 +#: awx/api/serializers.py:256 msgid "Workflow Template" -msgstr "" +msgstr "Modèle de workflow" -#: api/serializers.py:656 api/serializers.py:714 api/views.py:3805 +#: awx/api/serializers.py:658 +#: awx/api/serializers.py:716 +#: awx/api/views.py:3817 #, python-format msgid "" "Standard Output too large to display (%(text_size)d bytes), only download " @@ -152,67 +160,74 @@ msgstr "" "Le téléchargement est pris en charge seulement pour une taille supérieure à " "%(supported_size)d octets" -#: api/serializers.py:729 +#: awx/api/serializers.py:731 msgid "Write-only field used to change the password." msgstr "Champ en écriture seule servant à modifier le mot de passe." -#: api/serializers.py:731 +#: awx/api/serializers.py:733 msgid "Set if the account is managed by an external service" msgstr "À définir si le compte est géré par un service externe" -#: api/serializers.py:755 +#: awx/api/serializers.py:757 msgid "Password required for new User." msgstr "Mot de passe requis pour le nouvel utilisateur." -#: api/serializers.py:839 +#: awx/api/serializers.py:841 #, python-format msgid "Unable to change %s on user managed by LDAP." msgstr "Impossible de redéfinir %s sur un utilisateur géré par LDAP." -#: api/serializers.py:991 +#: awx/api/serializers.py:1002 msgid "Organization is missing" msgstr "L'organisation est manquante" -#: api/serializers.py:997 +#: awx/api/serializers.py:1006 +msgid "Update options must be set to false for manual projects." +msgstr "" +"La Mise à jour des options doit être définie à false pour les projets " +"manuels." + +#: awx/api/serializers.py:1012 msgid "Array of playbooks available within this project." msgstr "Tableau des playbooks disponibles dans ce projet." -#: api/serializers.py:1179 +#: awx/api/serializers.py:1194 #, python-format msgid "Invalid port specification: %s" msgstr "Spécification de port non valide : %s" -#: api/serializers.py:1207 main/validators.py:193 +#: awx/api/serializers.py:1222 +#: awx/main/validators.py:193 msgid "Must be valid JSON or YAML." msgstr "Syntaxe JSON ou YAML valide exigée." -#: api/serializers.py:1264 +#: awx/api/serializers.py:1279 msgid "Invalid group name." msgstr "Nom de groupe incorrect." -#: api/serializers.py:1339 +#: awx/api/serializers.py:1354 msgid "" "Script must begin with a hashbang sequence: i.e.... #!/usr/bin/env python" msgstr "" -"Le script doit commencer par une séquence hashbang : c.-à-d. ... " -"#!/usr/bin/env python" +"Le script doit commencer par une séquence hashbang : c.-à-d. ... #!/usr/bin/" +"env python" -#: api/serializers.py:1392 +#: awx/api/serializers.py:1407 msgid "If 'source' is 'custom', 'source_script' must be provided." msgstr "Si la valeur 'source' est 'custom', 'source_script' doit être défini." -#: api/serializers.py:1396 +#: awx/api/serializers.py:1411 msgid "" "The 'source_script' does not belong to the same organization as the " "inventory." msgstr "" "Le 'source_script' n'appartient pas à la même organisation que l'inventaire." -#: api/serializers.py:1398 +#: awx/api/serializers.py:1413 msgid "'source_script' doesn't exist." msgstr "'source_script' n'existe pas." -#: api/serializers.py:1757 +#: awx/api/serializers.py:1772 msgid "" "Write-only field used to add user to owner role. If provided, do not give " "either team or organization. Only valid for creation." @@ -221,188 +236,197 @@ msgstr "" "propriétaire. Si vous le définissez, n'entrez ni équipe ni organisation. " "Seulement valable pour la création." -#: api/serializers.py:1762 +#: awx/api/serializers.py:1777 msgid "" "Write-only field used to add team to owner role. If provided, do not give " "either user or organization. Only valid for creation." msgstr "" "Champ en écriture seule qui sert à ajouter une équipe au rôle de " -"propriétaire. Si vous le définissez, n'entrez ni utilisateur ni " -"organisation. Seulement valable pour la création." +"propriétaire. Si vous le définissez, n'entrez ni utilisateur ni organisation." +" Seulement valable pour la création." -#: api/serializers.py:1767 +#: awx/api/serializers.py:1782 msgid "" -"Inherit permissions from organization roles. If provided on creation, do not" -" give either user or team." +"Inherit permissions from organization roles. If provided on creation, do not " +"give either user or team." msgstr "" "Hériter des permissions à partir des rôles d'organisation. Si vous le " "définissez lors de la création, n'entrez ni utilisateur ni équipe." -#: api/serializers.py:1783 +#: awx/api/serializers.py:1798 msgid "Missing 'user', 'team', or 'organization'." msgstr "Valeur 'utilisateur', 'équipe' ou 'organisation' manquante." -#: api/serializers.py:1796 +#: awx/api/serializers.py:1811 msgid "" "Credential organization must be set and match before assigning to a team" msgstr "" "L'organisation des informations d'identification doit être définie et mise " "en correspondance avant de l'attribuer à une équipe" -#: api/serializers.py:1888 +#: awx/api/serializers.py:1903 msgid "This field is required." msgstr "Ce champ est obligatoire." -#: api/serializers.py:1890 api/serializers.py:1892 +#: awx/api/serializers.py:1905 +#: awx/api/serializers.py:1907 msgid "Playbook not found for project." msgstr "Playbook introuvable pour le projet." -#: api/serializers.py:1894 +#: awx/api/serializers.py:1909 msgid "Must select playbook for project." msgstr "Un playbook doit être sélectionné pour le project." -#: api/serializers.py:1958 main/models/jobs.py:278 +#: awx/api/serializers.py:1975 +msgid "Must either set a default value or ask to prompt on launch." +msgstr "" +"Une valeur par défaut doit être définie ou bien demander une invite au " +"moment du lancement." + +#: awx/api/serializers.py:1978 +#: awx/main/models/jobs.py:278 msgid "Scan jobs must be assigned a fixed inventory." msgstr "Un inventaire fixe doit être assigné aux tâches de scan." -#: api/serializers.py:1960 main/models/jobs.py:281 +#: awx/api/serializers.py:1980 +#: awx/main/models/jobs.py:281 msgid "Job types 'run' and 'check' must have assigned a project." msgstr "Un projet doit être assigné aux types de tâche 'run' et 'check'." -#: api/serializers.py:1963 +#: awx/api/serializers.py:1987 msgid "Survey Enabled cannot be used with scan jobs." msgstr "" "L'option Questionnaire activé ne peut pas être utilisée avec les tâches de " "scan." -#: api/serializers.py:2023 +#: awx/api/serializers.py:2047 msgid "Invalid job template." msgstr "Modèle de tâche non valide." -#: api/serializers.py:2108 +#: awx/api/serializers.py:2132 msgid "Credential not found or deleted." msgstr "Informations d'identification introuvables ou supprimées." -#: api/serializers.py:2110 +#: awx/api/serializers.py:2134 msgid "Job Template Project is missing or undefined." msgstr "Le projet de modèle de tâche est manquant ou non défini." -#: api/serializers.py:2112 +#: awx/api/serializers.py:2136 msgid "Job Template Inventory is missing or undefined." msgstr "Le projet de modèle d'inventaire est manquant ou non défini." -#: api/serializers.py:2397 +#: awx/api/serializers.py:2421 #, python-format msgid "%(job_type)s is not a valid job type. The choices are %(choices)s." msgstr "" "%(job_type)s n'est pas un type de tâche valide. Les choix sont %(choices)s." -#: api/serializers.py:2402 +#: awx/api/serializers.py:2426 msgid "Workflow job template is missing during creation." msgstr "Le modèle de tâche Workflow est manquant lors de la création." -#: api/serializers.py:2407 +#: awx/api/serializers.py:2431 #, python-format msgid "Cannot nest a %s inside a WorkflowJobTemplate" msgstr "Impossible d'imbriquer %s dans un modèle de tâche Workflow." -#: api/serializers.py:2645 +#: awx/api/serializers.py:2669 #, python-format msgid "Job Template '%s' is missing or undefined." msgstr "Le modèle de tâche '%s' est manquant ou non défini." -#: api/serializers.py:2671 +#: awx/api/serializers.py:2695 msgid "Must be a valid JSON or YAML dictionary." msgstr "Dictionnaire JSON ou YAML valide exigé." -#: api/serializers.py:2813 +#: awx/api/serializers.py:2837 msgid "" "Missing required fields for Notification Configuration: notification_type" msgstr "" "Champs obligatoires manquants pour la configuration des notifications : " "notification_type" -#: api/serializers.py:2836 +#: awx/api/serializers.py:2860 msgid "No values specified for field '{}'" msgstr "Aucune valeur spécifiée pour le champ '{}'" -#: api/serializers.py:2841 +#: awx/api/serializers.py:2865 msgid "Missing required fields for Notification Configuration: {}." msgstr "" "Champs obligatoires manquants pour la configuration des notifications : {}." -#: api/serializers.py:2844 +#: awx/api/serializers.py:2868 msgid "Configuration field '{}' incorrect type, expected {}." msgstr "Type de champ de configuration '{}' incorrect, {} attendu." -#: api/serializers.py:2897 +#: awx/api/serializers.py:2921 msgid "Inventory Source must be a cloud resource." msgstr "La source d'inventaire doit être une ressource cloud." -#: api/serializers.py:2899 +#: awx/api/serializers.py:2923 msgid "Manual Project can not have a schedule set." msgstr "Le projet manuel ne peut pas avoir de calendrier défini." -#: api/serializers.py:2921 +#: awx/api/serializers.py:2945 msgid "" "DTSTART required in rrule. Value should match: DTSTART:YYYYMMDDTHHMMSSZ" msgstr "" -"DTSTART obligatoire dans rrule. La valeur doit correspondre à : " -"DTSTART:YYYYMMDDTHHMMSSZ" +"DTSTART obligatoire dans rrule. La valeur doit correspondre à : DTSTART:" +"YYYYMMDDTHHMMSSZ" -#: api/serializers.py:2923 +#: awx/api/serializers.py:2947 msgid "Multiple DTSTART is not supported." msgstr "Une seule valeur DTSTART est prise en charge." -#: api/serializers.py:2925 +#: awx/api/serializers.py:2949 msgid "RRULE require in rrule." msgstr "RRULE obligatoire dans rrule." -#: api/serializers.py:2927 +#: awx/api/serializers.py:2951 msgid "Multiple RRULE is not supported." msgstr "Une seule valeur RRULE est prise en charge." -#: api/serializers.py:2929 +#: awx/api/serializers.py:2953 msgid "INTERVAL required in rrule." msgstr "INTERVAL obligatoire dans rrule." -#: api/serializers.py:2931 +#: awx/api/serializers.py:2955 msgid "TZID is not supported." msgstr "TZID n'est pas pris en charge." -#: api/serializers.py:2933 +#: awx/api/serializers.py:2957 msgid "SECONDLY is not supported." msgstr "SECONDLY n'est pas pris en charge." -#: api/serializers.py:2935 +#: awx/api/serializers.py:2959 msgid "Multiple BYMONTHDAYs not supported." msgstr "Une seule valeur BYMONTHDAY est prise en charge." -#: api/serializers.py:2937 +#: awx/api/serializers.py:2961 msgid "Multiple BYMONTHs not supported." msgstr "Une seule valeur BYMONTH est prise en charge." -#: api/serializers.py:2939 +#: awx/api/serializers.py:2963 msgid "BYDAY with numeric prefix not supported." msgstr "BYDAY avec un préfixe numérique non pris en charge." -#: api/serializers.py:2941 +#: awx/api/serializers.py:2965 msgid "BYYEARDAY not supported." msgstr "BYYEARDAY non pris en charge." -#: api/serializers.py:2943 +#: awx/api/serializers.py:2967 msgid "BYWEEKNO not supported." msgstr "BYWEEKNO non pris en charge." -#: api/serializers.py:2947 +#: awx/api/serializers.py:2971 msgid "COUNT > 999 is unsupported." msgstr "COUNT > 999 non pris en charge." -#: api/serializers.py:2951 +#: awx/api/serializers.py:2975 msgid "rrule parsing failed validation." msgstr "L'analyse rrule n'a pas pu être validée." -#: api/serializers.py:2969 +#: awx/api/serializers.py:2997 msgid "" "A summary of the new and changed values when an object is created, updated, " "or deleted" @@ -410,7 +434,7 @@ msgstr "" "Un récapitulatif des valeurs nouvelles et modifiées lorsqu'un objet est " "créé, mis à jour ou supprimé" -#: api/serializers.py:2971 +#: awx/api/serializers.py:2999 msgid "" "For create, update, and delete events this is the object type that was " "affected. For associate and disassociate events this is the object type " @@ -420,134 +444,141 @@ msgstr "" "d'objet qui a été affecté. Pour associer et dissocier des événements, il " "s'agit du type d'objet associé à ou dissocié de object2." -#: api/serializers.py:2974 +#: awx/api/serializers.py:3002 msgid "" "Unpopulated for create, update, and delete events. For associate and " -"disassociate events this is the object type that object1 is being associated" -" with." +"disassociate events this is the object type that object1 is being associated " +"with." msgstr "" "Laisser vide pour créer, mettre à jour et supprimer des événements. Pour " "associer et dissocier des événements, il s'agit du type d'objet auquel " "object1 est associé." -#: api/serializers.py:2977 +#: awx/api/serializers.py:3005 msgid "The action taken with respect to the given object(s)." msgstr "Action appliquée par rapport à l'objet ou aux objets donnés." -#: api/serializers.py:3077 +#: awx/api/serializers.py:3112 msgid "Unable to login with provided credentials." msgstr "Connexion impossible avec les informations d'identification fournies." -#: api/serializers.py:3079 +#: awx/api/serializers.py:3114 msgid "Must include \"username\" and \"password\"." msgstr "Elles doivent inclure le nom d'utilisateur et le mot de passe." -#: api/views.py:99 +#: awx/api/views.py:99 msgid "Your license does not allow use of the activity stream." msgstr "Votre licence ne permet pas l'utilisation du flux d'activité." -#: api/views.py:109 +#: awx/api/views.py:109 msgid "Your license does not permit use of system tracking." msgstr "Votre licence ne permet pas l'utilisation du suivi du système." -#: api/views.py:119 +#: awx/api/views.py:119 msgid "Your license does not allow use of workflows." msgstr "Votre licence ne permet pas l'utilisation de workflows." -#: api/views.py:127 templates/rest_framework/api.html:28 +#: awx/api/views.py:127 +#: awx/templates/rest_framework/api.html:28 msgid "REST API" msgstr "API REST" -#: api/views.py:134 templates/rest_framework/api.html:4 +#: awx/api/views.py:134 +#: awx/templates/rest_framework/api.html:4 msgid "Ansible Tower REST API" msgstr "API REST Ansible Tower" -#: api/views.py:150 +#: awx/api/views.py:150 msgid "Version 1" msgstr "Version 1" -#: api/views.py:201 +#: awx/api/views.py:201 msgid "Ping" msgstr "Ping" -#: api/views.py:230 conf/apps.py:12 +#: awx/api/views.py:230 +#: awx/conf/apps.py:12 msgid "Configuration" msgstr "Configuration" -#: api/views.py:283 +#: awx/api/views.py:283 msgid "Invalid license data" msgstr "Données de licence non valides" -#: api/views.py:285 +#: awx/api/views.py:285 msgid "Missing 'eula_accepted' property" msgstr "Propriété 'eula_accepted' manquante" -#: api/views.py:289 +#: awx/api/views.py:289 msgid "'eula_accepted' value is invalid" msgstr "La valeur 'eula_accepted' n'est pas valide" -#: api/views.py:292 +#: awx/api/views.py:292 msgid "'eula_accepted' must be True" msgstr "La valeur 'eula_accepted' doit être True" -#: api/views.py:299 +#: awx/api/views.py:299 msgid "Invalid JSON" msgstr "Syntaxe JSON non valide" -#: api/views.py:307 +#: awx/api/views.py:307 msgid "Invalid License" msgstr "Licence non valide" -#: api/views.py:317 +#: awx/api/views.py:317 msgid "Invalid license" msgstr "Licence non valide" -#: api/views.py:325 +#: awx/api/views.py:325 #, python-format msgid "Failed to remove license (%s)" msgstr "Suppression de la licence (%s) impossible" -#: api/views.py:330 +#: awx/api/views.py:330 msgid "Dashboard" msgstr "Tableau de bord" -#: api/views.py:436 +#: awx/api/views.py:436 msgid "Dashboard Jobs Graphs" msgstr "Graphiques de tâches du tableau de bord" -#: api/views.py:472 +#: awx/api/views.py:472 #, python-format msgid "Unknown period \"%s\"" msgstr "Période \"%s\" inconnue" -#: api/views.py:486 +#: awx/api/views.py:486 msgid "Schedules" msgstr "Calendriers" -#: api/views.py:505 +#: awx/api/views.py:505 msgid "Schedule Jobs List" msgstr "Listes des tâches de planification" -#: api/views.py:715 +#: awx/api/views.py:715 msgid "Your Tower license only permits a single organization to exist." msgstr "Votre licence Tower permet l'existence d'une seule organisation." -#: api/views.py:940 api/views.py:1299 +#: awx/api/views.py:940 +#: awx/api/views.py:1299 msgid "Role 'id' field is missing." msgstr "Le champ \"id\" du rôle est manquant." -#: api/views.py:946 api/views.py:4081 +#: awx/api/views.py:946 +#: awx/api/views.py:4093 msgid "You cannot assign an Organization role as a child role for a Team." msgstr "" "Vous ne pouvez pas attribuer un rôle Organisation en tant que rôle enfant " "pour une équipe." -#: api/views.py:950 api/views.py:4095 +#: awx/api/views.py:950 +#: awx/api/views.py:4107 msgid "You cannot grant system-level permissions to a team." msgstr "" "Vous ne pouvez pas accorder de permissions au niveau système à une équipe." -#: api/views.py:957 api/views.py:4087 +#: awx/api/views.py:957 +#: awx/api/views.py:4099 msgid "" "You cannot grant credential access to a team when the Organization field " "isn't set, or belongs to a different organization" @@ -556,34 +587,39 @@ msgstr "" "équipe lorsque le champ Organisation n'est pas défini ou qu'elle appartient " "à une organisation différente" -#: api/views.py:1047 +#: awx/api/views.py:1047 msgid "Cannot delete project." msgstr "Suppression du projet impossible." -#: api/views.py:1076 +#: awx/api/views.py:1076 msgid "Project Schedules" msgstr "Calendriers des projets" -#: api/views.py:1180 api/views.py:2270 api/views.py:3276 +#: awx/api/views.py:1180 +#: awx/api/views.py:2271 +#: awx/api/views.py:3284 msgid "Cannot delete job resource when associated workflow job is running." msgstr "" -"Impossible de supprimer les ressources de tâche lorsqu'une tâche de workflow" -" associée est en cours d'exécution." +"Impossible de supprimer les ressources de tâche lorsqu'une tâche de workflow " +"associée est en cours d'exécution." -#: api/views.py:1257 +#: awx/api/views.py:1257 msgid "Me" msgstr "Moi-même" -#: api/views.py:1303 api/views.py:4036 +#: awx/api/views.py:1303 +#: awx/api/views.py:4048 msgid "You may not perform any action with your own admin_role." msgstr "Vous ne pouvez pas effectuer d'action avec votre propre admin_role." -#: api/views.py:1309 api/views.py:4040 +#: awx/api/views.py:1309 +#: awx/api/views.py:4052 msgid "You may not change the membership of a users admin_role" msgstr "" "Vous ne pouvez pas modifier l'appartenance de l'admin_role d'un utilisateur" -#: api/views.py:1314 api/views.py:4045 +#: awx/api/views.py:1314 +#: awx/api/views.py:4057 msgid "" "You cannot grant credential access to a user not in the credentials' " "organization" @@ -592,473 +628,541 @@ msgstr "" "utilisateur ne figurant pas dans l'organisation d'informations " "d'identification." -#: api/views.py:1318 api/views.py:4049 +#: awx/api/views.py:1318 +#: awx/api/views.py:4061 msgid "You cannot grant private credential access to another user" msgstr "" "Vous ne pouvez pas accorder d'accès privé par informations d'identification " "à un autre utilisateur" -#: api/views.py:1416 +#: awx/api/views.py:1416 #, python-format msgid "Cannot change %s." msgstr "Impossible de modifier %s." -#: api/views.py:1422 +#: awx/api/views.py:1422 msgid "Cannot delete user." msgstr "Impossible de supprimer l'utilisateur." -#: api/views.py:1570 +#: awx/api/views.py:1570 msgid "Cannot delete inventory script." msgstr "Impossible de supprimer le script d'inventaire." -#: api/views.py:1805 +#: awx/api/views.py:1806 msgid "Fact not found." msgstr "Fait introuvable." -#: api/views.py:2125 +#: awx/api/views.py:2126 msgid "Inventory Source List" msgstr "Liste des sources d'inventaire" -#: api/views.py:2153 +#: awx/api/views.py:2154 msgid "Cannot delete inventory source." msgstr "Impossible de supprimer la source d'inventaire." -#: api/views.py:2161 +#: awx/api/views.py:2162 msgid "Inventory Source Schedules" msgstr "Calendriers des sources d'inventaire" -#: api/views.py:2191 +#: awx/api/views.py:2192 msgid "Notification Templates can only be assigned when source is one of {}." msgstr "" "Les modèles de notification ne peuvent être attribués que lorsque la source " "est l'une des {}." -#: api/views.py:2402 +#: awx/api/views.py:2403 msgid "Job Template Schedules" msgstr "Calendriers des modèles de tâche" -#: api/views.py:2422 api/views.py:2438 +#: awx/api/views.py:2423 +#: awx/api/views.py:2439 msgid "Your license does not allow adding surveys." msgstr "Votre licence ne permet pas l'ajout de questionnaires." -#: api/views.py:2445 +#: awx/api/views.py:2446 msgid "'name' missing from survey spec." msgstr "'name' manquant dans la spécification du questionnaire." -#: api/views.py:2447 +#: awx/api/views.py:2448 msgid "'description' missing from survey spec." msgstr "'description' manquante dans la spécification du questionnaire." -#: api/views.py:2449 +#: awx/api/views.py:2450 msgid "'spec' missing from survey spec." msgstr "'spec' manquante dans la spécification du questionnaire." -#: api/views.py:2451 +#: awx/api/views.py:2452 msgid "'spec' must be a list of items." msgstr "'spec' doit être une liste d'éléments" -#: api/views.py:2453 +#: awx/api/views.py:2454 msgid "'spec' doesn't contain any items." msgstr "'spec' ne contient aucun élément." -#: api/views.py:2459 +#: awx/api/views.py:2460 #, python-format msgid "Survey question %s is not a json object." msgstr "La question %s n'est pas un objet json." -#: api/views.py:2461 +#: awx/api/views.py:2462 #, python-format msgid "'type' missing from survey question %s." msgstr "'type' est manquant dans la question %s." -#: api/views.py:2463 +#: awx/api/views.py:2464 #, python-format msgid "'question_name' missing from survey question %s." msgstr "'question_name' est manquant dans la question %s." -#: api/views.py:2465 +#: awx/api/views.py:2466 #, python-format msgid "'variable' missing from survey question %s." msgstr "'variable' est manquant dans la question %s." -#: api/views.py:2467 +#: awx/api/views.py:2468 #, python-format msgid "'variable' '%(item)s' duplicated in survey question %(survey)s." msgstr "'variable' '%(item)s' en double dans la question %(survey)s." -#: api/views.py:2472 +#: awx/api/views.py:2473 #, python-format msgid "'required' missing from survey question %s." msgstr "'required' est manquant dans la question %s." -#: api/views.py:2683 +#: awx/api/views.py:2684 msgid "No matching host could be found!" msgstr "Aucun hôte correspondant n'a été trouvé." -#: api/views.py:2686 +#: awx/api/views.py:2687 msgid "Multiple hosts matched the request!" msgstr "Plusieurs hôtes correspondent à la requête." -#: api/views.py:2691 +#: awx/api/views.py:2692 msgid "Cannot start automatically, user input required!" msgstr "" "Impossible de démarrer automatiquement, saisie de l'utilisateur obligatoire." -#: api/views.py:2698 +#: awx/api/views.py:2699 msgid "Host callback job already pending." msgstr "La tâche de rappel de l'hôte est déjà en attente." -#: api/views.py:2711 +#: awx/api/views.py:2712 msgid "Error starting job!" msgstr "Erreur lors du démarrage de la tâche." -#: api/views.py:3040 +#: awx/api/views.py:3041 msgid "Workflow Job Template Schedules" msgstr "Calendriers des modèles de tâche Workflow" -#: api/views.py:3175 api/views.py:3714 +#: awx/api/views.py:3183 +#: awx/api/views.py:3726 msgid "Superuser privileges needed." msgstr "Privilèges de superutilisateur requis." -#: api/views.py:3207 +#: awx/api/views.py:3215 msgid "System Job Template Schedules" msgstr "Calendriers des modèles de tâche Système" -#: api/views.py:3399 +#: awx/api/views.py:3407 msgid "Job Host Summaries List" msgstr "Liste récapitulative des hôtes de la tâche" -#: api/views.py:3441 +#: awx/api/views.py:3449 msgid "Job Event Children List" msgstr "Liste des enfants d'événement de la tâche" -#: api/views.py:3450 +#: awx/api/views.py:3458 msgid "Job Event Hosts List" msgstr "Liste des hôtes d'événement de la tâche" -#: api/views.py:3459 +#: awx/api/views.py:3467 msgid "Job Events List" msgstr "Liste des événements de la tâche" -#: api/views.py:3668 +#: awx/api/views.py:3680 msgid "Ad Hoc Command Events List" msgstr "Liste d'événements de la commande ad hoc" -#: api/views.py:3862 +#: awx/api/views.py:3874 #, python-format msgid "Error generating stdout download file: %s" msgstr "Erreur lors de la génération du fichier de téléchargement stdout : %s" -#: api/views.py:3907 +#: awx/api/views.py:3919 msgid "Delete not allowed while there are pending notifications" msgstr "Suppression non autorisée tant que des notifications sont en attente" -#: api/views.py:3914 +#: awx/api/views.py:3926 msgid "Notification Template Test" -msgstr "" +msgstr "Test de modèle de notification" -#: api/views.py:4030 +#: awx/api/views.py:4042 msgid "User 'id' field is missing." msgstr "Le champ \"id\" de l'utilisateur est manquant." -#: api/views.py:4073 +#: awx/api/views.py:4085 msgid "Team 'id' field is missing." msgstr "Le champ \"id\" de l'équipe est manquant." -#: conf/conf.py:20 +#: awx/conf/conf.py:20 msgid "Bud Frogs" msgstr "Bud Frogs" -#: conf/conf.py:21 +#: awx/conf/conf.py:21 msgid "Bunny" msgstr "Bunny" -#: conf/conf.py:22 +#: awx/conf/conf.py:22 msgid "Cheese" msgstr "Cheese" -#: conf/conf.py:23 +#: awx/conf/conf.py:23 msgid "Daemon" msgstr "Daemon" -#: conf/conf.py:24 +#: awx/conf/conf.py:24 msgid "Default Cow" msgstr "Default Cow" -#: conf/conf.py:25 +#: awx/conf/conf.py:25 msgid "Dragon" msgstr "Dragon" -#: conf/conf.py:26 +#: awx/conf/conf.py:26 msgid "Elephant in Snake" msgstr "Elephant in Snake" -#: conf/conf.py:27 +#: awx/conf/conf.py:27 msgid "Elephant" msgstr "Elephant" -#: conf/conf.py:28 +#: awx/conf/conf.py:28 msgid "Eyes" msgstr "Eyes" -#: conf/conf.py:29 +#: awx/conf/conf.py:29 msgid "Hello Kitty" msgstr "Hello Kitty" -#: conf/conf.py:30 +#: awx/conf/conf.py:30 msgid "Kitty" msgstr "Kitty" -#: conf/conf.py:31 +#: awx/conf/conf.py:31 msgid "Luke Koala" msgstr "Luke Koala" -#: conf/conf.py:32 +#: awx/conf/conf.py:32 msgid "Meow" msgstr "Meow" -#: conf/conf.py:33 +#: awx/conf/conf.py:33 msgid "Milk" msgstr "Milk" -#: conf/conf.py:34 +#: awx/conf/conf.py:34 msgid "Moofasa" msgstr "Moofasa" -#: conf/conf.py:35 +#: awx/conf/conf.py:35 msgid "Moose" msgstr "Moose" -#: conf/conf.py:36 +#: awx/conf/conf.py:36 msgid "Ren" msgstr "Ren" -#: conf/conf.py:37 +#: awx/conf/conf.py:37 msgid "Sheep" msgstr "Sheep" -#: conf/conf.py:38 +#: awx/conf/conf.py:38 msgid "Small Cow" msgstr "Small Cow" -#: conf/conf.py:39 +#: awx/conf/conf.py:39 msgid "Stegosaurus" msgstr "Stegosaurus" -#: conf/conf.py:40 +#: awx/conf/conf.py:40 msgid "Stimpy" msgstr "Stimpy" -#: conf/conf.py:41 +#: awx/conf/conf.py:41 msgid "Super Milker" msgstr "Super Milker" -#: conf/conf.py:42 +#: awx/conf/conf.py:42 msgid "Three Eyes" msgstr "Three Eyes" -#: conf/conf.py:43 +#: awx/conf/conf.py:43 msgid "Turkey" msgstr "Turkey" -#: conf/conf.py:44 +#: awx/conf/conf.py:44 msgid "Turtle" msgstr "Turtle" -#: conf/conf.py:45 +#: awx/conf/conf.py:45 msgid "Tux" msgstr "Tux" -#: conf/conf.py:46 +#: awx/conf/conf.py:46 msgid "Udder" msgstr "Udder" -#: conf/conf.py:47 +#: awx/conf/conf.py:47 msgid "Vader Koala" msgstr "Vader Koala" -#: conf/conf.py:48 +#: awx/conf/conf.py:48 msgid "Vader" msgstr "Vader" -#: conf/conf.py:49 +#: awx/conf/conf.py:49 msgid "WWW" msgstr "WWW" -#: conf/conf.py:52 +#: awx/conf/conf.py:52 msgid "Cow Selection" msgstr "Sélection cow" -#: conf/conf.py:53 +#: awx/conf/conf.py:53 msgid "Select which cow to use with cowsay when running jobs." msgstr "" "Sélectionnez quel cow utiliser avec cowsay lors de l'exécution de tâches." -#: conf/conf.py:54 conf/conf.py:75 +#: awx/conf/conf.py:54 +#: awx/conf/conf.py:75 msgid "Cows" msgstr "Cows" -#: conf/conf.py:73 +#: awx/conf/conf.py:73 msgid "Example Read-Only Setting" msgstr "Exemple de paramètre en lecture seule" -#: conf/conf.py:74 +#: awx/conf/conf.py:74 msgid "Example setting that cannot be changed." msgstr "L'exemple de paramètre ne peut pas être modifié." -#: conf/conf.py:93 +#: awx/conf/conf.py:93 msgid "Example Setting" msgstr "Exemple de paramètre" -#: conf/conf.py:94 +#: awx/conf/conf.py:94 msgid "Example setting which can be different for each user." msgstr "Exemple de paramètre qui peut être différent pour chaque utilisateur." -#: conf/conf.py:95 conf/registry.py:67 conf/views.py:46 +#: awx/conf/conf.py:95 +#: awx/conf/registry.py:76 +#: awx/conf/views.py:46 msgid "User" msgstr "Utilisateur" -#: conf/fields.py:38 +#: awx/conf/fields.py:38 msgid "Enter a valid URL" msgstr "Entez une URL valide" -#: conf/license.py:19 +#: awx/conf/license.py:19 msgid "Your Tower license does not allow that." msgstr "Votre licence Tower ne vous y autorise pas." -#: conf/management/commands/migrate_to_database_settings.py:41 +#: awx/conf/management/commands/migrate_to_database_settings.py:41 msgid "Only show which settings would be commented/migrated." msgstr "" "Afficher seulement les paramètres qui pourraient être commentés/migrés." -#: conf/management/commands/migrate_to_database_settings.py:48 +#: awx/conf/management/commands/migrate_to_database_settings.py:48 msgid "" "Skip over settings that would raise an error when commenting/migrating." msgstr "" -"Ignorer les paramètres qui pourraient provoquer une erreur lors de la saisie" -" de commentaires/de la migration." +"Ignorer les paramètres qui pourraient provoquer une erreur lors de la saisie " +"de commentaires/de la migration." -#: conf/management/commands/migrate_to_database_settings.py:55 +#: awx/conf/management/commands/migrate_to_database_settings.py:55 msgid "Skip commenting out settings in files." msgstr "Ignorer la saisie de commentaires de paramètres dans les fichiers." -#: conf/management/commands/migrate_to_database_settings.py:61 +#: awx/conf/management/commands/migrate_to_database_settings.py:61 msgid "Backup existing settings files with this suffix." msgstr "Sauvegardez les fichiers de paramètres existants avec ce suffixe." -#: conf/registry.py:55 +#: awx/conf/registry.py:64 +#: awx/conf/tests/unit/test_registry.py:169 +#: awx/conf/tests/unit/test_registry.py:192 +#: awx/conf/tests/unit/test_registry.py:196 +#: awx/conf/tests/unit/test_registry.py:201 +#: awx/conf/tests/unit/test_registry.py:208 msgid "All" msgstr "Tous" -#: conf/registry.py:56 +#: awx/conf/registry.py:65 +#: awx/conf/tests/unit/test_registry.py:170 +#: awx/conf/tests/unit/test_registry.py:193 +#: awx/conf/tests/unit/test_registry.py:197 +#: awx/conf/tests/unit/test_registry.py:202 +#: awx/conf/tests/unit/test_registry.py:209 msgid "Changed" msgstr "Modifié" -#: conf/registry.py:68 +#: awx/conf/registry.py:77 msgid "User-Defaults" msgstr "Paramètres utilisateur par défaut" -#: conf/views.py:38 +#: awx/conf/tests/unit/test_registry.py:46 +#: awx/conf/tests/unit/test_registry.py:56 +#: awx/conf/tests/unit/test_registry.py:72 +#: awx/conf/tests/unit/test_registry.py:87 +#: awx/conf/tests/unit/test_registry.py:100 +#: awx/conf/tests/unit/test_registry.py:106 +#: awx/conf/tests/unit/test_registry.py:126 +#: awx/conf/tests/unit/test_registry.py:140 +#: awx/conf/tests/unit/test_registry.py:146 +#: awx/conf/tests/unit/test_registry.py:159 +#: awx/conf/tests/unit/test_registry.py:171 +#: awx/conf/tests/unit/test_registry.py:180 +#: awx/conf/tests/unit/test_registry.py:198 +#: awx/conf/tests/unit/test_registry.py:210 +#: awx/conf/tests/unit/test_registry.py:219 +#: awx/conf/tests/unit/test_registry.py:225 +#: awx/conf/tests/unit/test_registry.py:237 +#: awx/conf/tests/unit/test_registry.py:245 +#: awx/conf/tests/unit/test_registry.py:288 +#: awx/conf/tests/unit/test_registry.py:306 +#: awx/conf/tests/unit/test_settings.py:67 +#: awx/conf/tests/unit/test_settings.py:81 +#: awx/conf/tests/unit/test_settings.py:97 +#: awx/conf/tests/unit/test_settings.py:110 +#: awx/conf/tests/unit/test_settings.py:127 +#: awx/conf/tests/unit/test_settings.py:143 +#: awx/conf/tests/unit/test_settings.py:162 +#: awx/conf/tests/unit/test_settings.py:183 +#: awx/conf/tests/unit/test_settings.py:197 +#: awx/conf/tests/unit/test_settings.py:221 +#: awx/conf/tests/unit/test_settings.py:241 +#: awx/conf/tests/unit/test_settings.py:258 +#: awx/main/conf.py:19 +#: awx/main/conf.py:29 +#: awx/main/conf.py:39 +#: awx/main/conf.py:48 +#: awx/main/conf.py:60 +#: awx/main/conf.py:78 +#: awx/main/conf.py:103 +msgid "System" +msgstr "Système" + +#: awx/conf/tests/unit/test_registry.py:165 +#: awx/conf/tests/unit/test_registry.py:172 +#: awx/conf/tests/unit/test_registry.py:187 +#: awx/conf/tests/unit/test_registry.py:203 +#: awx/conf/tests/unit/test_registry.py:211 +msgid "OtherSystem" +msgstr "Autre Système" + +#: awx/conf/views.py:38 msgid "Setting Categories" msgstr "Catégories de paramètre" -#: conf/views.py:61 +#: awx/conf/views.py:61 msgid "Setting Detail" msgstr "Détails du paramètre" -#: main/access.py:255 +#: awx/main/access.py:255 #, python-format msgid "Bad data found in related field %s." msgstr "Données incorrectes trouvées dans le champ %s associé." -#: main/access.py:296 +#: awx/main/access.py:296 msgid "License is missing." msgstr "La licence est manquante." -#: main/access.py:298 +#: awx/main/access.py:298 msgid "License has expired." msgstr "La licence est arrivée à expiration." -#: main/access.py:303 +#: awx/main/access.py:306 #, python-format msgid "License count of %s instances has been reached." msgstr "Le nombre de licences d'instances %s a été atteint." -#: main/access.py:305 +#: awx/main/access.py:308 #, python-format msgid "License count of %s instances has been exceeded." msgstr "Le nombre de licences d'instances %s a été dépassé." -#: main/access.py:307 +#: awx/main/access.py:310 msgid "Host count exceeds available instances." msgstr "Le nombre d'hôtes dépasse celui des instances disponibles." -#: main/access.py:311 +#: awx/main/access.py:314 #, python-format msgid "Feature %s is not enabled in the active license." msgstr "La fonctionnalité %s n'est pas activée dans la licence active." -#: main/access.py:313 +#: awx/main/access.py:316 msgid "Features not found in active license." msgstr "Fonctionnalités introuvables dans la licence active." -#: main/access.py:511 main/access.py:578 main/access.py:698 main/access.py:961 -#: main/access.py:1200 main/access.py:1597 +#: awx/main/access.py:514 +#: awx/main/access.py:581 +#: awx/main/access.py:706 +#: awx/main/access.py:969 +#: awx/main/access.py:1208 +#: awx/main/access.py:1605 msgid "Resource is being used by running jobs" msgstr "La ressource est utilisée par des tâches en cours d'exécution" -#: main/access.py:622 +#: awx/main/access.py:625 msgid "Unable to change inventory on a host." msgstr "Impossible de modifier l'inventaire sur un hôte." -#: main/access.py:634 main/access.py:679 +#: awx/main/access.py:642 +#: awx/main/access.py:687 msgid "Cannot associate two items from different inventories." msgstr "Impossible d'associer deux éléments d'inventaires différents." -#: main/access.py:667 +#: awx/main/access.py:675 msgid "Unable to change inventory on a group." msgstr "Impossible de modifier l'inventaire sur un groupe." -#: main/access.py:881 +#: awx/main/access.py:889 msgid "Unable to change organization on a team." msgstr "Impossible de modifier l'organisation d'une équipe." -#: main/access.py:894 +#: awx/main/access.py:902 msgid "The {} role cannot be assigned to a team" msgstr "Le rôle {} ne peut pas être attribué à une équipe" -#: main/access.py:896 +#: awx/main/access.py:904 msgid "The admin_role for a User cannot be assigned to a team" msgstr "L'admin_role d'un utilisateur ne peut pas être attribué à une équipe" -#: main/access.py:1670 +#: awx/main/access.py:1678 msgid "" "You do not have permission to the workflow job resources required for " "relaunch." msgstr "" +"Vous n'avez pas la permission pour accéder aux permissions de tâche de " +"workflow requises pour le second lancement." -#: main/apps.py:9 +#: awx/main/apps.py:9 msgid "Main" msgstr "Principal" -#: main/conf.py:17 +#: awx/main/conf.py:17 msgid "Enable Activity Stream" msgstr "Activer le flux d'activité" -#: main/conf.py:18 +#: awx/main/conf.py:18 msgid "Enable capturing activity for the Tower activity stream." msgstr "Activer la capture d'activités pour le flux d'activité Tower." -#: main/conf.py:19 main/conf.py:29 main/conf.py:39 main/conf.py:48 -#: main/conf.py:60 main/conf.py:78 main/conf.py:103 -msgid "System" -msgstr "Système" - -#: main/conf.py:27 +#: awx/main/conf.py:27 msgid "Enable Activity Stream for Inventory Sync" msgstr "Activer le flux d'activité pour la synchronisation des inventaires" -#: main/conf.py:28 +#: awx/main/conf.py:28 msgid "" "Enable capturing activity for the Tower activity stream when running " "inventory sync." @@ -1066,12 +1170,12 @@ msgstr "" "Activer la capture d'activités pour le flux d'activité Tower lors de la " "synchronisation des inventaires." -#: main/conf.py:37 +#: awx/main/conf.py:37 msgid "All Users Visible to Organization Admins" msgstr "" "Tous les utilisateurs visibles pour les administrateurs de l'organisation" -#: main/conf.py:38 +#: awx/main/conf.py:38 msgid "" "Controls whether any Organization Admin can view all users, even those not " "associated with their Organization." @@ -1079,11 +1183,11 @@ msgstr "" "Contrôle si un administrateur d'organisation peut ou non afficher tous les " "utilisateurs, même ceux qui ne sont pas associés à son organisation." -#: main/conf.py:46 +#: awx/main/conf.py:46 msgid "Enable Tower Administrator Alerts" msgstr "Activer les alertes administrateur de Tower" -#: main/conf.py:47 +#: awx/main/conf.py:47 msgid "" "Allow Tower to email Admin users for system events that may require " "attention." @@ -1091,47 +1195,53 @@ msgstr "" "Autoriser Tower à alerter les administrateurs par email concernant des " "événements système susceptibles de mériter leur attention." -#: main/conf.py:57 +#: awx/main/conf.py:57 msgid "Base URL of the Tower host" msgstr "URL de base pour l'hôte Tower" -#: main/conf.py:58 +#: awx/main/conf.py:58 msgid "" -"This setting is used by services like notifications to render a valid url to" -" the Tower host." +"This setting is used by services like notifications to render a valid url to " +"the Tower host." msgstr "" "Ce paramètre est utilisé par des services sous la forme de notifications " "permettant de rendre valide une URL pour l'hôte Tower." -#: main/conf.py:67 +#: awx/main/conf.py:67 msgid "Remote Host Headers" msgstr "En-têtes d'hôte distant" -#: main/conf.py:68 +#: awx/main/conf.py:68 msgid "" -"HTTP headers and meta keys to search to determine remote host name or IP. Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if behind a reverse proxy.\n" +"HTTP headers and meta keys to search to determine remote host name or IP. " +"Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if " +"behind a reverse proxy.\n" "\n" -"Note: The headers will be searched in order and the first found remote host name or IP will be used.\n" +"Note: The headers will be searched in order and the first found remote host " +"name or IP will be used.\n" "\n" "In the below example 8.8.8.7 would be the chosen IP address.\n" "X-Forwarded-For: 8.8.8.7, 192.168.2.1, 127.0.0.1\n" "Host: 127.0.0.1\n" "REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']" msgstr "" -"En-têtes HTTP et méta-clés à rechercher afin de déterminer le nom ou l'adresse IP d'un hôte distant. Ajoutez des éléments supplémentaires à cette liste, tels que \"HTTP_X_FORWARDED_FOR\", en présence d'un proxy inverse.\n" +"En-têtes HTTP et méta-clés à rechercher afin de déterminer le nom ou " +"l'adresse IP d'un hôte distant. Ajoutez des éléments supplémentaires à cette " +"liste, tels que \"HTTP_X_FORWARDED_FOR\", en présence d'un proxy inverse.\n" "\n" -"Remarque : les en-têtes seront recherchés dans l'ordre, et le premier nom ou la première adresse IP d'hôte distant trouvé(e) sera utilisé(e).\n" +"Remarque : les en-têtes seront recherchés dans l'ordre, et le premier nom ou " +"la première adresse IP d'hôte distant trouvé(e) sera utilisé(e).\n" "\n" "Dans l'exemple ci-dessous 8.8.8.7 est l'adresse IP choisie. \n" "X-Forwarded-For : 8.8.8.7, 192.168.2.1, 127.0.0.1\n" "Hôte : 127.0.0.1\n" "REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']" -#: main/conf.py:99 +#: awx/main/conf.py:99 msgid "Tower License" msgstr "Licence Tower" -#: main/conf.py:100 +#: awx/main/conf.py:100 msgid "" "The license controls which features and functionality are enabled in Tower. " "Use /api/v1/config/ to update or change the license." @@ -1140,25 +1250,34 @@ msgstr "" "dans Tower. Utilisez /api/v1/config/ pour mettre à jour ou modifier la " "licence." -#: main/conf.py:110 +#: awx/main/conf.py:110 msgid "Ansible Modules Allowed for Ad Hoc Jobs" msgstr "Modules Ansible autorisés pour des tâches ad hoc" -#: main/conf.py:111 +#: awx/main/conf.py:111 msgid "List of modules allowed to be used by ad-hoc jobs." msgstr "Liste des modules que des tâches ad hoc sont autorisées à utiliser." -#: main/conf.py:112 main/conf.py:121 main/conf.py:130 main/conf.py:140 -#: main/conf.py:150 main/conf.py:160 main/conf.py:170 main/conf.py:180 -#: main/conf.py:190 main/conf.py:202 main/conf.py:214 main/conf.py:226 +#: awx/main/conf.py:112 +#: awx/main/conf.py:121 +#: awx/main/conf.py:130 +#: awx/main/conf.py:140 +#: awx/main/conf.py:150 +#: awx/main/conf.py:160 +#: awx/main/conf.py:170 +#: awx/main/conf.py:180 +#: awx/main/conf.py:190 +#: awx/main/conf.py:202 +#: awx/main/conf.py:214 +#: awx/main/conf.py:226 msgid "Jobs" msgstr "Tâches" -#: main/conf.py:119 +#: awx/main/conf.py:119 msgid "Enable job isolation" msgstr "Activer l'isolement des tâches" -#: main/conf.py:120 +#: awx/main/conf.py:120 msgid "" "Isolates an Ansible job from protected parts of the Tower system to prevent " "exposing sensitive information." @@ -1166,55 +1285,55 @@ msgstr "" "Permet d'isoler une tâche Ansible des parties protégées du système Tower " "pour éviter l'exposition d'informations sensibles." -#: main/conf.py:128 +#: awx/main/conf.py:128 msgid "Job isolation execution path" msgstr "Chemin d'exécution pour l'isolement des tâches" -#: main/conf.py:129 +#: awx/main/conf.py:129 msgid "" "Create temporary working directories for isolated jobs in this location." msgstr "" "Créez des répertoires de travail temporaires pour les tâches isolées à cet " "emplacement." -#: main/conf.py:138 +#: awx/main/conf.py:138 msgid "Paths to hide from isolated jobs" msgstr "Chemins à dissimuler des tâches isolées" -#: main/conf.py:139 +#: awx/main/conf.py:139 msgid "Additional paths to hide from isolated processes." msgstr "Chemins supplémentaires à dissimuler des processus isolés." -#: main/conf.py:148 +#: awx/main/conf.py:148 msgid "Paths to expose to isolated jobs" msgstr "Chemins à exposer aux tâches isolées" -#: main/conf.py:149 +#: awx/main/conf.py:149 msgid "" -"Whitelist of paths that would otherwise be hidden to expose to isolated " -"jobs." +"Whitelist of paths that would otherwise be hidden to expose to isolated jobs." +"" msgstr "" "Liste blanche des chemins qui seraient autrement dissimulés de façon à ne " "pas être exposés aux tâches isolées." -#: main/conf.py:158 +#: awx/main/conf.py:158 msgid "Standard Output Maximum Display Size" msgstr "Taille d'affichage maximale pour une sortie standard" -#: main/conf.py:159 +#: awx/main/conf.py:159 msgid "" "Maximum Size of Standard Output in bytes to display before requiring the " "output be downloaded." msgstr "" -"Taille maximale d'une sortie standard en octets à afficher avant de demander" -" le téléchargement de la sortie." +"Taille maximale d'une sortie standard en octets à afficher avant de demander " +"le téléchargement de la sortie." -#: main/conf.py:168 +#: awx/main/conf.py:168 msgid "Job Event Standard Output Maximum Display Size" msgstr "" "Taille d'affichage maximale pour une sortie standard d'événement de tâche" -#: main/conf.py:169 +#: awx/main/conf.py:169 msgid "" "Maximum Size of Standard Output in bytes to display for a single job or ad " "hoc command event. `stdout` will end with `…` when truncated." @@ -1223,11 +1342,11 @@ msgstr "" "tâche ou pour un seul événement de commande ad hoc. `stdout` se terminera " "par `...` quand il sera tronqué." -#: main/conf.py:178 +#: awx/main/conf.py:178 msgid "Maximum Scheduled Jobs" msgstr "Nombre max. de tâches planifiées" -#: main/conf.py:179 +#: awx/main/conf.py:179 msgid "" "Maximum number of the same job template that can be waiting to run when " "launching from a schedule before no more are created." @@ -1236,11 +1355,11 @@ msgstr "" "d'exécution lors de son lancement à partir d'un calendrier, avant que " "d'autres ne soient créés." -#: main/conf.py:188 +#: awx/main/conf.py:188 msgid "Ansible Callback Plugins" msgstr "Plug-ins de rappel Ansible" -#: main/conf.py:189 +#: awx/main/conf.py:189 msgid "" "List of paths to search for extra callback plugins to be used when running " "jobs." @@ -1248,25 +1367,25 @@ msgstr "" "Liste des chemins servant à rechercher d'autres plug-ins de rappel qui " "serviront lors de l'exécution de tâches." -#: main/conf.py:199 +#: awx/main/conf.py:199 msgid "Default Job Timeout" msgstr "Délai d'attente par défaut des tâches" -#: main/conf.py:200 +#: awx/main/conf.py:200 msgid "" "Maximum time to allow jobs to run. Use value of 0 to indicate that no " "timeout should be imposed. A timeout set on an individual job template will " "override this." msgstr "" "Délai maximal d'exécution des tâches. Utilisez la valeur 0 pour indiquer " -"qu'aucun délai ne doit être imposé. Un délai d'attente défini sur celui d'un" -" modèle de tâche précis écrasera cette valeur." +"qu'aucun délai ne doit être imposé. Un délai d'attente défini sur celui d'un " +"modèle de tâche précis écrasera cette valeur." -#: main/conf.py:211 +#: awx/main/conf.py:211 msgid "Default Inventory Update Timeout" msgstr "Délai d'attente par défaut pour la mise à jour d'inventaire" -#: main/conf.py:212 +#: awx/main/conf.py:212 msgid "" "Maximum time to allow inventory updates to run. Use value of 0 to indicate " "that no timeout should be imposed. A timeout set on an individual inventory " @@ -1276,11 +1395,11 @@ msgstr "" "0 pour indiquer qu'aucun délai ne doit être imposé. Un délai d'attente " "défini sur celui d'une source d'inventaire précise écrasera cette valeur." -#: main/conf.py:223 +#: awx/main/conf.py:223 msgid "Default Project Update Timeout" msgstr "Délai d'attente par défaut pour la mise à jour de projet" -#: main/conf.py:224 +#: awx/main/conf.py:224 msgid "" "Maximum time to allow project updates to run. Use value of 0 to indicate " "that no timeout should be imposed. A timeout set on an individual project " @@ -1290,305 +1409,355 @@ msgstr "" "pour indiquer qu'aucun délai ne doit être imposé. Un délai d'attente défini " "sur celui d'un projet précis écrasera cette valeur." -#: main/conf.py:234 +#: awx/main/conf.py:234 msgid "Logging Aggregator" -msgstr "" +msgstr "Agrégateur de journalisation" -#: main/conf.py:235 +#: awx/main/conf.py:235 msgid "Hostname/IP where external logs will be sent to." -msgstr "" +msgstr "Nom d'hôte / IP où les journaux externes seront envoyés." -#: main/conf.py:236 main/conf.py:245 main/conf.py:255 main/conf.py:264 -#: main/conf.py:274 main/conf.py:288 main/conf.py:300 main/conf.py:309 +#: awx/main/conf.py:236 +#: awx/main/conf.py:245 +#: awx/main/conf.py:255 +#: awx/main/conf.py:264 +#: awx/main/conf.py:274 +#: awx/main/conf.py:288 +#: awx/main/conf.py:300 +#: awx/main/conf.py:309 msgid "Logging" msgstr "Journalisation" -#: main/conf.py:243 +#: awx/main/conf.py:243 msgid "Logging Aggregator Port" -msgstr "" +msgstr "Port d'agrégateur de journalisation" -#: main/conf.py:244 +#: awx/main/conf.py:244 msgid "Port on Logging Aggregator to send logs to (if required)." msgstr "" +"Port d'agrégateur de journalisation où envoyer les journaux (le cas échéant)." +"" -#: main/conf.py:253 +#: awx/main/conf.py:253 msgid "Logging Aggregator Type" -msgstr "" +msgstr "Type d'agrégateur de journalisation" -#: main/conf.py:254 +#: awx/main/conf.py:254 msgid "Format messages for the chosen log aggregator." msgstr "" +"Formater les messages pour l'agrégateur de journalisation que vous aurez " +"choisi." -#: main/conf.py:262 +#: awx/main/conf.py:262 msgid "Logging Aggregator Username" -msgstr "" +msgstr "Nom d'utilisateur de l'agrégateur de journalisation" -#: main/conf.py:263 +#: awx/main/conf.py:263 msgid "Username for external log aggregator (if required)." msgstr "" +"Nom d'utilisateur pour agrégateur de journalisation externe (le cas échéant)." +"" -#: main/conf.py:272 +#: awx/main/conf.py:272 msgid "Logging Aggregator Password/Token" -msgstr "" +msgstr "Mot de passe / Jeton d'agrégateur de journalisation" -#: main/conf.py:273 +#: awx/main/conf.py:273 msgid "" "Password or authentication token for external log aggregator (if required)." msgstr "" +"Mot de passe ou jeton d'authentification d'agrégateur de journalisation " +"externe (le cas échéant)." -#: main/conf.py:281 +#: awx/main/conf.py:281 msgid "Loggers to send data to the log aggregator from" msgstr "" "Journaliseurs à partir duquel envoyer des données à l'agrégateur de journaux" -#: main/conf.py:282 +#: awx/main/conf.py:282 msgid "" -"List of loggers that will send HTTP logs to the collector, these can include any or all of: \n" +"List of loggers that will send HTTP logs to the collector, these can include " +"any or all of: \n" "awx - Tower service logs\n" "activity_stream - activity stream records\n" "job_events - callback data from Ansible job events\n" "system_tracking - facts gathered from scan jobs." msgstr "" +"Liste des journaliseurs qui enverront des journaux HTTP au collecteur " +"notamment (tous les types ou certains seulement) : \n" +"awx - journaux de service Tower\n" +"activity_stream - enregistrements de flux d'activité " +" job_events - " +"données de rappel issues d'événements de tâche Ansible\n" +"system_tracking - données générées par des tâches de scan." -#: main/conf.py:295 +#: awx/main/conf.py:295 msgid "Log System Tracking Facts Individually" -msgstr "" +msgstr "Système de journalisation traçant des facts individuellement" -#: main/conf.py:296 +#: awx/main/conf.py:296 msgid "" "If set, system tracking facts will be sent for each package, service, " -"orother item found in a scan, allowing for greater search query granularity." -" If unset, facts will be sent as a single dictionary, allowing for greater " +"orother item found in a scan, allowing for greater search query granularity. " +"If unset, facts will be sent as a single dictionary, allowing for greater " "efficiency in fact processing." msgstr "" +"Si défini, les facts de traçage de système seront envoyés pour chaque " +"package, service, ou autre item se trouvant dans un scan, ce qui permet une " +"meilleure granularité de recherche. Si non définis, les facts seront envoyés " +"sous forme de dictionnaire unique, ce qui permet une meilleure efficacité du " +"processus pour les facts." -#: main/conf.py:307 +#: awx/main/conf.py:307 msgid "Enable External Logging" -msgstr "" +msgstr "Activer la journalisation externe" -#: main/conf.py:308 +#: awx/main/conf.py:308 msgid "Enable sending logs to external log aggregator." -msgstr "" +msgstr "Activer l'envoi de journaux à un agrégateur de journaux externe." -#: main/models/activity_stream.py:22 +#: awx/main/models/activity_stream.py:22 msgid "Entity Created" msgstr "Entité créée" -#: main/models/activity_stream.py:23 +#: awx/main/models/activity_stream.py:23 msgid "Entity Updated" msgstr "Entité mise à jour" -#: main/models/activity_stream.py:24 +#: awx/main/models/activity_stream.py:24 msgid "Entity Deleted" msgstr "Entité supprimée" -#: main/models/activity_stream.py:25 +#: awx/main/models/activity_stream.py:25 msgid "Entity Associated with another Entity" msgstr "Entité associée à une autre entité" -#: main/models/activity_stream.py:26 +#: awx/main/models/activity_stream.py:26 msgid "Entity was Disassociated with another Entity" msgstr "Entité dissociée d'une autre entité" -#: main/models/ad_hoc_commands.py:96 +#: awx/main/models/ad_hoc_commands.py:96 msgid "No valid inventory." msgstr "Aucun inventaire valide." -#: main/models/ad_hoc_commands.py:103 main/models/jobs.py:161 +#: awx/main/models/ad_hoc_commands.py:103 +#: awx/main/models/jobs.py:161 msgid "You must provide a machine / SSH credential." msgstr "Vous devez fournir des informations d'identification machine / SSH." -#: main/models/ad_hoc_commands.py:114 main/models/ad_hoc_commands.py:122 +#: awx/main/models/ad_hoc_commands.py:114 +#: awx/main/models/ad_hoc_commands.py:122 msgid "Invalid type for ad hoc command" msgstr "Type non valide pour la commande ad hoc" -#: main/models/ad_hoc_commands.py:117 +#: awx/main/models/ad_hoc_commands.py:117 msgid "Unsupported module for ad hoc commands." msgstr "Module non pris en charge pour les commandes ad hoc." -#: main/models/ad_hoc_commands.py:125 +#: awx/main/models/ad_hoc_commands.py:125 #, python-format msgid "No argument passed to %s module." msgstr "Aucun argument transmis au module %s." -#: main/models/ad_hoc_commands.py:222 main/models/jobs.py:763 +#: awx/main/models/ad_hoc_commands.py:222 +#: awx/main/models/jobs.py:763 msgid "Host Failed" msgstr "Échec de l'hôte" -#: main/models/ad_hoc_commands.py:223 main/models/jobs.py:764 +#: awx/main/models/ad_hoc_commands.py:223 +#: awx/main/models/jobs.py:764 msgid "Host OK" msgstr "Hôte OK" -#: main/models/ad_hoc_commands.py:224 main/models/jobs.py:767 +#: awx/main/models/ad_hoc_commands.py:224 +#: awx/main/models/jobs.py:767 msgid "Host Unreachable" msgstr "Hôte inaccessible" -#: main/models/ad_hoc_commands.py:229 main/models/jobs.py:766 +#: awx/main/models/ad_hoc_commands.py:229 +#: awx/main/models/jobs.py:766 msgid "Host Skipped" msgstr "Hôte ignoré" -#: main/models/ad_hoc_commands.py:239 main/models/jobs.py:794 +#: awx/main/models/ad_hoc_commands.py:239 +#: awx/main/models/jobs.py:794 msgid "Debug" msgstr "Déboguer" -#: main/models/ad_hoc_commands.py:240 main/models/jobs.py:795 +#: awx/main/models/ad_hoc_commands.py:240 +#: awx/main/models/jobs.py:795 msgid "Verbose" msgstr "Verbeux" -#: main/models/ad_hoc_commands.py:241 main/models/jobs.py:796 +#: awx/main/models/ad_hoc_commands.py:241 +#: awx/main/models/jobs.py:796 msgid "Deprecated" msgstr "Obsolète" -#: main/models/ad_hoc_commands.py:242 main/models/jobs.py:797 +#: awx/main/models/ad_hoc_commands.py:242 +#: awx/main/models/jobs.py:797 msgid "Warning" msgstr "Avertissement" -#: main/models/ad_hoc_commands.py:243 main/models/jobs.py:798 +#: awx/main/models/ad_hoc_commands.py:243 +#: awx/main/models/jobs.py:798 msgid "System Warning" msgstr "Avertissement système" -#: main/models/ad_hoc_commands.py:244 main/models/jobs.py:799 -#: main/models/unified_jobs.py:64 +#: awx/main/models/ad_hoc_commands.py:244 +#: awx/main/models/jobs.py:799 +#: awx/main/models/unified_jobs.py:64 msgid "Error" msgstr "Erreur" -#: main/models/base.py:45 main/models/base.py:51 main/models/base.py:56 +#: awx/main/models/base.py:45 +#: awx/main/models/base.py:51 +#: awx/main/models/base.py:56 msgid "Run" msgstr "Exécuter" -#: main/models/base.py:46 main/models/base.py:52 main/models/base.py:57 +#: awx/main/models/base.py:46 +#: awx/main/models/base.py:52 +#: awx/main/models/base.py:57 msgid "Check" msgstr "Vérifier" -#: main/models/base.py:47 +#: awx/main/models/base.py:47 msgid "Scan" msgstr "Scanner" -#: main/models/base.py:61 +#: awx/main/models/base.py:61 msgid "Read Inventory" msgstr "Lire l'inventaire" -#: main/models/base.py:62 +#: awx/main/models/base.py:62 msgid "Edit Inventory" msgstr "Modifier l'inventaire" -#: main/models/base.py:63 +#: awx/main/models/base.py:63 msgid "Administrate Inventory" msgstr "Administrer l'inventaire" -#: main/models/base.py:64 +#: awx/main/models/base.py:64 msgid "Deploy To Inventory" msgstr "Déployer dans l'inventaire" -#: main/models/base.py:65 +#: awx/main/models/base.py:65 msgid "Deploy To Inventory (Dry Run)" msgstr "Déployer dans l'inventaire (test uniquement)" -#: main/models/base.py:66 +#: awx/main/models/base.py:66 msgid "Scan an Inventory" msgstr "Scanner un inventaire" -#: main/models/base.py:67 +#: awx/main/models/base.py:67 msgid "Create a Job Template" msgstr "Créer un modèle de tâche" -#: main/models/credential.py:33 +#: awx/main/models/credential.py:33 msgid "Machine" msgstr "Machine" -#: main/models/credential.py:34 +#: awx/main/models/credential.py:34 msgid "Network" msgstr "Réseau" -#: main/models/credential.py:35 +#: awx/main/models/credential.py:35 msgid "Source Control" msgstr "Contrôle de la source" -#: main/models/credential.py:36 +#: awx/main/models/credential.py:36 msgid "Amazon Web Services" msgstr "Amazon Web Services" -#: main/models/credential.py:37 +#: awx/main/models/credential.py:37 msgid "Rackspace" msgstr "Rackspace" -#: main/models/credential.py:38 main/models/inventory.py:713 +#: awx/main/models/credential.py:38 +#: awx/main/models/inventory.py:713 msgid "VMware vCenter" msgstr "VMware vCenter" -#: main/models/credential.py:39 main/models/inventory.py:714 +#: awx/main/models/credential.py:39 +#: awx/main/models/inventory.py:714 msgid "Red Hat Satellite 6" msgstr "Red Hat Satellite 6" -#: main/models/credential.py:40 main/models/inventory.py:715 +#: awx/main/models/credential.py:40 +#: awx/main/models/inventory.py:715 msgid "Red Hat CloudForms" msgstr "Red Hat CloudForms" -#: main/models/credential.py:41 main/models/inventory.py:710 +#: awx/main/models/credential.py:41 +#: awx/main/models/inventory.py:710 msgid "Google Compute Engine" msgstr "Google Compute Engine" -#: main/models/credential.py:42 main/models/inventory.py:711 +#: awx/main/models/credential.py:42 +#: awx/main/models/inventory.py:711 msgid "Microsoft Azure Classic (deprecated)" msgstr "Microsoft Azure Classic (obsolète)" -#: main/models/credential.py:43 main/models/inventory.py:712 +#: awx/main/models/credential.py:43 +#: awx/main/models/inventory.py:712 msgid "Microsoft Azure Resource Manager" msgstr "Microsoft Azure Resource Manager" -#: main/models/credential.py:44 main/models/inventory.py:716 +#: awx/main/models/credential.py:44 +#: awx/main/models/inventory.py:716 msgid "OpenStack" msgstr "OpenStack" -#: main/models/credential.py:48 +#: awx/main/models/credential.py:48 msgid "None" msgstr "Aucun" -#: main/models/credential.py:49 +#: awx/main/models/credential.py:49 msgid "Sudo" msgstr "Sudo" -#: main/models/credential.py:50 +#: awx/main/models/credential.py:50 msgid "Su" msgstr "Su" -#: main/models/credential.py:51 +#: awx/main/models/credential.py:51 msgid "Pbrun" msgstr "Pbrun" -#: main/models/credential.py:52 +#: awx/main/models/credential.py:52 msgid "Pfexec" msgstr "Pfexec" -#: main/models/credential.py:53 +#: awx/main/models/credential.py:53 msgid "DZDO" -msgstr "" +msgstr "DZDO" -#: main/models/credential.py:54 +#: awx/main/models/credential.py:54 msgid "Pmrun" -msgstr "" +msgstr "Pmrun" -#: main/models/credential.py:103 +#: awx/main/models/credential.py:103 msgid "Host" msgstr "Hôte" -#: main/models/credential.py:104 +#: awx/main/models/credential.py:104 msgid "The hostname or IP address to use." msgstr "Nom d'hôte ou adresse IP à utiliser." -#: main/models/credential.py:110 +#: awx/main/models/credential.py:110 msgid "Username" msgstr "Nom d'utilisateur" -#: main/models/credential.py:111 +#: awx/main/models/credential.py:111 msgid "Username for this credential." msgstr "Nom d'utilisateur pour ces informations d'identification." -#: main/models/credential.py:117 +#: awx/main/models/credential.py:117 msgid "Password" msgstr "Mot de passe" -#: main/models/credential.py:118 +#: awx/main/models/credential.py:118 msgid "" "Password for this credential (or \"ASK\" to prompt the user for machine " "credentials)." @@ -1596,43 +1765,43 @@ msgstr "" "Mot de passe pour ces informations d'identification (ou \"ASK\" pour " "demander à l'utilisateur les informations d'identification de la machine)." -#: main/models/credential.py:125 +#: awx/main/models/credential.py:125 msgid "Security Token" msgstr "Token de sécurité" -#: main/models/credential.py:126 +#: awx/main/models/credential.py:126 msgid "Security Token for this credential" msgstr "Token de sécurité pour ces informations d'identification" -#: main/models/credential.py:132 +#: awx/main/models/credential.py:132 msgid "Project" msgstr "Projet" -#: main/models/credential.py:133 +#: awx/main/models/credential.py:133 msgid "The identifier for the project." msgstr "Identifiant du projet." -#: main/models/credential.py:139 +#: awx/main/models/credential.py:139 msgid "Domain" msgstr "Domaine" -#: main/models/credential.py:140 +#: awx/main/models/credential.py:140 msgid "The identifier for the domain." msgstr "Identifiant du domaine." -#: main/models/credential.py:145 +#: awx/main/models/credential.py:145 msgid "SSH private key" msgstr "Clé privée SSH" -#: main/models/credential.py:146 +#: awx/main/models/credential.py:146 msgid "RSA or DSA private key to be used instead of password." msgstr "Clé privée RSA ou DSA à utiliser au lieu du mot de passe." -#: main/models/credential.py:152 +#: awx/main/models/credential.py:152 msgid "SSH key unlock" msgstr "Déverrouillage de la clé SSH" -#: main/models/credential.py:153 +#: awx/main/models/credential.py:153 msgid "" "Passphrase to unlock SSH private key if encrypted (or \"ASK\" to prompt the " "user for machine credentials)." @@ -1641,120 +1810,120 @@ msgstr "" "chiffrée (ou \"ASK\" pour demander à l'utilisateur les informations " "d'identification de la machine)." -#: main/models/credential.py:161 +#: awx/main/models/credential.py:161 msgid "Privilege escalation method." msgstr "Méthode d'élévation des privilèges." -#: main/models/credential.py:167 +#: awx/main/models/credential.py:167 msgid "Privilege escalation username." msgstr "Nom d'utilisateur pour l'élévation des privilèges" -#: main/models/credential.py:173 +#: awx/main/models/credential.py:173 msgid "Password for privilege escalation method." msgstr "Mot de passe pour la méthode d'élévation des privilèges." -#: main/models/credential.py:179 +#: awx/main/models/credential.py:179 msgid "Vault password (or \"ASK\" to prompt the user)." msgstr "Mot de passe Vault (ou \"ASK\" pour le demander à l'utilisateur)." -#: main/models/credential.py:183 +#: awx/main/models/credential.py:183 msgid "Whether to use the authorize mechanism." msgstr "Indique s'il faut ou non utiliser le mécanisme d'autorisation." -#: main/models/credential.py:189 +#: awx/main/models/credential.py:189 msgid "Password used by the authorize mechanism." msgstr "Mot de passe utilisé par le mécanisme d'autorisation." -#: main/models/credential.py:195 +#: awx/main/models/credential.py:195 msgid "Client Id or Application Id for the credential" msgstr "" "ID du client ou de l'application pour les informations d'identification" -#: main/models/credential.py:201 +#: awx/main/models/credential.py:201 msgid "Secret Token for this credential" msgstr "Token secret pour ces informations d'identification" -#: main/models/credential.py:207 +#: awx/main/models/credential.py:207 msgid "Subscription identifier for this credential" msgstr "ID d'abonnement pour ces informations d'identification" -#: main/models/credential.py:213 +#: awx/main/models/credential.py:213 msgid "Tenant identifier for this credential" msgstr "ID de tenant pour ces informations d'identification" -#: main/models/credential.py:283 +#: awx/main/models/credential.py:283 msgid "Host required for VMware credential." msgstr "Hôte requis pour les informations d'identification VMware." -#: main/models/credential.py:285 +#: awx/main/models/credential.py:285 msgid "Host required for OpenStack credential." msgstr "Hôte requis pour les informations d'identification OpenStack." -#: main/models/credential.py:294 +#: awx/main/models/credential.py:294 msgid "Access key required for AWS credential." msgstr "Clé d'accès requise pour les informations d'identification AWS." -#: main/models/credential.py:296 +#: awx/main/models/credential.py:296 msgid "Username required for Rackspace credential." msgstr "" "Nom d'utilisateur requis pour les informations d'identification Rackspace." -#: main/models/credential.py:299 +#: awx/main/models/credential.py:299 msgid "Username required for VMware credential." msgstr "" "Nom d'utilisateur requis pour les informations d'identification VMware." -#: main/models/credential.py:301 +#: awx/main/models/credential.py:301 msgid "Username required for OpenStack credential." msgstr "" "Nom d'utilisateur requis pour les informations d'identification OpenStack." -#: main/models/credential.py:307 +#: awx/main/models/credential.py:307 msgid "Secret key required for AWS credential." msgstr "Clé secrète requise pour les informations d'identification AWS." -#: main/models/credential.py:309 +#: awx/main/models/credential.py:309 msgid "API key required for Rackspace credential." msgstr "Clé API requise pour les informations d'identification Rackspace." -#: main/models/credential.py:311 +#: awx/main/models/credential.py:311 msgid "Password required for VMware credential." msgstr "Mot de passe requis pour les informations d'identification VMware." -#: main/models/credential.py:313 +#: awx/main/models/credential.py:313 msgid "Password or API key required for OpenStack credential." msgstr "" "Mot de passe ou clé API requis(e) pour les informations d'identification " "OpenStack." -#: main/models/credential.py:319 +#: awx/main/models/credential.py:319 msgid "Project name required for OpenStack credential." msgstr "" "Nom de projet requis pour les informations d'identification OpenStack." -#: main/models/credential.py:346 +#: awx/main/models/credential.py:346 msgid "SSH key unlock must be set when SSH key is encrypted." msgstr "" "Le déverrouillage de la clé SSH doit être défini lorsque la clé SSH est " "chiffrée." -#: main/models/credential.py:352 +#: awx/main/models/credential.py:352 msgid "Credential cannot be assigned to both a user and team." msgstr "" -"Les informations d'identification ne peuvent pas être attribuées à la fois à" -" un utilisateur et une équipe." +"Les informations d'identification ne peuvent pas être attribuées à la fois à " +"un utilisateur et une équipe." -#: main/models/fact.py:21 +#: awx/main/models/fact.py:21 msgid "Host for the facts that the fact scan captured." msgstr "Hôte pour les faits que le scan de faits a capturés." -#: main/models/fact.py:26 +#: awx/main/models/fact.py:26 msgid "Date and time of the corresponding fact scan gathering time." msgstr "" "Date et heure du scan de faits correspondant au moment de la collecte des " "faits." -#: main/models/fact.py:29 +#: awx/main/models/fact.py:29 msgid "" "Arbitrary JSON structure of module facts captured at timestamp for a single " "host." @@ -1762,77 +1931,77 @@ msgstr "" "Structure JSON arbitraire des faits de module capturés au moment de " "l'horodatage pour un seul hôte." -#: main/models/inventory.py:45 +#: awx/main/models/inventory.py:45 msgid "inventories" msgstr "inventaires" -#: main/models/inventory.py:52 +#: awx/main/models/inventory.py:52 msgid "Organization containing this inventory." msgstr "Organisation contenant cet inventaire." -#: main/models/inventory.py:58 +#: awx/main/models/inventory.py:58 msgid "Inventory variables in JSON or YAML format." msgstr "Variables d'inventaire au format JSON ou YAML." -#: main/models/inventory.py:63 +#: awx/main/models/inventory.py:63 msgid "Flag indicating whether any hosts in this inventory have failed." msgstr "Marqueur indiquant si les hôtes de cet inventaire ont échoué." -#: main/models/inventory.py:68 +#: awx/main/models/inventory.py:68 msgid "Total number of hosts in this inventory." msgstr "Nombre total d'hôtes dans cet inventaire." -#: main/models/inventory.py:73 +#: awx/main/models/inventory.py:73 msgid "Number of hosts in this inventory with active failures." msgstr "Nombre d'hôtes dans cet inventaire avec des échecs non résolus." -#: main/models/inventory.py:78 +#: awx/main/models/inventory.py:78 msgid "Total number of groups in this inventory." msgstr "Nombre total de groupes dans cet inventaire." -#: main/models/inventory.py:83 +#: awx/main/models/inventory.py:83 msgid "Number of groups in this inventory with active failures." msgstr "Nombre de groupes dans cet inventaire avec des échecs non résolus." -#: main/models/inventory.py:88 +#: awx/main/models/inventory.py:88 msgid "" "Flag indicating whether this inventory has any external inventory sources." msgstr "" "Marqueur indiquant si cet inventaire contient des sources d'inventaire " "externes." -#: main/models/inventory.py:93 +#: awx/main/models/inventory.py:93 msgid "" "Total number of external inventory sources configured within this inventory." msgstr "" "Nombre total de sources d'inventaire externes configurées dans cet " "inventaire." -#: main/models/inventory.py:98 +#: awx/main/models/inventory.py:98 msgid "Number of external inventory sources in this inventory with failures." msgstr "" "Nombre total de sources d'inventaire externes en échec dans cet inventaire." -#: main/models/inventory.py:339 +#: awx/main/models/inventory.py:339 msgid "Is this host online and available for running jobs?" msgstr "Cet hôte est-il en ligne et disponible pour exécuter des tâches ?" -#: main/models/inventory.py:345 +#: awx/main/models/inventory.py:345 msgid "" "The value used by the remote inventory source to uniquely identify the host" msgstr "" "Valeur utilisée par la source d'inventaire distante pour identifier l'hôte " "de façon unique" -#: main/models/inventory.py:350 +#: awx/main/models/inventory.py:350 msgid "Host variables in JSON or YAML format." msgstr "Variables d'hôte au format JSON ou YAML." -#: main/models/inventory.py:372 +#: awx/main/models/inventory.py:372 msgid "Flag indicating whether the last job failed for this host." msgstr "Marqueur indiquant si la dernière tâche a échoué pour cet hôte." -#: main/models/inventory.py:377 +#: awx/main/models/inventory.py:377 msgid "" "Flag indicating whether this host was created/updated from any external " "inventory sources." @@ -1840,42 +2009,42 @@ msgstr "" "Marqueur indiquant si cet hôte a été créé/mis à jour à partir de sources " "d'inventaire externes." -#: main/models/inventory.py:383 +#: awx/main/models/inventory.py:383 msgid "Inventory source(s) that created or modified this host." msgstr "Sources d'inventaire qui ont créé ou modifié cet hôte." -#: main/models/inventory.py:474 +#: awx/main/models/inventory.py:474 msgid "Group variables in JSON or YAML format." msgstr "Variables de groupe au format JSON ou YAML." -#: main/models/inventory.py:480 +#: awx/main/models/inventory.py:480 msgid "Hosts associated directly with this group." msgstr "Hôtes associés directement à ce groupe." -#: main/models/inventory.py:485 +#: awx/main/models/inventory.py:485 msgid "Total number of hosts directly or indirectly in this group." msgstr "" "Nombre total d'hôtes associés directement ou indirectement à ce groupe." -#: main/models/inventory.py:490 +#: awx/main/models/inventory.py:490 msgid "Flag indicating whether this group has any hosts with active failures." msgstr "" -"Marqueur indiquant si ce groupe possède ou non des hôtes avec des échecs non" -" résolus." +"Marqueur indiquant si ce groupe possède ou non des hôtes avec des échecs non " +"résolus." -#: main/models/inventory.py:495 +#: awx/main/models/inventory.py:495 msgid "Number of hosts in this group with active failures." msgstr "Nombre d'hôtes dans ce groupe avec des échecs non résolus." -#: main/models/inventory.py:500 +#: awx/main/models/inventory.py:500 msgid "Total number of child groups contained within this group." msgstr "Nombre total de groupes enfants compris dans ce groupe." -#: main/models/inventory.py:505 +#: awx/main/models/inventory.py:505 msgid "Number of child groups within this group that have active failures." msgstr "Nombre de groupes enfants dans ce groupe avec des échecs non résolus." -#: main/models/inventory.py:510 +#: awx/main/models/inventory.py:510 msgid "" "Flag indicating whether this group was created/updated from any external " "inventory sources." @@ -1883,36 +2052,37 @@ msgstr "" "Marqueur indiquant si ce groupe a été créé/mis à jour à partir de sources " "d'inventaire externes." -#: main/models/inventory.py:516 +#: awx/main/models/inventory.py:516 msgid "Inventory source(s) that created or modified this group." msgstr "Sources d'inventaire qui ont créé ou modifié ce groupe." -#: main/models/inventory.py:706 main/models/projects.py:42 -#: main/models/unified_jobs.py:402 +#: awx/main/models/inventory.py:706 +#: awx/main/models/projects.py:42 +#: awx/main/models/unified_jobs.py:402 msgid "Manual" msgstr "Manuel" -#: main/models/inventory.py:707 +#: awx/main/models/inventory.py:707 msgid "Local File, Directory or Script" msgstr "Fichier local, répertoire ou script" -#: main/models/inventory.py:708 +#: awx/main/models/inventory.py:708 msgid "Rackspace Cloud Servers" msgstr "Serveurs cloud Rackspace" -#: main/models/inventory.py:709 +#: awx/main/models/inventory.py:709 msgid "Amazon EC2" msgstr "Amazon EC2" -#: main/models/inventory.py:717 +#: awx/main/models/inventory.py:717 msgid "Custom Script" msgstr "Script personnalisé" -#: main/models/inventory.py:828 +#: awx/main/models/inventory.py:828 msgid "Inventory source variables in YAML or JSON format." msgstr "Variables de source d'inventaire au format JSON ou YAML." -#: main/models/inventory.py:847 +#: awx/main/models/inventory.py:847 msgid "" "Comma-separated list of filter expressions (EC2 only). Hosts are imported " "when ANY of the filters match." @@ -1920,91 +2090,91 @@ msgstr "" "Liste d'expressions de filtre séparées par des virgules (EC2 uniquement). " "Les hôtes sont importés lorsque l'UN des filtres correspondent." -#: main/models/inventory.py:853 +#: awx/main/models/inventory.py:853 msgid "Limit groups automatically created from inventory source (EC2 only)." msgstr "" -"Limiter automatiquement les groupes créés à partir de la source d'inventaire" -" (EC2 uniquement)." +"Limiter automatiquement les groupes créés à partir de la source d'inventaire " +"(EC2 uniquement)." -#: main/models/inventory.py:857 +#: awx/main/models/inventory.py:857 msgid "Overwrite local groups and hosts from remote inventory source." msgstr "" "Écraser les groupes locaux et les hôtes de la source d'inventaire distante." -#: main/models/inventory.py:861 +#: awx/main/models/inventory.py:861 msgid "Overwrite local variables from remote inventory source." msgstr "Écraser les variables locales de la source d'inventaire distante." -#: main/models/inventory.py:893 +#: awx/main/models/inventory.py:893 msgid "Availability Zone" msgstr "Zone de disponibilité" -#: main/models/inventory.py:894 +#: awx/main/models/inventory.py:894 msgid "Image ID" msgstr "ID d'image" -#: main/models/inventory.py:895 +#: awx/main/models/inventory.py:895 msgid "Instance ID" msgstr "ID d'instance" -#: main/models/inventory.py:896 +#: awx/main/models/inventory.py:896 msgid "Instance Type" msgstr "Type d'instance" -#: main/models/inventory.py:897 +#: awx/main/models/inventory.py:897 msgid "Key Name" msgstr "Nom de la clé" -#: main/models/inventory.py:898 +#: awx/main/models/inventory.py:898 msgid "Region" msgstr "Région" -#: main/models/inventory.py:899 +#: awx/main/models/inventory.py:899 msgid "Security Group" msgstr "Groupe de sécurité" -#: main/models/inventory.py:900 +#: awx/main/models/inventory.py:900 msgid "Tags" msgstr "Balises" -#: main/models/inventory.py:901 +#: awx/main/models/inventory.py:901 msgid "VPC ID" msgstr "ID VPC" -#: main/models/inventory.py:902 +#: awx/main/models/inventory.py:902 msgid "Tag None" msgstr "Ne rien baliser" -#: main/models/inventory.py:973 +#: awx/main/models/inventory.py:973 #, python-format msgid "" "Cloud-based inventory sources (such as %s) require credentials for the " "matching cloud service." msgstr "" -"Les sources d'inventaire cloud (telles que% s) requièrent des informations " +"Les sources d'inventaire cloud (telles que %s) requièrent des informations " "d'identification pour le service cloud correspondant." -#: main/models/inventory.py:980 +#: awx/main/models/inventory.py:980 msgid "Credential is required for a cloud source." msgstr "" "Les informations d'identification sont requises pour une source cloud." -#: main/models/inventory.py:1005 +#: awx/main/models/inventory.py:1005 #, python-format msgid "Invalid %(source)s region: %(region)s" -msgstr "" +msgstr "Région %(source)s non valide : %(region)s" -#: main/models/inventory.py:1030 +#: awx/main/models/inventory.py:1030 #, python-format msgid "Invalid filter expression: %(filter)s" -msgstr "" +msgstr "Expression de filtre non valide : %(filter)s" -#: main/models/inventory.py:1048 +#: awx/main/models/inventory.py:1048 #, python-format msgid "Invalid group by choice: %(choice)s" -msgstr "" +msgstr "Choix de regroupement non valide : %(choice)s" -#: main/models/inventory.py:1195 +#: awx/main/models/inventory.py:1195 #, python-format msgid "" "Unable to configure this item for cloud sync. It is already managed by %s." @@ -2012,19 +2182,19 @@ msgstr "" "Impossible de configurer cet élément pour la synchronisation dans le cloud. " "Il est déjà géré par %s." -#: main/models/inventory.py:1290 +#: awx/main/models/inventory.py:1290 msgid "Inventory script contents" msgstr "Contenus des scripts d'inventaire" -#: main/models/inventory.py:1295 +#: awx/main/models/inventory.py:1295 msgid "Organization owning this inventory script" msgstr "Organisation propriétaire de ce script d'inventaire." -#: main/models/jobs.py:169 +#: awx/main/models/jobs.py:169 msgid "You must provide a network credential." msgstr "Vous devez fournir des informations d'identification réseau." -#: main/models/jobs.py:177 +#: awx/main/models/jobs.py:177 msgid "" "Must provide a credential for a cloud provider, such as Amazon Web Services " "or Rackspace." @@ -2032,35 +2202,36 @@ msgstr "" "Entrez les informations d'identification d'un fournisseur de services cloud " "comme Amazon Web Services ou Rackspace." -#: main/models/jobs.py:269 +#: awx/main/models/jobs.py:269 msgid "Job Template must provide 'inventory' or allow prompting for it." msgstr "" "Le modèle de tâche doit fournir un inventaire ou permettre d'en demander un." -#: main/models/jobs.py:273 +#: awx/main/models/jobs.py:273 msgid "Job Template must provide 'credential' or allow prompting for it." msgstr "" "Le modèle de tâche doit fournir des informations d'identification ou " "permettre d'en demander." -#: main/models/jobs.py:362 +#: awx/main/models/jobs.py:362 msgid "Cannot override job_type to or from a scan job." msgstr "Impossible de remplacer job_type vers ou depuis une tâche de scan." -#: main/models/jobs.py:365 +#: awx/main/models/jobs.py:365 msgid "Inventory cannot be changed at runtime for scan jobs." msgstr "" "L'inventaire ne peut pas être modifié à l'exécution pour les tâches de scan." -#: main/models/jobs.py:431 main/models/projects.py:243 +#: awx/main/models/jobs.py:431 +#: awx/main/models/projects.py:243 msgid "SCM Revision" msgstr "Révision SCM" -#: main/models/jobs.py:432 +#: awx/main/models/jobs.py:432 msgid "The SCM Revision from the Project used for this job, if available" msgstr "Révision SCM du projet utilisé pour cette tâche, le cas échéant" -#: main/models/jobs.py:440 +#: awx/main/models/jobs.py:440 msgid "" "The SCM Refresh task used to make sure the playbooks were available for the " "job run" @@ -2068,195 +2239,200 @@ msgstr "" "Activité d'actualisation du SCM qui permet de s'assurer que les playbooks " "étaient disponibles pour l'exécution de la tâche" -#: main/models/jobs.py:662 +#: awx/main/models/jobs.py:662 msgid "job host summaries" msgstr "récapitulatifs des hôtes pour la tâche" -#: main/models/jobs.py:765 +#: awx/main/models/jobs.py:765 msgid "Host Failure" msgstr "Échec de l'hôte" -#: main/models/jobs.py:768 main/models/jobs.py:782 +#: awx/main/models/jobs.py:768 +#: awx/main/models/jobs.py:782 msgid "No Hosts Remaining" msgstr "Aucun hôte restant" -#: main/models/jobs.py:769 +#: awx/main/models/jobs.py:769 msgid "Host Polling" msgstr "Interrogation de l'hôte" -#: main/models/jobs.py:770 +#: awx/main/models/jobs.py:770 msgid "Host Async OK" msgstr "Désynchronisation des hôtes OK" -#: main/models/jobs.py:771 +#: awx/main/models/jobs.py:771 msgid "Host Async Failure" msgstr "Échec de désynchronisation des hôtes" -#: main/models/jobs.py:772 +#: awx/main/models/jobs.py:772 msgid "Item OK" msgstr "Élément OK" -#: main/models/jobs.py:773 +#: awx/main/models/jobs.py:773 msgid "Item Failed" msgstr "Échec de l'élément" -#: main/models/jobs.py:774 +#: awx/main/models/jobs.py:774 msgid "Item Skipped" msgstr "Élément ignoré" -#: main/models/jobs.py:775 +#: awx/main/models/jobs.py:775 msgid "Host Retry" msgstr "Nouvel essai de l'hôte" -#: main/models/jobs.py:777 +#: awx/main/models/jobs.py:777 msgid "File Difference" msgstr "Écart entre les fichiers" -#: main/models/jobs.py:778 +#: awx/main/models/jobs.py:778 msgid "Playbook Started" msgstr "Playbook démarré" -#: main/models/jobs.py:779 +#: awx/main/models/jobs.py:779 msgid "Running Handlers" msgstr "Descripteurs d'exécution" -#: main/models/jobs.py:780 +#: awx/main/models/jobs.py:780 msgid "Including File" msgstr "Ajout de fichier" -#: main/models/jobs.py:781 +#: awx/main/models/jobs.py:781 msgid "No Hosts Matched" msgstr "Aucun hôte correspondant" -#: main/models/jobs.py:783 +#: awx/main/models/jobs.py:783 msgid "Task Started" msgstr "Tâche démarrée" -#: main/models/jobs.py:785 +#: awx/main/models/jobs.py:785 msgid "Variables Prompted" msgstr "Variables demandées" -#: main/models/jobs.py:786 +#: awx/main/models/jobs.py:786 msgid "Gathering Facts" msgstr "Collecte des faits" -#: main/models/jobs.py:787 +#: awx/main/models/jobs.py:787 msgid "internal: on Import for Host" msgstr "interne : à l'importation pour l'hôte" -#: main/models/jobs.py:788 +#: awx/main/models/jobs.py:788 msgid "internal: on Not Import for Host" msgstr "interne : à la non-importation pour l'hôte" -#: main/models/jobs.py:789 +#: awx/main/models/jobs.py:789 msgid "Play Started" msgstr "Scène démarrée" -#: main/models/jobs.py:790 +#: awx/main/models/jobs.py:790 msgid "Playbook Complete" msgstr "Playbook terminé" -#: main/models/jobs.py:1200 +#: awx/main/models/jobs.py:1200 msgid "Remove jobs older than a certain number of days" msgstr "Supprimer les tâches plus anciennes qu'un certain nombre de jours" -#: main/models/jobs.py:1201 +#: awx/main/models/jobs.py:1201 msgid "Remove activity stream entries older than a certain number of days" msgstr "" -"Supprimer les entrées du flux d'activité plus anciennes qu'un certain nombre" -" de jours" +"Supprimer les entrées du flux d'activité plus anciennes qu'un certain nombre " +"de jours" -#: main/models/jobs.py:1202 +#: awx/main/models/jobs.py:1202 msgid "Purge and/or reduce the granularity of system tracking data" msgstr "Purger et/ou réduire la granularité des données de suivi du système" -#: main/models/label.py:29 +#: awx/main/models/label.py:29 msgid "Organization this label belongs to." msgstr "Organisation à laquelle appartient ce libellé." -#: main/models/notifications.py:31 +#: awx/main/models/notifications.py:31 msgid "Email" msgstr "Email" -#: main/models/notifications.py:32 +#: awx/main/models/notifications.py:32 msgid "Slack" msgstr "Slack" -#: main/models/notifications.py:33 +#: awx/main/models/notifications.py:33 msgid "Twilio" msgstr "Twilio" -#: main/models/notifications.py:34 +#: awx/main/models/notifications.py:34 msgid "Pagerduty" msgstr "Pagerduty" -#: main/models/notifications.py:35 +#: awx/main/models/notifications.py:35 msgid "HipChat" msgstr "HipChat" -#: main/models/notifications.py:36 +#: awx/main/models/notifications.py:36 msgid "Webhook" msgstr "Webhook" -#: main/models/notifications.py:37 +#: awx/main/models/notifications.py:37 msgid "IRC" msgstr "IRC" -#: main/models/notifications.py:127 main/models/unified_jobs.py:59 +#: awx/main/models/notifications.py:127 +#: awx/main/models/unified_jobs.py:59 msgid "Pending" msgstr "En attente" -#: main/models/notifications.py:128 main/models/unified_jobs.py:62 +#: awx/main/models/notifications.py:128 +#: awx/main/models/unified_jobs.py:62 msgid "Successful" msgstr "Réussi" -#: main/models/notifications.py:129 main/models/unified_jobs.py:63 +#: awx/main/models/notifications.py:129 +#: awx/main/models/unified_jobs.py:63 msgid "Failed" msgstr "Échec" -#: main/models/organization.py:157 +#: awx/main/models/organization.py:157 msgid "Execute Commands on the Inventory" msgstr "Exécuter des commandes sur l'inventaire" -#: main/models/organization.py:211 +#: awx/main/models/organization.py:211 msgid "Token not invalidated" msgstr "Token non invalidé" -#: main/models/organization.py:212 +#: awx/main/models/organization.py:212 msgid "Token is expired" msgstr "Token arrivé à expiration" -#: main/models/organization.py:213 +#: awx/main/models/organization.py:213 msgid "" "The maximum number of allowed sessions for this user has been exceeded." msgstr "" +"Le nombre maximum de sessions autorisées pour cet utilisateur a été dépassé." -#: main/models/organization.py:216 +#: awx/main/models/organization.py:216 msgid "Invalid token" msgstr "Token non valide" -#: main/models/organization.py:233 +#: awx/main/models/organization.py:233 msgid "Reason the auth token was invalidated." msgstr "" "Raison pour laquelle le token d'authentification a été rendu non valide." -#: main/models/organization.py:272 +#: awx/main/models/organization.py:272 msgid "Invalid reason specified" msgstr "Raison de non validité spécifiée" -#: main/models/projects.py:43 +#: awx/main/models/projects.py:43 msgid "Git" msgstr "Git" -#: main/models/projects.py:44 +#: awx/main/models/projects.py:44 msgid "Mercurial" msgstr "Mercurial" -#: main/models/projects.py:45 +#: awx/main/models/projects.py:45 msgid "Subversion" msgstr "Subversion" -#: main/models/projects.py:71 +#: awx/main/models/projects.py:71 msgid "" "Local path (relative to PROJECTS_ROOT) containing playbooks and related " "files for this project." @@ -2264,64 +2440,64 @@ msgstr "" "Chemin local (relatif à PROJECTS_ROOT) contenant des playbooks et des " "fichiers associés pour ce projet." -#: main/models/projects.py:80 +#: awx/main/models/projects.py:80 msgid "SCM Type" msgstr "Type de SCM" -#: main/models/projects.py:81 +#: awx/main/models/projects.py:81 msgid "Specifies the source control system used to store the project." msgstr "" "Spécifie le système de contrôle des sources utilisé pour stocker le projet." -#: main/models/projects.py:87 +#: awx/main/models/projects.py:87 msgid "SCM URL" msgstr "URL du SCM" -#: main/models/projects.py:88 +#: awx/main/models/projects.py:88 msgid "The location where the project is stored." msgstr "Emplacement où le projet est stocké." -#: main/models/projects.py:94 +#: awx/main/models/projects.py:94 msgid "SCM Branch" msgstr "Branche SCM" -#: main/models/projects.py:95 +#: awx/main/models/projects.py:95 msgid "Specific branch, tag or commit to checkout." msgstr "Branche, balise ou validation spécifique à valider." -#: main/models/projects.py:99 +#: awx/main/models/projects.py:99 msgid "Discard any local changes before syncing the project." msgstr "Ignorez les modifications locales avant de synchroniser le projet." -#: main/models/projects.py:103 +#: awx/main/models/projects.py:103 msgid "Delete the project before syncing." msgstr "Supprimez le projet avant la synchronisation." -#: main/models/projects.py:116 +#: awx/main/models/projects.py:116 msgid "The amount of time to run before the task is canceled." msgstr "Délai écoulé avant que la tâche ne soit annulée." -#: main/models/projects.py:130 +#: awx/main/models/projects.py:130 msgid "Invalid SCM URL." msgstr "URL du SCM incorrecte." -#: main/models/projects.py:133 +#: awx/main/models/projects.py:133 msgid "SCM URL is required." msgstr "L'URL du SCM est requise." -#: main/models/projects.py:142 +#: awx/main/models/projects.py:142 msgid "Credential kind must be 'scm'." msgstr "Le type d'informations d'identification doit être 'scm'." -#: main/models/projects.py:157 +#: awx/main/models/projects.py:157 msgid "Invalid credential." msgstr "Informations d'identification non valides." -#: main/models/projects.py:229 +#: awx/main/models/projects.py:229 msgid "Update the project when a job is launched that uses the project." msgstr "Mettez à jour le projet lorsqu'une tâche qui l'utilise est lancée." -#: main/models/projects.py:234 +#: awx/main/models/projects.py:234 msgid "" "The number of seconds after the last project update ran that a newproject " "update will be launched as a job dependency." @@ -2329,37 +2505,127 @@ msgstr "" "Délai écoulé (en secondes) entre la dernière mise à jour du projet et le " "lancement d'une nouvelle mise à jour en tant que dépendance de la tâche." -#: main/models/projects.py:244 +#: awx/main/models/projects.py:244 msgid "The last revision fetched by a project update" msgstr "Dernière révision récupérée par une mise à jour du projet" -#: main/models/projects.py:251 +#: awx/main/models/projects.py:251 msgid "Playbook Files" msgstr "Fichiers de playbook" -#: main/models/projects.py:252 +#: awx/main/models/projects.py:252 msgid "List of playbooks found in the project" msgstr "Liste des playbooks trouvés dans le projet" -#: main/models/rbac.py:122 +#: awx/main/models/rbac.py:36 +msgid "System Administrator" +msgstr "Administrateur du système" + +#: awx/main/models/rbac.py:37 +msgid "System Auditor" +msgstr "Auditeur système" + +#: awx/main/models/rbac.py:38 +msgid "Ad Hoc" +msgstr "Ad Hoc" + +#: awx/main/models/rbac.py:39 +msgid "Admin" +msgstr "Admin" + +#: awx/main/models/rbac.py:40 +msgid "Auditor" +msgstr "Auditeur" + +#: awx/main/models/rbac.py:41 +msgid "Execute" +msgstr "Execution" + +#: awx/main/models/rbac.py:42 +msgid "Member" +msgstr "Membre" + +#: awx/main/models/rbac.py:43 +msgid "Read" +msgstr "Lecture" + +#: awx/main/models/rbac.py:44 +msgid "Update" +msgstr "Mise à jour" + +#: awx/main/models/rbac.py:45 +msgid "Use" +msgstr "Utilisation" + +#: awx/main/models/rbac.py:49 +msgid "Can manage all aspects of the system" +msgstr "Peut gérer tous les aspects du système" + +#: awx/main/models/rbac.py:50 +msgid "Can view all settings on the system" +msgstr "Peut afficher tous les paramètres de configuration du système" + +#: awx/main/models/rbac.py:51 +msgid "May run ad hoc commands on an inventory" +msgstr "Peut exécuter des commandes ad hoc sur un inventaire" + +#: awx/main/models/rbac.py:52 +#, python-format +msgid "Can manage all aspects of the %s" +msgstr "Peut exécuter tous les aspects de %s" + +#: awx/main/models/rbac.py:53 +#, python-format +msgid "Can view all settings for the %s" +msgstr "Peut afficher tous les paramètres de configuration du %s" + +#: awx/main/models/rbac.py:54 +#, python-format +msgid "May run the %s" +msgstr "Peut exécuter %s" + +#: awx/main/models/rbac.py:55 +#, python-format +msgid "User is a member of the %s" +msgstr "L'utilisateur est un membre de %s" + +#: awx/main/models/rbac.py:56 +#, python-format +msgid "May view settings for the %s" +msgstr "Peut afficher les paramètres de configuration de %s" + +#: awx/main/models/rbac.py:57 +msgid "" +"May update project or inventory or group using the configured source update " +"system" +msgstr "" +"Peut mettre un projet, un inventaire, ou un groupe à jour en utilisant le " +"système de mise à jour de la source configuré." + +#: awx/main/models/rbac.py:58 +#, python-format +msgid "Can use the %s in a job template" +msgstr "Peut utiliser %s dans un modèle de tâche" + +#: awx/main/models/rbac.py:122 msgid "roles" msgstr "rôles" -#: main/models/rbac.py:438 +#: awx/main/models/rbac.py:438 msgid "role_ancestors" msgstr "role_ancestors" -#: main/models/schedules.py:69 +#: awx/main/models/schedules.py:69 msgid "Enables processing of this schedule by Tower." msgstr "Active le traitement de ce calendrier par Tower." -#: main/models/schedules.py:75 +#: awx/main/models/schedules.py:75 msgid "The first occurrence of the schedule occurs on or after this time." msgstr "" "La première occurrence du calendrier se produit à ce moment précis ou " "ultérieurement." -#: main/models/schedules.py:81 +#: awx/main/models/schedules.py:81 msgid "" "The last occurrence of the schedule occurs before this time, aftewards the " "schedule expires." @@ -2367,256 +2633,262 @@ msgstr "" "La dernière occurrence du calendrier se produit avant ce moment précis. " "Passé ce délai, le calendrier arrive à expiration." -#: main/models/schedules.py:85 +#: awx/main/models/schedules.py:85 msgid "A value representing the schedules iCal recurrence rule." msgstr "Valeur représentant la règle de récurrence iCal des calendriers." -#: main/models/schedules.py:91 +#: awx/main/models/schedules.py:91 msgid "The next time that the scheduled action will run." msgstr "La prochaine fois que l'action planifiée s'exécutera." -#: main/models/unified_jobs.py:58 +#: awx/main/models/unified_jobs.py:58 msgid "New" msgstr "Nouveau" -#: main/models/unified_jobs.py:60 +#: awx/main/models/unified_jobs.py:60 msgid "Waiting" msgstr "En attente" -#: main/models/unified_jobs.py:61 +#: awx/main/models/unified_jobs.py:61 msgid "Running" msgstr "En cours d'exécution" -#: main/models/unified_jobs.py:65 +#: awx/main/models/unified_jobs.py:65 msgid "Canceled" msgstr "Annulé" -#: main/models/unified_jobs.py:69 +#: awx/main/models/unified_jobs.py:69 msgid "Never Updated" msgstr "Jamais mis à jour" -#: main/models/unified_jobs.py:73 ui/templates/ui/index.html:85 -#: ui/templates/ui/index.html.py:104 +#: awx/main/models/unified_jobs.py:73 +#: awx/ui/templates/ui/index.html:85 +#: awx/ui/templates/ui/index.html.py:104 msgid "OK" msgstr "OK" -#: main/models/unified_jobs.py:74 +#: awx/main/models/unified_jobs.py:74 msgid "Missing" msgstr "Manquant" -#: main/models/unified_jobs.py:78 +#: awx/main/models/unified_jobs.py:78 msgid "No External Source" msgstr "Aucune source externe" -#: main/models/unified_jobs.py:85 +#: awx/main/models/unified_jobs.py:85 msgid "Updating" msgstr "Mise à jour en cours" -#: main/models/unified_jobs.py:403 +#: awx/main/models/unified_jobs.py:403 msgid "Relaunch" msgstr "Relancer" -#: main/models/unified_jobs.py:404 +#: awx/main/models/unified_jobs.py:404 msgid "Callback" msgstr "Rappeler" -#: main/models/unified_jobs.py:405 +#: awx/main/models/unified_jobs.py:405 msgid "Scheduled" msgstr "Planifié" -#: main/models/unified_jobs.py:406 +#: awx/main/models/unified_jobs.py:406 msgid "Dependency" msgstr "Dépendance" -#: main/models/unified_jobs.py:407 +#: awx/main/models/unified_jobs.py:407 msgid "Workflow" msgstr "Workflow" -#: main/models/unified_jobs.py:408 +#: awx/main/models/unified_jobs.py:408 msgid "Sync" -msgstr "" +msgstr "Sync" -#: main/models/unified_jobs.py:454 +#: awx/main/models/unified_jobs.py:454 msgid "The Tower node the job executed on." msgstr "Nœud Tower sur lequel la tâche s'est exécutée." -#: main/models/unified_jobs.py:480 +#: awx/main/models/unified_jobs.py:480 msgid "The date and time the job was queued for starting." msgstr "" "Date et heure auxquelles la tâche a été mise en file d'attente pour le " "démarrage." -#: main/models/unified_jobs.py:486 +#: awx/main/models/unified_jobs.py:486 msgid "The date and time the job finished execution." msgstr "Date et heure de fin d'exécution de la tâche." -#: main/models/unified_jobs.py:492 +#: awx/main/models/unified_jobs.py:492 msgid "Elapsed time in seconds that the job ran." msgstr "Délai écoulé (en secondes) pendant lequel la tâche s'est exécutée." -#: main/models/unified_jobs.py:514 +#: awx/main/models/unified_jobs.py:514 msgid "" -"A status field to indicate the state of the job if it wasn't able to run and" -" capture stdout" +"A status field to indicate the state of the job if it wasn't able to run and " +"capture stdout" msgstr "" "Champ d'état indiquant l'état de la tâche si elle n'a pas pu s'exécuter et " "capturer stdout" -#: main/notifications/base.py:17 main/notifications/email_backend.py:28 -msgid "" -"{} #{} had status {} on Ansible Tower, view details at {}\n" +#: awx/main/notifications/base.py:17 +#: awx/main/notifications/email_backend.py:28 +msgid "{} #{} had status {} on Ansible Tower, view details at {}\n" "\n" -msgstr "" -"{} #{} était à l'état {} sur Ansible Tower, voir les détails sur {}\n" +msgstr "{} #{} était à l'état {} sur Ansible Tower, voir les détails sur {}\n" "\n" -#: main/notifications/hipchat_backend.py:46 +#: awx/main/notifications/hipchat_backend.py:46 msgid "Error sending messages: {}" msgstr "Erreur lors de l'envoi de messages : {}" -#: main/notifications/hipchat_backend.py:48 +#: awx/main/notifications/hipchat_backend.py:48 msgid "Error sending message to hipchat: {}" msgstr "Erreur lors de l'envoi d'un message à hipchat : {}" -#: main/notifications/irc_backend.py:54 +#: awx/main/notifications/irc_backend.py:54 msgid "Exception connecting to irc server: {}" msgstr "Exception lors de la connexion au serveur irc : {}" -#: main/notifications/pagerduty_backend.py:39 +#: awx/main/notifications/pagerduty_backend.py:39 msgid "Exception connecting to PagerDuty: {}" msgstr "Exception lors de la connexion à PagerDuty : {}" -#: main/notifications/pagerduty_backend.py:48 -#: main/notifications/slack_backend.py:52 -#: main/notifications/twilio_backend.py:46 +#: awx/main/notifications/pagerduty_backend.py:48 +#: awx/main/notifications/slack_backend.py:52 +#: awx/main/notifications/twilio_backend.py:46 msgid "Exception sending messages: {}" msgstr "Exception lors de l'envoi de messages : {}" -#: main/notifications/twilio_backend.py:36 +#: awx/main/notifications/twilio_backend.py:36 msgid "Exception connecting to Twilio: {}" msgstr "Exception lors de la connexion à Twilio : {}" -#: main/notifications/webhook_backend.py:38 -#: main/notifications/webhook_backend.py:40 +#: awx/main/notifications/webhook_backend.py:38 +#: awx/main/notifications/webhook_backend.py:40 msgid "Error sending notification webhook: {}" msgstr "Erreur lors de l'envoi d'un webhook de notification : {}" -#: main/scheduler/__init__.py:130 +#: awx/main/scheduler/__init__.py:130 msgid "" "Job spawned from workflow could not start because it was not in the right " "state or required manual credentials" msgstr "" +"Tâche, lancée à partir du workflow, ne pouvant démarrer, pour faute d'être " +"dans l'état qui convient ou nécessitant des informations d'identification " +"manuelles adéquates." -#: main/tasks.py:180 +#: awx/main/tasks.py:180 msgid "Ansible Tower host usage over 90%" msgstr "Utilisation d'hôtes Ansible Tower supérieure à 90 %" -#: main/tasks.py:185 +#: awx/main/tasks.py:185 msgid "Ansible Tower license will expire soon" msgstr "La licence Ansible Tower expirera bientôt" -#: main/tasks.py:240 +#: awx/main/tasks.py:240 msgid "status_str must be either succeeded or failed" msgstr "status_str doit être une réussite ou un échec" -#: main/utils/common.py:89 +#: awx/main/utils/common.py:89 #, python-format msgid "Unable to convert \"%s\" to boolean" -msgstr "Impossible de convertir \"% s\" en booléen" +msgstr "Impossible de convertir \"%s\" en booléen" -#: main/utils/common.py:243 +#: awx/main/utils/common.py:243 #, python-format msgid "Unsupported SCM type \"%s\"" msgstr "Type de SCM \"%s\" non pris en charge" -#: main/utils/common.py:250 main/utils/common.py:262 main/utils/common.py:281 +#: awx/main/utils/common.py:250 +#: awx/main/utils/common.py:262 +#: awx/main/utils/common.py:281 #, python-format msgid "Invalid %s URL" msgstr "URL %s non valide." -#: main/utils/common.py:252 main/utils/common.py:290 +#: awx/main/utils/common.py:252 +#: awx/main/utils/common.py:290 #, python-format msgid "Unsupported %s URL" msgstr "URL %s non prise en charge" -#: main/utils/common.py:292 +#: awx/main/utils/common.py:292 #, python-format msgid "Unsupported host \"%s\" for file:// URL" msgstr "Hôte \"%s\" non pris en charge pour le fichier ://URL" -#: main/utils/common.py:294 +#: awx/main/utils/common.py:294 #, python-format msgid "Host is required for %s URL" msgstr "L'hôte est requis pour l'URL %s" -#: main/utils/common.py:312 +#: awx/main/utils/common.py:312 #, python-format msgid "Username must be \"git\" for SSH access to %s." msgstr "Le nom d'utilisateur doit être \"git\" pour l'accès SSH à %s." -#: main/utils/common.py:318 +#: awx/main/utils/common.py:318 #, python-format msgid "Username must be \"hg\" for SSH access to %s." msgstr "Le nom d'utilisateur doit être \"hg\" pour l'accès SSH à %s." -#: main/validators.py:60 +#: awx/main/validators.py:60 #, python-format msgid "Invalid certificate or key: %r..." msgstr "Certificat ou clé non valide : %r..." -#: main/validators.py:74 +#: awx/main/validators.py:74 #, python-format msgid "Invalid private key: unsupported type \"%s\"" msgstr "Clé privée non valide : type \"%s\" non pris en charge" -#: main/validators.py:78 +#: awx/main/validators.py:78 #, python-format msgid "Unsupported PEM object type: \"%s\"" msgstr "Type d'objet PEM non pris en charge : \"%s\"" -#: main/validators.py:103 +#: awx/main/validators.py:103 msgid "Invalid base64-encoded data" msgstr "Données codées en base64 non valides" -#: main/validators.py:122 +#: awx/main/validators.py:122 msgid "Exactly one private key is required." msgstr "Une clé privée uniquement est nécessaire." -#: main/validators.py:124 +#: awx/main/validators.py:124 msgid "At least one private key is required." msgstr "Une clé privée au moins est nécessaire." -#: main/validators.py:126 +#: awx/main/validators.py:126 #, python-format msgid "" -"At least %(min_keys)d private keys are required, only %(key_count)d " -"provided." +"At least %(min_keys)d private keys are required, only %(key_count)d provided." +"" msgstr "" "%(min_keys)d clés privées au moins sont requises, mais %(key_count)d " "uniquement ont été fournies." -#: main/validators.py:129 +#: awx/main/validators.py:129 #, python-format msgid "Only one private key is allowed, %(key_count)d provided." msgstr "Une seule clé privée est autorisée, %(key_count)d ont été fournies." -#: main/validators.py:131 +#: awx/main/validators.py:131 #, python-format msgid "" "No more than %(max_keys)d private keys are allowed, %(key_count)d provided." msgstr "" -"Pas plus de %(max_keys)d clés privées sont autorisées, %(key_count)d ont été" -" fournies." +"Pas plus de %(max_keys)d clés privées sont autorisées, %(key_count)d ont été " +"fournies." -#: main/validators.py:136 +#: awx/main/validators.py:136 msgid "Exactly one certificate is required." msgstr "Un certificat uniquement est nécessaire." -#: main/validators.py:138 +#: awx/main/validators.py:138 msgid "At least one certificate is required." msgstr "Un certificat au moins est nécessaire." -#: main/validators.py:140 +#: awx/main/validators.py:140 #, python-format msgid "" "At least %(min_certs)d certificates are required, only %(cert_count)d " @@ -2625,253 +2897,253 @@ msgstr "" "%(min_certs)d certificats au moins sont requis, mais %(cert_count)d " "uniquement ont été fournis." -#: main/validators.py:143 +#: awx/main/validators.py:143 #, python-format msgid "Only one certificate is allowed, %(cert_count)d provided." msgstr "Un seul certificat est autorisé, %(cert_count)d ont été fournis." -#: main/validators.py:145 +#: awx/main/validators.py:145 #, python-format msgid "" -"No more than %(max_certs)d certificates are allowed, %(cert_count)d " -"provided." +"No more than %(max_certs)d certificates are allowed, %(cert_count)d provided." +"" msgstr "" -"Pas plus de %(max_certs)d certificats sont autorisés, %(cert_count)d ont été" -" fournis." +"Pas plus de %(max_certs)d certificats sont autorisés, %(cert_count)d ont été " +"fournis." -#: main/views.py:20 +#: awx/main/views.py:20 msgid "API Error" msgstr "Erreur API" -#: main/views.py:49 +#: awx/main/views.py:49 msgid "Bad Request" msgstr "Requête incorrecte" -#: main/views.py:50 +#: awx/main/views.py:50 msgid "The request could not be understood by the server." msgstr "La requête n'a pas pu être comprise par le serveur." -#: main/views.py:57 +#: awx/main/views.py:57 msgid "Forbidden" msgstr "Interdiction" -#: main/views.py:58 +#: awx/main/views.py:58 msgid "You don't have permission to access the requested resource." msgstr "Vous n'êtes pas autorisé à accéder à la ressource demandée." -#: main/views.py:65 +#: awx/main/views.py:65 msgid "Not Found" msgstr "Introuvable" -#: main/views.py:66 +#: awx/main/views.py:66 msgid "The requested resource could not be found." msgstr "Impossible de trouver la ressource demandée." -#: main/views.py:73 +#: awx/main/views.py:73 msgid "Server Error" msgstr "Erreur serveur" -#: main/views.py:74 +#: awx/main/views.py:74 msgid "A server error has occurred." msgstr "Une erreur serveur s'est produite." -#: settings/defaults.py:611 +#: awx/settings/defaults.py:611 msgid "Chicago" msgstr "Chicago" -#: settings/defaults.py:612 +#: awx/settings/defaults.py:612 msgid "Dallas/Ft. Worth" msgstr "Dallas/Ft. Worth" -#: settings/defaults.py:613 +#: awx/settings/defaults.py:613 msgid "Northern Virginia" msgstr "Virginie du Nord" -#: settings/defaults.py:614 +#: awx/settings/defaults.py:614 msgid "London" msgstr "Londres" -#: settings/defaults.py:615 +#: awx/settings/defaults.py:615 msgid "Sydney" msgstr "Sydney" -#: settings/defaults.py:616 +#: awx/settings/defaults.py:616 msgid "Hong Kong" msgstr "Hong Kong" -#: settings/defaults.py:643 +#: awx/settings/defaults.py:643 msgid "US East (Northern Virginia)" msgstr "Est des États-Unis (Virginie du Nord)" -#: settings/defaults.py:644 +#: awx/settings/defaults.py:644 msgid "US East (Ohio)" msgstr "Est des États-Unis (Ohio)" -#: settings/defaults.py:645 +#: awx/settings/defaults.py:645 msgid "US West (Oregon)" msgstr "Ouest des États-Unis (Oregon)" -#: settings/defaults.py:646 +#: awx/settings/defaults.py:646 msgid "US West (Northern California)" msgstr "Ouest des États-Unis (Nord de la Californie)" -#: settings/defaults.py:647 +#: awx/settings/defaults.py:647 msgid "Canada (Central)" -msgstr "" +msgstr "Canada (Central)" -#: settings/defaults.py:648 +#: awx/settings/defaults.py:648 msgid "EU (Frankfurt)" msgstr "UE (Francfort)" -#: settings/defaults.py:649 +#: awx/settings/defaults.py:649 msgid "EU (Ireland)" msgstr "UE (Irlande)" -#: settings/defaults.py:650 +#: awx/settings/defaults.py:650 msgid "EU (London)" -msgstr "" +msgstr "UE (Londres)" -#: settings/defaults.py:651 +#: awx/settings/defaults.py:651 msgid "Asia Pacific (Singapore)" msgstr "Asie-Pacifique (Singapour)" -#: settings/defaults.py:652 +#: awx/settings/defaults.py:652 msgid "Asia Pacific (Sydney)" msgstr "Asie-Pacifique (Sydney)" -#: settings/defaults.py:653 +#: awx/settings/defaults.py:653 msgid "Asia Pacific (Tokyo)" msgstr "Asie-Pacifique (Tokyo)" -#: settings/defaults.py:654 +#: awx/settings/defaults.py:654 msgid "Asia Pacific (Seoul)" msgstr "Asie-Pacifique (Séoul)" -#: settings/defaults.py:655 +#: awx/settings/defaults.py:655 msgid "Asia Pacific (Mumbai)" msgstr "Asie-Pacifique (Mumbai)" -#: settings/defaults.py:656 +#: awx/settings/defaults.py:656 msgid "South America (Sao Paulo)" msgstr "Amérique du Sud (Sao Paulo)" -#: settings/defaults.py:657 +#: awx/settings/defaults.py:657 msgid "US West (GovCloud)" msgstr "Ouest des États-Unis (GovCloud)" -#: settings/defaults.py:658 +#: awx/settings/defaults.py:658 msgid "China (Beijing)" msgstr "Chine (Pékin)" -#: settings/defaults.py:707 +#: awx/settings/defaults.py:707 msgid "US East (B)" msgstr "Est des États-Unis (B)" -#: settings/defaults.py:708 +#: awx/settings/defaults.py:708 msgid "US East (C)" msgstr "Est des États-Unis (C)" -#: settings/defaults.py:709 +#: awx/settings/defaults.py:709 msgid "US East (D)" msgstr "Est des États-Unis (D)" -#: settings/defaults.py:710 +#: awx/settings/defaults.py:710 msgid "US Central (A)" msgstr "Centre des États-Unis (A)" -#: settings/defaults.py:711 +#: awx/settings/defaults.py:711 msgid "US Central (B)" msgstr "Centre des États-Unis (B)" -#: settings/defaults.py:712 +#: awx/settings/defaults.py:712 msgid "US Central (C)" msgstr "Centre des États-Unis (C)" -#: settings/defaults.py:713 +#: awx/settings/defaults.py:713 msgid "US Central (F)" msgstr "Centre des États-Unis (F)" -#: settings/defaults.py:714 +#: awx/settings/defaults.py:714 msgid "Europe West (B)" msgstr "Europe de l'Ouest (B)" -#: settings/defaults.py:715 +#: awx/settings/defaults.py:715 msgid "Europe West (C)" msgstr "Europe de l'Ouest (C)" -#: settings/defaults.py:716 +#: awx/settings/defaults.py:716 msgid "Europe West (D)" msgstr "Europe de l'Ouest (D)" -#: settings/defaults.py:717 +#: awx/settings/defaults.py:717 msgid "Asia East (A)" msgstr "Asie de l'Est (A)" -#: settings/defaults.py:718 +#: awx/settings/defaults.py:718 msgid "Asia East (B)" msgstr "Asie de l'Est (B)" -#: settings/defaults.py:719 +#: awx/settings/defaults.py:719 msgid "Asia East (C)" msgstr "Asie de l'Est (C)" -#: settings/defaults.py:743 +#: awx/settings/defaults.py:743 msgid "US Central" msgstr "Centre des États-Unis" -#: settings/defaults.py:744 +#: awx/settings/defaults.py:744 msgid "US East" msgstr "Est des États-Unis" -#: settings/defaults.py:745 +#: awx/settings/defaults.py:745 msgid "US East 2" msgstr "Est des États-Unis 2" -#: settings/defaults.py:746 +#: awx/settings/defaults.py:746 msgid "US North Central" msgstr "Centre-Nord des États-Unis" -#: settings/defaults.py:747 +#: awx/settings/defaults.py:747 msgid "US South Central" msgstr "Centre-Sud des États-Unis" -#: settings/defaults.py:748 +#: awx/settings/defaults.py:748 msgid "US West" msgstr "Ouest des États-Unis" -#: settings/defaults.py:749 +#: awx/settings/defaults.py:749 msgid "Europe North" msgstr "Europe du Nord" -#: settings/defaults.py:750 +#: awx/settings/defaults.py:750 msgid "Europe West" msgstr "Europe de l'Ouest" -#: settings/defaults.py:751 +#: awx/settings/defaults.py:751 msgid "Asia Pacific East" msgstr "Asie-Pacifique Est" -#: settings/defaults.py:752 +#: awx/settings/defaults.py:752 msgid "Asia Pacific Southeast" msgstr "Asie-Pacifique Sud-Est" -#: settings/defaults.py:753 +#: awx/settings/defaults.py:753 msgid "Japan East" msgstr "Est du Japon" -#: settings/defaults.py:754 +#: awx/settings/defaults.py:754 msgid "Japan West" msgstr "Ouest du Japon" -#: settings/defaults.py:755 +#: awx/settings/defaults.py:755 msgid "Brazil South" msgstr "Sud du Brésil" -#: sso/apps.py:9 +#: awx/sso/apps.py:9 msgid "Single Sign-On" msgstr "Single Sign-On" -#: sso/conf.py:27 +#: awx/sso/conf.py:27 msgid "" "Mapping to organization admins/users from social auth accounts. This setting\n" "controls which users are placed into which Tower organizations based on\n" @@ -2891,47 +3163,66 @@ msgid "" " the organization.\n" " If a string or list of strings, specifies the usernames and emails for\n" " users who will be added to the organization. Strings in the format\n" -" \"//\" will be interpreted as JavaScript regular expressions and\n" -" may also be used instead of string literals; only \"i\" and \"m\" are supported\n" +" \"//\" will be interpreted as JavaScript regular " +"expressions and\n" +" may also be used instead of string literals; only \"i\" and \"m\" are " +"supported\n" " for flags.\n" "- remove_admins: True/False. Defaults to True.\n" " If True, a user who does not match will be removed from the organization's\n" " administrative list.\n" -"- users: None, True/False, string or list of strings. Same rules apply as for\n" +"- users: None, True/False, string or list of strings. Same rules apply as " +"for\n" " admins.\n" "- remove_users: True/False. Defaults to True. Same rules as apply for \n" " remove_admins." msgstr "" -"Mappage avec des administrateurs/utilisateurs d'organisation appartenant à des comptes d'authentification sociale. Ce paramètre\n" -"contrôle les utilisateurs qui sont placés dans les organisations Tower en fonction de\n" -"leur nom d'utilisateur et adresse électronique. Les clés de dictionnaire sont des noms d'organisation.\n" -"Des organisations seront créées si elles ne sont pas présentes dans le cas où la licence autoriserait\n" +"Mappage avec des administrateurs/utilisateurs d'organisation appartenant à " +"des comptes d'authentification sociale. Ce paramètre\n" +"contrôle les utilisateurs qui sont placés dans les organisations Tower en " +"fonction de\n" +"leur nom d'utilisateur et adresse électronique. Les clés de dictionnaire " +"sont des noms d'organisation.\n" +"Des organisations seront créées si elles ne sont pas présentes dans le cas " +"où la licence autoriserait\n" "plusieurs organisations, sinon l'organisation par défaut est utilisée\n" -"indépendamment de la clé. Les valeurs sont des dictionnaires définissant les options\n" -"d'appartenance de chaque organisation. Pour chaque organisation, il est possible de\n" -"préciser les utilisateurs qui sont automatiquement utilisateurs de l'organisation et\n" +"indépendamment de la clé. Les valeurs sont des dictionnaires définissant les " +"options\n" +"d'appartenance de chaque organisation. Pour chaque organisation, il est " +"possible de\n" +"préciser les utilisateurs qui sont automatiquement utilisateurs de " +"l'organisation et\n" "ceux qui peuvent administrer l'organisation. \n" "\n" "- admins : None, True/False, chaîne ou liste de chaînes.\n" -" Si défini sur None, les administrateurs de l'organisation ne sont pas mis à jour.\n" -" Si défini sur True, tous les utilisateurs se servant de l'authentification sociale sont automatiquement ajoutés en tant qu'administrateurs\n" +" Si défini sur None, les administrateurs de l'organisation ne sont pas mis à " +"jour.\n" +" Si défini sur True, tous les utilisateurs se servant de l'authentification " +"sociale sont automatiquement ajoutés en tant qu'administrateurs\n" " de l'organisation.\n" -" Si défini sur False, aucun utilisateur d'authentification sociale n'est automatiquement ajouté en tant qu'administrateur de\n" +" Si défini sur False, aucun utilisateur d'authentification sociale n'est " +"automatiquement ajouté en tant qu'administrateur de\n" " l'organisation.\n" -" Si une chaîne ou une liste de chaînes est entrée, elle spécifie les noms d'utilisateur et les adresses électroniques des\n" +" Si une chaîne ou une liste de chaînes est entrée, elle spécifie les noms " +"d'utilisateur et les adresses électroniques des\n" " utilisateurs qui seront ajoutés à l'organisation. Les chaînes au format\n" -" \"//\" sont interprétées comme des expressions JavaScript normales et\n" -" peuvent également être utilisées à la place de littéraux de chaîne ; seuls \"i\" et \"m\" sont pris en charge\n" +" \"//\" sont interprétées comme des expressions JavaScript " +"normales et\n" +" peuvent également être utilisées à la place de littéraux de chaîne ; seuls " +"\"i\" et \"m\" sont pris en charge\n" " pour les marqueurs.\n" "- remove_admins : True/False. Par défaut défini sur True.\n" -" Si défini sur True, l'utilisateur qui ne correspond pas est supprimé de la liste administrative\n" +" Si défini sur True, l'utilisateur qui ne correspond pas est supprimé de la " +"liste administrative\n" " de l'organisation.\n" -"- users : None, True/False, chaîne ou liste de chaînes. Les mêmes règles s'appliquent que pour\n" +"- users : None, True/False, chaîne ou liste de chaînes. Les mêmes règles " +"s'appliquent que pour\n" " admins.\n" -"- remove_users : True/False. Par défaut défini sur True. Les mêmes règles s'appliquent que pour \n" +"- remove_users : True/False. Par défaut défini sur True. Les mêmes règles " +"s'appliquent que pour \n" " remove_admins." -#: sso/conf.py:76 +#: awx/sso/conf.py:76 msgid "" "Mapping of team members (users) from social auth accounts. Keys are team\n" "names (will be created if not present). Values are dictionaries of options\n" @@ -2948,38 +3239,50 @@ msgid "" " members.\n" " If a string or list of strings, specifies expressions used to match users.\n" " User will be added as a team member if the username or email matches.\n" -" Strings in the format \"//\" will be interpreted as JavaScript\n" -" regular expressions and may also be used instead of string literals; only \"i\"\n" +" Strings in the format \"//\" will be interpreted as " +"JavaScript\n" +" regular expressions and may also be used instead of string literals; only " +"\"i\"\n" " and \"m\" are supported for flags.\n" "- remove: True/False. Defaults to True. If True, a user who does not match\n" " the rules above will be removed from the team." msgstr "" -"Mappage des membres d'équipe (utilisateurs) de compte d'authentification sociale. Les clés sont des \n" -"noms d'équipe (seront créés s'ils ne sont pas présents). Les valeurs sont des dictionnaires d'options\n" -"d'appartenance à chaque équipe, où chacune peut contenir les paramètres suivants :\n" +"Mappage des membres d'équipe (utilisateurs) de compte d'authentification " +"sociale. Les clés sont des \n" +"noms d'équipe (seront créés s'ils ne sont pas présents). Les valeurs sont " +"des dictionnaires d'options\n" +"d'appartenance à chaque équipe, où chacune peut contenir les paramètres " +"suivants :\n" "\n" "-organization : chaîne. Nom de l'organisation à laquelle l'équipe\n" -" appartient. Une équipe est créée si la combinaison nom de l'organisation/nom de \n" +" appartient. Une équipe est créée si la combinaison nom de l'organisation/" +"nom de \n" "l'équipe n'existe pas. L'organisation sera d'abord créée \n" "si elle n'existe pas. Si la licence n'autorise pas plusieurs organisations, \n" "l'équipe est toujours attribuée à l'organisation par défaut. \n" "- users : None, True/False, chaîne ou liste de chaînes.\n" " Si défini sur None, les membres de l'équipe ne sont pas mis à jour.\n" -" Si défini sur True/False, tous les utilisateurs d'authentification sociale sont ajoutés/supprimés en tant que membres\n" +" Si défini sur True/False, tous les utilisateurs d'authentification sociale " +"sont ajoutés/supprimés en tant que membres\n" " d'équipe.\n" -" Si une chaîne ou une liste de chaînes est entrée, elle spécifie les expressions utilisées pour comparer les utilisateurs. \n" -"L'utilisateur est ajouté en tant que membre d'équipe si son nom d'utilisateur ou son adresse électronique correspond.\n" -" Les chaînes au format \"//\" sont interprétées comme des expressions JavaScript\n" -" normales et peuvent également être utilisées à la place de littéraux de chaîne ; Seuls \"i\"\n" +" Si une chaîne ou une liste de chaînes est entrée, elle spécifie les " +"expressions utilisées pour comparer les utilisateurs. \n" +"L'utilisateur est ajouté en tant que membre d'équipe si son nom " +"d'utilisateur ou son adresse électronique correspond.\n" +" Les chaînes au format \"//\" sont interprétées comme des " +"expressions JavaScript\n" +" normales et peuvent également être utilisées à la place de littéraux de " +"chaîne ; Seuls \"i\"\n" " et \"m\" sont pris en charge pour les marqueurs.\n" -"- remove : True/False. Par défaut défini sur True. Si défini sur True, tout utilisateur qui ne correspond\n" +"- remove : True/False. Par défaut défini sur True. Si défini sur True, tout " +"utilisateur qui ne correspond\n" " pas aux règles ci-dessus est supprimé de l'équipe." -#: sso/conf.py:119 +#: awx/sso/conf.py:119 msgid "Authentication Backends" msgstr "Backends d'authentification" -#: sso/conf.py:120 +#: awx/sso/conf.py:120 msgid "" "List of authentication backends that are enabled based on license features " "and other authentication settings." @@ -2987,23 +3290,23 @@ msgstr "" "Liste des backends d'authentification activés en fonction des " "caractéristiques des licences et d'autres paramètres d'authentification." -#: sso/conf.py:133 +#: awx/sso/conf.py:133 msgid "Social Auth Organization Map" msgstr "Authentification sociale - Mappage des organisations" -#: sso/conf.py:145 +#: awx/sso/conf.py:145 msgid "Social Auth Team Map" msgstr "Authentification sociale - Mappage des équipes" -#: sso/conf.py:157 +#: awx/sso/conf.py:157 msgid "Social Auth User Fields" msgstr "Authentification sociale - Champs d'utilisateurs" -#: sso/conf.py:158 +#: awx/sso/conf.py:158 msgid "" -"When set to an empty list `[]`, this setting prevents new user accounts from" -" being created. Only users who have previously logged in using social auth " -"or have a user account with a matching email address will be able to login." +"When set to an empty list `[]`, this setting prevents new user accounts from " +"being created. Only users who have previously logged in using social auth or " +"have a user account with a matching email address will be able to login." msgstr "" "Lorsqu'il est défini sur une liste vide `[]`, ce paramètre empêche la " "création de nouveaux comptes d'utilisateur. Seuls les utilisateurs ayant " @@ -3011,34 +3314,45 @@ msgstr "" "d'un compte utilisateur avec une adresse électronique correspondante " "pourront se connecter." -#: sso/conf.py:176 +#: awx/sso/conf.py:176 msgid "LDAP Server URI" msgstr "URI du serveur LDAP" -#: sso/conf.py:177 +#: awx/sso/conf.py:177 msgid "" "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-" -"SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be" -" specified by separating with spaces or commas. LDAP authentication is " +"SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be " +"specified by separating with spaces or commas. LDAP authentication is " "disabled if this parameter is empty." msgstr "" "URI de connexion au serveur LDAP, tel que \"ldap://ldap.exemple.com:389\" " -"(non SSL) ou \"ldaps://ldap.exemple.com:636\" (SSL). Plusieurs serveurs LDAP" -" peuvent être définis en les séparant par des espaces ou des virgules. " +"(non SSL) ou \"ldaps://ldap.exemple.com:636\" (SSL). Plusieurs serveurs LDAP " +"peuvent être définis en les séparant par des espaces ou des virgules. " "L'authentification LDAP est désactivée si ce paramètre est vide." -#: sso/conf.py:181 sso/conf.py:199 sso/conf.py:211 sso/conf.py:223 -#: sso/conf.py:239 sso/conf.py:258 sso/conf.py:280 sso/conf.py:296 -#: sso/conf.py:315 sso/conf.py:332 sso/conf.py:349 sso/conf.py:365 -#: sso/conf.py:382 sso/conf.py:420 sso/conf.py:461 +#: awx/sso/conf.py:181 +#: awx/sso/conf.py:199 +#: awx/sso/conf.py:211 +#: awx/sso/conf.py:223 +#: awx/sso/conf.py:239 +#: awx/sso/conf.py:258 +#: awx/sso/conf.py:280 +#: awx/sso/conf.py:296 +#: awx/sso/conf.py:315 +#: awx/sso/conf.py:332 +#: awx/sso/conf.py:349 +#: awx/sso/conf.py:365 +#: awx/sso/conf.py:382 +#: awx/sso/conf.py:420 +#: awx/sso/conf.py:461 msgid "LDAP" msgstr "LDAP" -#: sso/conf.py:193 +#: awx/sso/conf.py:193 msgid "LDAP Bind DN" msgstr "ND de la liaison LDAP" -#: sso/conf.py:194 +#: awx/sso/conf.py:194 msgid "" "DN (Distinguished Name) of user to bind for all search queries. Normally in " "the format \"CN=Some User,OU=Users,DC=example,DC=com\" but may also be " @@ -3052,67 +3366,67 @@ msgstr "" "utilisateur système que nous utiliserons pour nous connecter afin " "d'interroger LDAP et obtenir d'autres informations utilisateur." -#: sso/conf.py:209 +#: awx/sso/conf.py:209 msgid "LDAP Bind Password" msgstr "Mot de passe de la liaison LDAP" -#: sso/conf.py:210 +#: awx/sso/conf.py:210 msgid "Password used to bind LDAP user account." msgstr "Mot de passe utilisé pour lier le compte utilisateur LDAP." -#: sso/conf.py:221 +#: awx/sso/conf.py:221 msgid "LDAP Start TLS" msgstr "LDAP - Lancer TLS" -#: sso/conf.py:222 +#: awx/sso/conf.py:222 msgid "Whether to enable TLS when the LDAP connection is not using SSL." msgstr "Pour activer ou non TLS lorsque la connexion LDAP n'utilise pas SSL." -#: sso/conf.py:232 +#: awx/sso/conf.py:232 msgid "LDAP Connection Options" msgstr "Options de connexion à LDAP" -#: sso/conf.py:233 +#: awx/sso/conf.py:233 msgid "" "Additional options to set for the LDAP connection. LDAP referrals are " "disabled by default (to prevent certain LDAP queries from hanging with AD). " -"Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to " -"https://www.python-ldap.org/doc/html/ldap.html#options for possible options " -"and values that can be set." +"Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://" +"www.python-ldap.org/doc/html/ldap.html#options for possible options and " +"values that can be set." msgstr "" "Options supplémentaires à définir pour la connexion LDAP. Les références " "LDAP sont désactivées par défaut (pour empêcher certaines requêtes LDAP de " "se bloquer avec AD). Les noms d'options doivent être des chaînes (par " -"exemple \"OPT_REFERRALS\"). Reportez-vous à https://www.python-" -"ldap.org/doc/html/ldap.html#options afin de connaître les options possibles " -"et les valeurs que vous pouvez définir." +"exemple \"OPT_REFERRALS\"). Reportez-vous à https://www.python-ldap.org/doc/" +"html/ldap.html#options afin de connaître les options possibles et les " +"valeurs que vous pouvez définir." -#: sso/conf.py:251 +#: awx/sso/conf.py:251 msgid "LDAP User Search" msgstr "Recherche d'utilisateurs LDAP" -#: sso/conf.py:252 +#: awx/sso/conf.py:252 msgid "" "LDAP search query to find users. Any user that matches the given pattern " "will be able to login to Tower. The user should also be mapped into an " "Tower organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). " "If multiple search queries need to be supported use of \"LDAPUnion\" is " -"possible. See python-ldap documentation as linked at the top of this " -"section." +"possible. See python-ldap documentation as linked at the top of this section." +"" msgstr "" "Requête de recherche LDAP servant à retrouver des utilisateurs. Tout " "utilisateur qui correspond au modèle donné pourra se connecter à Tower. " -"L'utilisateur doit également être mappé dans une organisation Tower (tel que" -" défini dans le paramètre AUTH_LDAP_ORGANIZATION_MAP). Si plusieurs requêtes" -" de recherche doivent être prises en charge, l'utilisation de \"LDAPUnion\" " +"L'utilisateur doit également être mappé dans une organisation Tower (tel que " +"défini dans le paramètre AUTH_LDAP_ORGANIZATION_MAP). Si plusieurs requêtes " +"de recherche doivent être prises en charge, l'utilisation de \"LDAPUnion\" " "est possible. Se reporter à la documentation sur python-ldap en suivant le " "lien indiqué en haut de cette section." -#: sso/conf.py:274 +#: awx/sso/conf.py:274 msgid "LDAP User DN Template" msgstr "Modèle de ND pour les utilisateurs LDAP" -#: sso/conf.py:275 +#: awx/sso/conf.py:275 msgid "" "Alternative to user search, if user DNs are all of the same format. This " "approach will be more efficient for user lookups than searching if it is " @@ -3125,33 +3439,33 @@ msgstr "" "organisationnel. Si ce paramètre est défini, sa valeur sera utilisée à la " "place de AUTH_LDAP_USER_SEARCH." -#: sso/conf.py:290 +#: awx/sso/conf.py:290 msgid "LDAP User Attribute Map" msgstr "Mappe des attributs d'utilisateurs LDAP" -#: sso/conf.py:291 +#: awx/sso/conf.py:291 msgid "" "Mapping of LDAP user schema to Tower API user attributes (key is user " -"attribute name, value is LDAP attribute name). The default setting is valid" -" for ActiveDirectory but users with other LDAP configurations may need to " +"attribute name, value is LDAP attribute name). The default setting is valid " +"for ActiveDirectory but users with other LDAP configurations may need to " "change the values (not the keys) of the dictionary/hash-table." msgstr "" "Mappage du schéma utilisateur LDAP avec les attributs utilisateur d'API " "Tower (la clé est le nom de l'attribut utilisateur, la valeur est le nom de " "l'attribut LDAP). Le paramètre par défaut est valide pour ActiveDirectory, " -"mais les utilisateurs ayant d'autres configurations LDAP peuvent être amenés" -" à modifier les valeurs (et non les clés) du dictionnaire/de la table de " +"mais les utilisateurs ayant d'autres configurations LDAP peuvent être amenés " +"à modifier les valeurs (et non les clés) du dictionnaire/de la table de " "hachage." -#: sso/conf.py:310 +#: awx/sso/conf.py:310 msgid "LDAP Group Search" msgstr "Recherche de groupes LDAP" -#: sso/conf.py:311 +#: awx/sso/conf.py:311 msgid "" -"Users in Tower are mapped to organizations based on their membership in LDAP" -" groups. This setting defines the LDAP search query to find groups. Note " -"that this, unlike the user search above, does not support LDAPSearchUnion." +"Users in Tower are mapped to organizations based on their membership in LDAP " +"groups. This setting defines the LDAP search query to find groups. Note that " +"this, unlike the user search above, does not support LDAPSearchUnion." msgstr "" "Les utilisateurs de Tower sont mappés à des organisations en fonction de " "leur appartenance à des groupes LDAP. Ce paramètre définit la requête de " @@ -3159,25 +3473,25 @@ msgstr "" "contrairement à la recherche d'utilisateurs LDAP, ne prend pas en charge " "LDAPSearchUnion." -#: sso/conf.py:328 +#: awx/sso/conf.py:328 msgid "LDAP Group Type" msgstr "Type de groupe LDAP" -#: sso/conf.py:329 +#: awx/sso/conf.py:329 msgid "" -"The group type may need to be changed based on the type of the LDAP server." -" Values are listed at: http://pythonhosted.org/django-auth-ldap/groups.html" -"#types-of-groups" +"The group type may need to be changed based on the type of the LDAP server. " +"Values are listed at: http://pythonhosted.org/django-auth-ldap/groups." +"html#types-of-groups" msgstr "" "Il convient parfois de modifier le type de groupe en fonction du type de " -"serveur LDAP. Les valeurs sont répertoriées à l'adresse suivante : " -"http://pythonhosted.org/django-auth-ldap/groups.html#types-of-groups" +"serveur LDAP. Les valeurs sont répertoriées à l'adresse suivante : http://" +"pythonhosted.org/django-auth-ldap/groups.html#types-of-groups" -#: sso/conf.py:344 +#: awx/sso/conf.py:344 msgid "LDAP Require Group" msgstr "Groupe LDAP obligatoire" -#: sso/conf.py:345 +#: awx/sso/conf.py:345 msgid "" "Group DN required to login. If specified, user must be a member of this " "group to login via LDAP. If not set, everyone in LDAP that matches the user " @@ -3189,24 +3503,24 @@ msgstr "" "recherche d'utilisateurs pourra se connecter via Tower. Un seul groupe est " "pris en charge." -#: sso/conf.py:361 +#: awx/sso/conf.py:361 msgid "LDAP Deny Group" msgstr "Groupe LDAP refusé" -#: sso/conf.py:362 +#: awx/sso/conf.py:362 msgid "" "Group DN denied from login. If specified, user will not be allowed to login " "if a member of this group. Only one deny group is supported." msgstr "" -"ND du groupe dont la connexion est refusée. S'il est spécifié, l'utilisateur" -" n'est pas autorisé à se connecter s'il est membre de ce groupe. Un seul " +"ND du groupe dont la connexion est refusée. S'il est spécifié, l'utilisateur " +"n'est pas autorisé à se connecter s'il est membre de ce groupe. Un seul " "groupe refusé est pris en charge." -#: sso/conf.py:375 +#: awx/sso/conf.py:375 msgid "LDAP User Flags By Group" msgstr "Marqueurs d'utilisateur LDAP par groupe" -#: sso/conf.py:376 +#: awx/sso/conf.py:376 msgid "" "User profile flags updated from group membership (key is user attribute " "name, value is group DN). These are boolean fields that are matched based " @@ -3215,160 +3529,212 @@ msgid "" "false at login time based on current LDAP settings." msgstr "" "Marqueurs de profil utilisateur mis à jour selon l'appartenance au groupe " -"(la clé est le nom de l'attribut utilisateur, la valeur est le ND du " -"groupe). Il s'agit de champs booléens qui sont associés selon que " -"l'utilisateur est ou non membre du groupe donné. Jusqu'à présent, seul " -"is_superuser peut être défini avec cette méthode. Ce marqueur est défini à " -"la fois sur True et False au moment de la connexion, en fonction des " -"paramètres LDAP actifs." +"(la clé est le nom de l'attribut utilisateur, la valeur est le ND du groupe)." +" Il s'agit de champs booléens qui sont associés selon que l'utilisateur est " +"ou non membre du groupe donné. Jusqu'à présent, seul is_superuser peut être " +"défini avec cette méthode. Ce marqueur est défini à la fois sur True et " +"False au moment de la connexion, en fonction des paramètres LDAP actifs." -#: sso/conf.py:394 +#: awx/sso/conf.py:394 msgid "LDAP Organization Map" msgstr "Mappe d'organisations LDAP" -#: sso/conf.py:395 +#: awx/sso/conf.py:395 msgid "" -"Mapping between organization admins/users and LDAP groups. This controls what users are placed into what Tower organizations relative to their LDAP group memberships. Keys are organization names. Organizations will be created if not present. Values are dictionaries defining the options for each organization's membership. For each organization it is possible to specify what groups are automatically users of the organization and also what groups can administer the organization.\n" +"Mapping between organization admins/users and LDAP groups. This controls " +"what users are placed into what Tower organizations relative to their LDAP " +"group memberships. Keys are organization names. Organizations will be " +"created if not present. Values are dictionaries defining the options for " +"each organization's membership. For each organization it is possible to " +"specify what groups are automatically users of the organization and also " +"what groups can administer the organization.\n" "\n" " - admins: None, True/False, string or list of strings.\n" " If None, organization admins will not be updated based on LDAP values.\n" -" If True, all users in LDAP will automatically be added as admins of the organization.\n" -" If False, no LDAP users will be automatically added as admins of the organization.\n" -" If a string or list of strings, specifies the group DN(s) that will be added of the organization if they match any of the specified groups.\n" +" If True, all users in LDAP will automatically be added as admins of the " +"organization.\n" +" If False, no LDAP users will be automatically added as admins of the " +"organization.\n" +" If a string or list of strings, specifies the group DN(s) that will be " +"added of the organization if they match any of the specified groups.\n" " - remove_admins: True/False. Defaults to True.\n" -" If True, a user who is not an member of the given groups will be removed from the organization's administrative list.\n" -" - users: None, True/False, string or list of strings. Same rules apply as for admins.\n" -" - remove_users: True/False. Defaults to True. Same rules apply as for remove_admins." +" If True, a user who is not an member of the given groups will be removed " +"from the organization's administrative list.\n" +" - users: None, True/False, string or list of strings. Same rules apply as " +"for admins.\n" +" - remove_users: True/False. Defaults to True. Same rules apply as for " +"remove_admins." msgstr "" -"Mappage entre les administrateurs/utilisateurs de l'organisation et les groupes LDAP. Ce paramètre détermine les utilisateurs qui sont placés dans les organisations Tower par rapport à leurs appartenances à un groupe LDAP. Les clés sont les noms d'organisation. Les organisations seront créées si elles ne sont pas présentes. Les valeurs sont des dictionnaires définissant les options d'appartenance à chaque organisation. Pour chaque organisation, il est possible de spécifier les groupes qui sont automatiquement des utilisateurs de l'organisation et ceux qui peuvent administrer l'organisation.\n" +"Mappage entre les administrateurs/utilisateurs de l'organisation et les " +"groupes LDAP. Ce paramètre détermine les utilisateurs qui sont placés dans " +"les organisations Tower par rapport à leurs appartenances à un groupe LDAP. " +"Les clés sont les noms d'organisation. Les organisations seront créées si " +"elles ne sont pas présentes. Les valeurs sont des dictionnaires définissant " +"les options d'appartenance à chaque organisation. Pour chaque organisation, " +"il est possible de spécifier les groupes qui sont automatiquement des " +"utilisateurs de l'organisation et ceux qui peuvent administrer " +"l'organisation.\n" "\n" " - admins : None, True/False, chaîne ou liste de chaînes.\n" -"Si défini sur None, les administrateurs de l'organisation ne sont pas mis à jour en fonction des valeurs LDAP.\n" -" Si défini sur True, tous les utilisateurs LDAP sont automatiquement ajoutés en tant qu'administrateurs de l'organisation.\n" -" Si défini sur False, aucun utilisateur LDAP n'est automatiquement ajouté en tant qu'administrateur de l'organisation.\n" -" Si une chaîne ou une liste de chaînes est entrée, elle spécifie le ou les NDD de groupe qui seront ajoutés à l'organisation s'ils correspondent à l'un des groupes spécifiés.\n" +"Si défini sur None, les administrateurs de l'organisation ne sont pas mis à " +"jour en fonction des valeurs LDAP.\n" +" Si défini sur True, tous les utilisateurs LDAP sont automatiquement ajoutés " +"en tant qu'administrateurs de l'organisation.\n" +" Si défini sur False, aucun utilisateur LDAP n'est automatiquement ajouté en " +"tant qu'administrateur de l'organisation.\n" +" Si une chaîne ou une liste de chaînes est entrée, elle spécifie le ou les " +"NDD de groupe qui seront ajoutés à l'organisation s'ils correspondent à l'un " +"des groupes spécifiés.\n" " - remove_admins : True/False. Par défaut défini sur True.\n" -" Si défini sur True, tout utilisateur qui n'est pas membre des groupes donnés est supprimé de la liste administrative de l'organisation.\n" -" - users : None, True/False, chaîne ou liste de chaînes. Les mêmes règles s'appliquent que pour admins.\n" -" - remove_users : True/False. Par défaut défini sur True. Les mêmes règles s'appliquent que pour remove_admins." +" Si défini sur True, tout utilisateur qui n'est pas membre des groupes " +"donnés est supprimé de la liste administrative de l'organisation.\n" +" - users : None, True/False, chaîne ou liste de chaînes. Les mêmes règles " +"s'appliquent que pour admins.\n" +" - remove_users : True/False. Par défaut défini sur True. Les mêmes règles " +"s'appliquent que pour remove_admins." -#: sso/conf.py:443 +#: awx/sso/conf.py:443 msgid "LDAP Team Map" msgstr "Mappe d'équipes LDAP" -#: sso/conf.py:444 +#: awx/sso/conf.py:444 msgid "" -"Mapping between team members (users) and LDAP groups. Keys are team names (will be created if not present). Values are dictionaries of options for each team's membership, where each can contain the following parameters:\n" +"Mapping between team members (users) and LDAP groups. Keys are team names " +"(will be created if not present). Values are dictionaries of options for " +"each team's membership, where each can contain the following parameters:\n" "\n" -" - organization: string. The name of the organization to which the team belongs. The team will be created if the combination of organization and team name does not exist. The organization will first be created if it does not exist.\n" +" - organization: string. The name of the organization to which the team " +"belongs. The team will be created if the combination of organization and " +"team name does not exist. The organization will first be created if it does " +"not exist.\n" " - users: None, True/False, string or list of strings.\n" " If None, team members will not be updated.\n" " If True/False, all LDAP users will be added/removed as team members.\n" -" If a string or list of strings, specifies the group DN(s). User will be added as a team member if the user is a member of ANY of these groups.\n" -"- remove: True/False. Defaults to True. If True, a user who is not a member of the given groups will be removed from the team." +" If a string or list of strings, specifies the group DN(s). User will be " +"added as a team member if the user is a member of ANY of these groups.\n" +"- remove: True/False. Defaults to True. If True, a user who is not a member " +"of the given groups will be removed from the team." msgstr "" -"Mappage entre les membres d'équipe (utilisateurs) et les groupes LDAP. Les clés sont des noms d'équipe (seront créés s'ils ne sont pas présents). Les valeurs sont des dictionnaires d'options d'appartenance à chaque équipe, où chacune peut contenir les paramètres suivants :\n" +"Mappage entre les membres d'équipe (utilisateurs) et les groupes LDAP. Les " +"clés sont des noms d'équipe (seront créés s'ils ne sont pas présents). Les " +"valeurs sont des dictionnaires d'options d'appartenance à chaque équipe, où " +"chacune peut contenir les paramètres suivants :\n" "\n" -" - organization : chaîne. Nom de l'organisation à laquelle l'équipe appartient. Une équipe est créée si la combinaison nom de l'organisation/nom de l'équipe n'existe pas. L'organisation sera d'abord créée si elle n'existe pas.\n" +" - organization : chaîne. Nom de l'organisation à laquelle l'équipe " +"appartient. Une équipe est créée si la combinaison nom de l'organisation/nom " +"de l'équipe n'existe pas. L'organisation sera d'abord créée si elle n'existe " +"pas.\n" " - users : None, True/False, chaîne ou liste de chaînes.\n" " Si défini sur None, les membres de l'équipe ne sont pas mis à jour.\n" -" Si défini sur True/False, tous les utilisateurs LDAP seront ajoutés/supprimés en tant que membres d'équipe.\n" -" Si une chaîne ou une liste de chaînes est entrée, elle spécifie les NDD des groupes. L'utilisateur est ajouté en tant que membre d'équipe s'il est membre de l'UN de ces groupes.\n" -"- remove : True/False. Par défaut défini sur True. Si défini sur True, tout utilisateur qui n'est pas membre des groupes donnés est supprimé de l'équipe." +" Si défini sur True/False, tous les utilisateurs LDAP seront ajoutés/" +"supprimés en tant que membres d'équipe.\n" +" Si une chaîne ou une liste de chaînes est entrée, elle spécifie les NDD des " +"groupes. L'utilisateur est ajouté en tant que membre d'équipe s'il est " +"membre de l'UN de ces groupes.\n" +"- remove : True/False. Par défaut défini sur True. Si défini sur True, tout " +"utilisateur qui n'est pas membre des groupes donnés est supprimé de l'équipe." +"" -#: sso/conf.py:487 +#: awx/sso/conf.py:487 msgid "RADIUS Server" msgstr "Serveur RADIUS" -#: sso/conf.py:488 +#: awx/sso/conf.py:488 msgid "" -"Hostname/IP of RADIUS server. RADIUS authentication will be disabled if this" -" setting is empty." +"Hostname/IP of RADIUS server. RADIUS authentication will be disabled if this " +"setting is empty." msgstr "" -"Nom d'hôte/IP du serveur RADIUS. L'authentification RADIUS est désactivée si" -" ce paramètre est vide." +"Nom d'hôte/IP du serveur RADIUS. L'authentification RADIUS est désactivée si " +"ce paramètre est vide." -#: sso/conf.py:490 sso/conf.py:504 sso/conf.py:516 +#: awx/sso/conf.py:490 +#: awx/sso/conf.py:504 +#: awx/sso/conf.py:516 msgid "RADIUS" msgstr "RADIUS" -#: sso/conf.py:502 +#: awx/sso/conf.py:502 msgid "RADIUS Port" msgstr "Port RADIUS" -#: sso/conf.py:503 +#: awx/sso/conf.py:503 msgid "Port of RADIUS server." msgstr "Port du serveur RADIUS." -#: sso/conf.py:514 +#: awx/sso/conf.py:514 msgid "RADIUS Secret" msgstr "Secret RADIUS" -#: sso/conf.py:515 +#: awx/sso/conf.py:515 msgid "Shared secret for authenticating to RADIUS server." msgstr "Secret partagé pour l'authentification sur le serveur RADIUS." -#: sso/conf.py:531 +#: awx/sso/conf.py:531 msgid "Google OAuth2 Callback URL" msgstr "URL de rappel OAuth2 pour Google" -#: sso/conf.py:532 +#: awx/sso/conf.py:532 msgid "" "Create a project at https://console.developers.google.com/ to obtain an " "OAuth2 key and secret for a web application. Ensure that the Google+ API is " "enabled. Provide this URL as the callback URL for your application." msgstr "" "Créez un projet sur https://console.developers.google.com/ afin d'obtenir " -"une clé OAuth2 et un secret pour une application Web. Assurez-vous que l'API" -" Google+ est activée. Entrez cette URL comme URL de rappel de votre " +"une clé OAuth2 et un secret pour une application Web. Assurez-vous que l'API " +"Google+ est activée. Entrez cette URL comme URL de rappel de votre " "application." -#: sso/conf.py:536 sso/conf.py:547 sso/conf.py:558 sso/conf.py:571 -#: sso/conf.py:585 sso/conf.py:597 sso/conf.py:609 +#: awx/sso/conf.py:536 +#: awx/sso/conf.py:547 +#: awx/sso/conf.py:558 +#: awx/sso/conf.py:571 +#: awx/sso/conf.py:585 +#: awx/sso/conf.py:597 +#: awx/sso/conf.py:609 msgid "Google OAuth2" msgstr "OAuth2 pour Google" -#: sso/conf.py:545 +#: awx/sso/conf.py:545 msgid "Google OAuth2 Key" msgstr "Clé OAuth2 pour Google" -#: sso/conf.py:546 +#: awx/sso/conf.py:546 msgid "" -"The OAuth2 key from your web application at " -"https://console.developers.google.com/." +"The OAuth2 key from your web application at https://console.developers." +"google.com/." msgstr "" -"Clé OAuth2 de votre application Web sur " -"https://console.developers.google.com/." +"Clé OAuth2 de votre application Web sur https://console.developers.google." +"com/." -#: sso/conf.py:556 +#: awx/sso/conf.py:556 msgid "Google OAuth2 Secret" msgstr "Secret OAuth2 pour Google" -#: sso/conf.py:557 +#: awx/sso/conf.py:557 msgid "" -"The OAuth2 secret from your web application at " -"https://console.developers.google.com/." +"The OAuth2 secret from your web application at https://console.developers." +"google.com/." msgstr "" -"Secret OAuth2 de votre application Web sur " -"https://console.developers.google.com/." +"Secret OAuth2 de votre application Web sur https://console.developers.google." +"com/." -#: sso/conf.py:568 +#: awx/sso/conf.py:568 msgid "Google OAuth2 Whitelisted Domains" msgstr "Domaines sur liste blanche OAuth2 pour Google" -#: sso/conf.py:569 +#: awx/sso/conf.py:569 msgid "" "Update this setting to restrict the domains who are allowed to login using " "Google OAuth2." msgstr "" -"Mettez à jour ce paramètre pour limiter les domaines qui sont autorisés à se" -" connecter à l'aide de l'authentification OAuth2 avec un compte Google." +"Mettez à jour ce paramètre pour limiter les domaines qui sont autorisés à se " +"connecter à l'aide de l'authentification OAuth2 avec un compte Google." -#: sso/conf.py:580 +#: awx/sso/conf.py:580 msgid "Google OAuth2 Extra Arguments" msgstr "Arguments OAuth2 supplémentaires pour Google" -#: sso/conf.py:581 +#: awx/sso/conf.py:581 msgid "" "Extra arguments for Google OAuth2 login. When only allowing a single domain " "to authenticate, set to `{\"hd\": \"yourdomain.com\"}` and Google will not " @@ -3381,104 +3747,113 @@ msgstr "" "autre compte même si l'utilisateur est connecté avec plusieurs comptes " "Google." -#: sso/conf.py:595 +#: awx/sso/conf.py:595 msgid "Google OAuth2 Organization Map" msgstr "Mappe d'organisations OAuth2 pour Google" -#: sso/conf.py:607 +#: awx/sso/conf.py:607 msgid "Google OAuth2 Team Map" msgstr "Mappe d'équipes OAuth2 pour Google" -#: sso/conf.py:623 +#: awx/sso/conf.py:623 msgid "GitHub OAuth2 Callback URL" msgstr "URL de rappel OAuth2 pour GitHub" -#: sso/conf.py:624 +#: awx/sso/conf.py:624 msgid "" "Create a developer application at https://github.com/settings/developers to " "obtain an OAuth2 key (Client ID) and secret (Client Secret). Provide this " "URL as the callback URL for your application." msgstr "" -"Créez une application de développeur sur " -"https://github.com/settings/developers pour obtenir une clé OAuth2 (ID " -"client) et un secret (secret client). Entrez cette URL comme URL de rappel " -"de votre application." +"Créez une application de développeur sur https://github.com/settings/" +"developers pour obtenir une clé OAuth2 (ID client) et un secret (secret " +"client). Entrez cette URL comme URL de rappel de votre application." -#: sso/conf.py:628 sso/conf.py:639 sso/conf.py:649 sso/conf.py:661 -#: sso/conf.py:673 +#: awx/sso/conf.py:628 +#: awx/sso/conf.py:639 +#: awx/sso/conf.py:649 +#: awx/sso/conf.py:661 +#: awx/sso/conf.py:673 msgid "GitHub OAuth2" msgstr "OAuth2 pour GitHub" -#: sso/conf.py:637 +#: awx/sso/conf.py:637 msgid "GitHub OAuth2 Key" msgstr "Clé OAuth2 pour GitHub" -#: sso/conf.py:638 +#: awx/sso/conf.py:638 msgid "The OAuth2 key (Client ID) from your GitHub developer application." msgstr "Clé OAuth2 (ID client) de votre application de développeur GitHub." -#: sso/conf.py:647 +#: awx/sso/conf.py:647 msgid "GitHub OAuth2 Secret" msgstr "Secret OAuth2 pour GitHub" -#: sso/conf.py:648 +#: awx/sso/conf.py:648 msgid "" "The OAuth2 secret (Client Secret) from your GitHub developer application." msgstr "" "Secret OAuth2 (secret client) de votre application de développeur GitHub." -#: sso/conf.py:659 +#: awx/sso/conf.py:659 msgid "GitHub OAuth2 Organization Map" msgstr "Mappe d'organisations OAuth2 pour GitHub" -#: sso/conf.py:671 +#: awx/sso/conf.py:671 msgid "GitHub OAuth2 Team Map" msgstr "Mappe d'équipes OAuth2 pour GitHub" -#: sso/conf.py:687 +#: awx/sso/conf.py:687 msgid "GitHub Organization OAuth2 Callback URL" msgstr "URL de rappel OAuth2 pour les organisations GitHub" -#: sso/conf.py:688 sso/conf.py:763 +#: awx/sso/conf.py:688 +#: awx/sso/conf.py:763 msgid "" -"Create an organization-owned application at " -"https://github.com/organizations//settings/applications and obtain " -"an OAuth2 key (Client ID) and secret (Client Secret). Provide this URL as " -"the callback URL for your application." +"Create an organization-owned application at https://github.com/organizations/" +"/settings/applications and obtain an OAuth2 key (Client ID) and " +"secret (Client Secret). Provide this URL as the callback URL for your " +"application." msgstr "" -"Créez une application appartenant à une organisation sur " -"https://github.com/organizations//settings/applications et obtenez" -" une clé OAuth2 (ID client) et un secret (secret client). Entrez cette URL " -"comme URL de rappel de votre application." +"Créez une application appartenant à une organisation sur https://github.com/" +"organizations//settings/applications et obtenez une clé OAuth2 (ID " +"client) et un secret (secret client). Entrez cette URL comme URL de rappel " +"de votre application." -#: sso/conf.py:692 sso/conf.py:703 sso/conf.py:713 sso/conf.py:725 -#: sso/conf.py:736 sso/conf.py:748 +#: awx/sso/conf.py:692 +#: awx/sso/conf.py:703 +#: awx/sso/conf.py:713 +#: awx/sso/conf.py:725 +#: awx/sso/conf.py:736 +#: awx/sso/conf.py:748 msgid "GitHub Organization OAuth2" msgstr "OAuth2 pour les organisations GitHub" -#: sso/conf.py:701 +#: awx/sso/conf.py:701 msgid "GitHub Organization OAuth2 Key" msgstr "Clé OAuth2 pour les organisations GitHub" -#: sso/conf.py:702 sso/conf.py:777 +#: awx/sso/conf.py:702 +#: awx/sso/conf.py:777 msgid "The OAuth2 key (Client ID) from your GitHub organization application." msgstr "Clé OAuth2 (ID client) de votre application d'organisation GitHub." -#: sso/conf.py:711 +#: awx/sso/conf.py:711 msgid "GitHub Organization OAuth2 Secret" msgstr "Secret OAuth2 pour les organisations GitHub" -#: sso/conf.py:712 sso/conf.py:787 +#: awx/sso/conf.py:712 +#: awx/sso/conf.py:787 msgid "" "The OAuth2 secret (Client Secret) from your GitHub organization application." msgstr "" "Secret OAuth2 (secret client) de votre application d'organisation GitHub." -#: sso/conf.py:722 +#: awx/sso/conf.py:722 msgid "GitHub Organization Name" msgstr "Nom de l'organisation GitHub" -#: sso/conf.py:723 +#: awx/sso/conf.py:723 msgid "" "The name of your GitHub organization, as used in your organization's URL: " "https://github.com//." @@ -3486,101 +3861,108 @@ msgstr "" "Nom de votre organisation GitHub, tel qu'utilisé dans l'URL de votre " "organisation : https://github.com//." -#: sso/conf.py:734 +#: awx/sso/conf.py:734 msgid "GitHub Organization OAuth2 Organization Map" msgstr "Mappe d'organisations OAuth2 pour les organisations GitHub" -#: sso/conf.py:746 +#: awx/sso/conf.py:746 msgid "GitHub Organization OAuth2 Team Map" msgstr "Mappe d'équipes OAuth2 pour les organisations GitHub" -#: sso/conf.py:762 +#: awx/sso/conf.py:762 msgid "GitHub Team OAuth2 Callback URL" msgstr "URL de rappel OAuth2 pour les équipes GitHub" -#: sso/conf.py:767 sso/conf.py:778 sso/conf.py:788 sso/conf.py:800 -#: sso/conf.py:811 sso/conf.py:823 +#: awx/sso/conf.py:767 +#: awx/sso/conf.py:778 +#: awx/sso/conf.py:788 +#: awx/sso/conf.py:800 +#: awx/sso/conf.py:811 +#: awx/sso/conf.py:823 msgid "GitHub Team OAuth2" msgstr "OAuth2 pour les équipes GitHub" -#: sso/conf.py:776 +#: awx/sso/conf.py:776 msgid "GitHub Team OAuth2 Key" msgstr "Clé OAuth2 pour les équipes GitHub" -#: sso/conf.py:786 +#: awx/sso/conf.py:786 msgid "GitHub Team OAuth2 Secret" msgstr "Secret OAuth2 pour les équipes GitHub" -#: sso/conf.py:797 +#: awx/sso/conf.py:797 msgid "GitHub Team ID" msgstr "ID d'équipe GitHub" -#: sso/conf.py:798 +#: awx/sso/conf.py:798 msgid "" -"Find the numeric team ID using the Github API: http://fabian-" -"kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." +"Find the numeric team ID using the Github API: http://fabian-kostadinov." +"github.io/2015/01/16/how-to-find-a-github-team-id/." msgstr "" -"Recherchez votre ID d'équipe numérique à l'aide de l'API Github : http" -"://fabian-kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." +"Recherchez votre ID d'équipe numérique à l'aide de l'API Github : http://" +"fabian-kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." -#: sso/conf.py:809 +#: awx/sso/conf.py:809 msgid "GitHub Team OAuth2 Organization Map" msgstr "Mappe d'organisations OAuth2 pour les équipes GitHub" -#: sso/conf.py:821 +#: awx/sso/conf.py:821 msgid "GitHub Team OAuth2 Team Map" msgstr "Mappe d'équipes OAuth2 pour les équipes GitHub" -#: sso/conf.py:837 +#: awx/sso/conf.py:837 msgid "Azure AD OAuth2 Callback URL" msgstr "URL de rappel OAuth2 pour Azure AD" -#: sso/conf.py:838 +#: awx/sso/conf.py:838 msgid "" -"Register an Azure AD application as described by https://msdn.microsoft.com" -"/en-us/library/azure/dn132599.aspx and obtain an OAuth2 key (Client ID) and " +"Register an Azure AD application as described by https://msdn.microsoft.com/" +"en-us/library/azure/dn132599.aspx and obtain an OAuth2 key (Client ID) and " "secret (Client Secret). Provide this URL as the callback URL for your " "application." msgstr "" -"Enregistrez une application AD Azure selon la procédure décrite sur " -"https://msdn.microsoft.com/en-us/library/azure/dn132599.aspx et obtenez une " -"clé OAuth2 (ID client) et un secret (secret client). Entrez cette URL comme " -"URL de rappel de votre application." +"Enregistrez une application AD Azure selon la procédure décrite sur https://" +"msdn.microsoft.com/en-us/library/azure/dn132599.aspx et obtenez une clé " +"OAuth2 (ID client) et un secret (secret client). Entrez cette URL comme URL " +"de rappel de votre application." -#: sso/conf.py:842 sso/conf.py:853 sso/conf.py:863 sso/conf.py:875 -#: sso/conf.py:887 +#: awx/sso/conf.py:842 +#: awx/sso/conf.py:853 +#: awx/sso/conf.py:863 +#: awx/sso/conf.py:875 +#: awx/sso/conf.py:887 msgid "Azure AD OAuth2" msgstr "OAuth2 pour Azure AD" -#: sso/conf.py:851 +#: awx/sso/conf.py:851 msgid "Azure AD OAuth2 Key" msgstr "Clé OAuth2 pour Azure AD" -#: sso/conf.py:852 +#: awx/sso/conf.py:852 msgid "The OAuth2 key (Client ID) from your Azure AD application." msgstr "Clé OAuth2 (ID client) de votre application Azure AD." -#: sso/conf.py:861 +#: awx/sso/conf.py:861 msgid "Azure AD OAuth2 Secret" msgstr "Secret OAuth2 pour Azure AD" -#: sso/conf.py:862 +#: awx/sso/conf.py:862 msgid "The OAuth2 secret (Client Secret) from your Azure AD application." msgstr "Secret OAuth2 (secret client) de votre application Azure AD." -#: sso/conf.py:873 +#: awx/sso/conf.py:873 msgid "Azure AD OAuth2 Organization Map" msgstr "Mappe d'organisations OAuth2 pour Azure AD" -#: sso/conf.py:885 +#: awx/sso/conf.py:885 msgid "Azure AD OAuth2 Team Map" msgstr "Mappe d'équipes OAuth2 pour Azure AD" -#: sso/conf.py:906 +#: awx/sso/conf.py:906 msgid "SAML Service Provider Callback URL" msgstr "URL de rappel du fournisseur de services SAML" -#: sso/conf.py:907 +#: awx/sso/conf.py:907 msgid "" "Register Tower as a service provider (SP) with each identity provider (IdP) " "you have configured. Provide your SP Entity ID and this callback URL for " @@ -3590,17 +3972,25 @@ msgstr "" "fournisseur d'identité (IdP) que vous avez configuré. Entrez votre ID " "d'entité SP et cette URL de rappel pour votre application." -#: sso/conf.py:910 sso/conf.py:924 sso/conf.py:937 sso/conf.py:951 -#: sso/conf.py:965 sso/conf.py:983 sso/conf.py:1005 sso/conf.py:1024 -#: sso/conf.py:1044 sso/conf.py:1078 sso/conf.py:1091 +#: awx/sso/conf.py:910 +#: awx/sso/conf.py:924 +#: awx/sso/conf.py:937 +#: awx/sso/conf.py:951 +#: awx/sso/conf.py:965 +#: awx/sso/conf.py:983 +#: awx/sso/conf.py:1005 +#: awx/sso/conf.py:1024 +#: awx/sso/conf.py:1044 +#: awx/sso/conf.py:1078 +#: awx/sso/conf.py:1091 msgid "SAML" msgstr "SAML" -#: sso/conf.py:921 +#: awx/sso/conf.py:921 msgid "SAML Service Provider Metadata URL" msgstr "URL de métadonnées du fournisseur de services SAML" -#: sso/conf.py:922 +#: awx/sso/conf.py:922 msgid "" "If your identity provider (IdP) allows uploading an XML metadata file, you " "can download one from this URL." @@ -3608,11 +3998,11 @@ msgstr "" "Si votre fournisseur d'identité (IdP) permet de télécharger un fichier de " "métadonnées XML, vous pouvez le faire à partir de cette URL." -#: sso/conf.py:934 +#: awx/sso/conf.py:934 msgid "SAML Service Provider Entity ID" msgstr "ID d'entité du fournisseur de services SAML" -#: sso/conf.py:935 +#: awx/sso/conf.py:935 msgid "" "The application-defined unique identifier used as the audience of the SAML " "service provider (SP) configuration." @@ -3620,109 +4010,109 @@ msgstr "" "Identifiant unique défini par l'application utilisé comme audience dans la " "configuration du fournisseur de services (SP) SAML." -#: sso/conf.py:948 +#: awx/sso/conf.py:948 msgid "SAML Service Provider Public Certificate" msgstr "Certificat public du fournisseur de services SAML" -#: sso/conf.py:949 +#: awx/sso/conf.py:949 msgid "" -"Create a keypair for Tower to use as a service provider (SP) and include the" -" certificate content here." +"Create a keypair for Tower to use as a service provider (SP) and include the " +"certificate content here." msgstr "" -"Créez une paire de clés pour que Tower puisse être utilisé comme fournisseur" -" de services (SP) et entrez le contenu du certificat ici." +"Créez une paire de clés pour que Tower puisse être utilisé comme fournisseur " +"de services (SP) et entrez le contenu du certificat ici." -#: sso/conf.py:962 +#: awx/sso/conf.py:962 msgid "SAML Service Provider Private Key" msgstr "Clé privée du fournisseur de services SAML" -#: sso/conf.py:963 +#: awx/sso/conf.py:963 msgid "" -"Create a keypair for Tower to use as a service provider (SP) and include the" -" private key content here." +"Create a keypair for Tower to use as a service provider (SP) and include the " +"private key content here." msgstr "" -"Créez une paire de clés pour que Tower puisse être utilisé comme fournisseur" -" de services (SP) et entrez le contenu de la clé privée ici." +"Créez une paire de clés pour que Tower puisse être utilisé comme fournisseur " +"de services (SP) et entrez le contenu de la clé privée ici." -#: sso/conf.py:981 +#: awx/sso/conf.py:981 msgid "SAML Service Provider Organization Info" msgstr "Infos organisationnelles du fournisseur de services SAML" -#: sso/conf.py:982 +#: awx/sso/conf.py:982 msgid "Configure this setting with information about your app." msgstr "" "Configurez ce paramètre en vous servant des informations de votre " "application." -#: sso/conf.py:1003 +#: awx/sso/conf.py:1003 msgid "SAML Service Provider Technical Contact" msgstr "Contact technique du fournisseur de services SAML" -#: sso/conf.py:1004 sso/conf.py:1023 +#: awx/sso/conf.py:1004 +#: awx/sso/conf.py:1023 msgid "Configure this setting with your contact information." msgstr "Configurez ce paramètre en vous servant de vos coordonnées." -#: sso/conf.py:1022 +#: awx/sso/conf.py:1022 msgid "SAML Service Provider Support Contact" msgstr "Contact support du fournisseur de services SAML" -#: sso/conf.py:1037 +#: awx/sso/conf.py:1037 msgid "SAML Enabled Identity Providers" msgstr "Fournisseurs d'identité compatibles SAML" -#: sso/conf.py:1038 +#: awx/sso/conf.py:1038 msgid "" "Configure the Entity ID, SSO URL and certificate for each identity provider " "(IdP) in use. Multiple SAML IdPs are supported. Some IdPs may provide user " -"data using attribute names that differ from the default OIDs " -"(https://github.com/omab/python-social-" -"auth/blob/master/social/backends/saml.py#L16). Attribute names may be " -"overridden for each IdP." +"data using attribute names that differ from the default OIDs (https://github." +"com/omab/python-social-auth/blob/master/social/backends/saml.py#L16). " +"Attribute names may be overridden for each IdP." msgstr "" -"Configurez l'ID d'entité, l'URL SSO et le certificat pour chaque fournisseur" -" d'identité (IdP) utilisé. Plusieurs IdP SAML sont pris en charge. Certains " -"IdP peuvent fournir des données utilisateur à l'aide de noms d'attributs qui" -" diffèrent des OID par défaut (https://github.com/omab/python-social-" -"auth/blob/master/social/backends/saml.py#L16). Les noms d'attributs peuvent " -"être remplacés pour chaque IdP." +"Configurez l'ID d'entité, l'URL SSO et le certificat pour chaque fournisseur " +"d'identité (IdP) utilisé. Plusieurs IdP SAML sont pris en charge. Certains " +"IdP peuvent fournir des données utilisateur à l'aide de noms d'attributs qui " +"diffèrent des OID par défaut (https://github.com/omab/python-social-auth/" +"blob/master/social/backends/saml.py#L16). Les noms d'attributs peuvent être " +"remplacés pour chaque IdP." -#: sso/conf.py:1076 +#: awx/sso/conf.py:1076 msgid "SAML Organization Map" msgstr "Mappe d'organisations SAML" -#: sso/conf.py:1089 +#: awx/sso/conf.py:1089 msgid "SAML Team Map" msgstr "Mappe d'équipes SAML" -#: sso/fields.py:123 +#: awx/sso/fields.py:123 msgid "Invalid connection option(s): {invalid_options}." msgstr "Option(s) de connexion non valide(s) : {invalid_options}." -#: sso/fields.py:194 +#: awx/sso/fields.py:194 msgid "Base" msgstr "Base" -#: sso/fields.py:195 +#: awx/sso/fields.py:195 msgid "One Level" msgstr "Un niveau" -#: sso/fields.py:196 +#: awx/sso/fields.py:196 msgid "Subtree" msgstr "Sous-arborescence" -#: sso/fields.py:214 +#: awx/sso/fields.py:214 msgid "Expected a list of three items but got {length} instead." msgstr "" "Une liste de trois éléments était attendue, mais {length} a été obtenu à la " "place." -#: sso/fields.py:215 +#: awx/sso/fields.py:215 msgid "Expected an instance of LDAPSearch but got {input_type} instead." msgstr "" "Une instance de LDAPSearch était attendue, mais {input_type} a été obtenu à " "la place." -#: sso/fields.py:251 +#: awx/sso/fields.py:251 msgid "" "Expected an instance of LDAPSearch or LDAPSearchUnion but got {input_type} " "instead." @@ -3730,123 +4120,129 @@ msgstr "" "Une instance de LDAPSearch ou de LDAPSearchUnion était attendue, mais " "{input_type} a été obtenu à la place." -#: sso/fields.py:278 +#: awx/sso/fields.py:278 msgid "Invalid user attribute(s): {invalid_attrs}." msgstr "Attribut(s) d'utilisateur non valide(s) : {invalid_attrs}." -#: sso/fields.py:295 +#: awx/sso/fields.py:295 msgid "Expected an instance of LDAPGroupType but got {input_type} instead." msgstr "" -"Une instance de LDAPGroupType était attendue, mais {input_type} a été obtenu" -" à la place." +"Une instance de LDAPGroupType était attendue, mais {input_type} a été obtenu " +"à la place." -#: sso/fields.py:323 +#: awx/sso/fields.py:323 msgid "Invalid user flag: \"{invalid_flag}\"." msgstr "Marqueur d'utilisateur non valide : \"{invalid_flag}\"." -#: sso/fields.py:339 sso/fields.py:506 +#: awx/sso/fields.py:339 +#: awx/sso/fields.py:506 msgid "" -"Expected None, True, False, a string or list of strings but got {input_type}" -" instead." +"Expected None, True, False, a string or list of strings but got {input_type} " +"instead." msgstr "" "Les valeurs None, True, False, une chaîne ou une liste de chaînes étaient " "attendues, mais {input_type} a été obtenu à la place." -#: sso/fields.py:375 +#: awx/sso/fields.py:375 msgid "Missing key(s): {missing_keys}." msgstr "Clé(s) manquante(s) : {missing_keys}." -#: sso/fields.py:376 +#: awx/sso/fields.py:376 msgid "Invalid key(s): {invalid_keys}." msgstr "Clé(s) non valide(s) : {invalid_keys}." -#: sso/fields.py:425 sso/fields.py:542 +#: awx/sso/fields.py:425 +#: awx/sso/fields.py:542 msgid "Invalid key(s) for organization map: {invalid_keys}." msgstr "Clé(s) non valide(s) pour la mappe d'organisations : {invalid_keys}." -#: sso/fields.py:443 +#: awx/sso/fields.py:443 msgid "Missing required key for team map: {invalid_keys}." msgstr "Clé obligatoire manquante pour la mappe d'équipes : {invalid_keys}." -#: sso/fields.py:444 sso/fields.py:561 +#: awx/sso/fields.py:444 +#: awx/sso/fields.py:561 msgid "Invalid key(s) for team map: {invalid_keys}." msgstr "Clé(s) non valide(s) pour la mappe d'équipes : {invalid_keys}." -#: sso/fields.py:560 +#: awx/sso/fields.py:560 msgid "Missing required key for team map: {missing_keys}." msgstr "Clé obligatoire manquante pour la mappe d'équipes : {missing_keys}." -#: sso/fields.py:578 +#: awx/sso/fields.py:578 msgid "Missing required key(s) for org info record: {missing_keys}." msgstr "" -"Clé(s) obligatoire(s) manquante(s) pour l'enregistrement des infos organis. " -": {missing_keys}." +"Clé(s) obligatoire(s) manquante(s) pour l'enregistrement des infos organis. :" +" {missing_keys}." -#: sso/fields.py:591 +#: awx/sso/fields.py:591 msgid "Invalid language code(s) for org info: {invalid_lang_codes}." msgstr "" -"Code(s) langage non valide(s) pour les infos organis. : " -"{invalid_lang_codes}." +"Code(s) langage non valide(s) pour les infos organis. : {invalid_lang_codes}." +"" -#: sso/fields.py:610 +#: awx/sso/fields.py:610 msgid "Missing required key(s) for contact: {missing_keys}." msgstr "Clé(s) obligatoire(s) manquante(s) pour le contact : {missing_keys}." -#: sso/fields.py:622 +#: awx/sso/fields.py:622 msgid "Missing required key(s) for IdP: {missing_keys}." msgstr "Clé(s) obligatoire(s) manquante(s) pour l'IdP : {missing_keys}." -#: sso/pipeline.py:24 +#: awx/sso/pipeline.py:24 msgid "An account cannot be found for {0}" msgstr "Impossible de trouver un compte pour {0}" -#: sso/pipeline.py:30 +#: awx/sso/pipeline.py:30 msgid "Your account is inactive" msgstr "Votre compte est inactif" -#: sso/validators.py:19 sso/validators.py:44 +#: awx/sso/validators.py:19 +#: awx/sso/validators.py:44 #, python-format msgid "DN must include \"%%(user)s\" placeholder for username: %s" msgstr "" -"Le ND doit inclure l'espace réservé \"%% (user)s\" pour le nom d'utilisateur" -" : % s" +"Le ND doit inclure l'espace réservé \"%%(user)s\" pour le nom d'utilisateur :" +" %s" -#: sso/validators.py:26 +#: awx/sso/validators.py:26 #, python-format msgid "Invalid DN: %s" msgstr "ND non valide : %s" -#: sso/validators.py:56 +#: awx/sso/validators.py:56 #, python-format msgid "Invalid filter: %s" msgstr "Filtre incorrect : %s" -#: templates/error.html:4 ui/templates/ui/index.html:8 +#: awx/templates/error.html:4 +#: awx/ui/templates/ui/index.html:8 msgid "Ansible Tower" msgstr "Ansible Tower" -#: templates/rest_framework/api.html:39 +#: awx/templates/rest_framework/api.html:39 msgid "Ansible Tower API Guide" msgstr "Guide pour les API d'Ansible Tower" -#: templates/rest_framework/api.html:40 +#: awx/templates/rest_framework/api.html:40 msgid "Back to Ansible Tower" msgstr "Retour à Ansible Tower" -#: templates/rest_framework/api.html:41 +#: awx/templates/rest_framework/api.html:41 msgid "Resize" msgstr "Redimensionner" -#: templates/rest_framework/base.html:78 templates/rest_framework/base.html:92 +#: awx/templates/rest_framework/base.html:78 +#: awx/templates/rest_framework/base.html:92 #, python-format msgid "Make a GET request on the %(name)s resource" msgstr "Appliquez une requête GET sur la ressource %(name)s" -#: templates/rest_framework/base.html:80 +#: awx/templates/rest_framework/base.html:80 msgid "Specify a format for the GET request" msgstr "Spécifiez un format pour la requête GET" -#: templates/rest_framework/base.html:86 +#: awx/templates/rest_framework/base.html:86 #, python-format msgid "" "Make a GET request on the %(name)s resource with the format set to " @@ -3855,70 +4251,73 @@ msgstr "" "Appliquez une requête GET sur la ressource %(name)s avec un format défini " "sur`%(format)s`" -#: templates/rest_framework/base.html:100 +#: awx/templates/rest_framework/base.html:100 #, python-format msgid "Make an OPTIONS request on the %(name)s resource" msgstr "Appliquez une requête OPTIONS sur la ressource %(name)s" -#: templates/rest_framework/base.html:106 +#: awx/templates/rest_framework/base.html:106 #, python-format msgid "Make a DELETE request on the %(name)s resource" msgstr "Appliquez une requête DELETE sur la ressource %(name)s" -#: templates/rest_framework/base.html:113 +#: awx/templates/rest_framework/base.html:113 msgid "Filters" msgstr "Filtres" -#: templates/rest_framework/base.html:172 -#: templates/rest_framework/base.html:186 +#: awx/templates/rest_framework/base.html:172 +#: awx/templates/rest_framework/base.html:186 #, python-format msgid "Make a POST request on the %(name)s resource" msgstr "Appliquez une requête POST sur la ressource %(name)s" -#: templates/rest_framework/base.html:216 -#: templates/rest_framework/base.html:230 +#: awx/templates/rest_framework/base.html:216 +#: awx/templates/rest_framework/base.html:230 #, python-format msgid "Make a PUT request on the %(name)s resource" msgstr "Appliquez une requête PUT sur la ressource %(name)s" -#: templates/rest_framework/base.html:233 +#: awx/templates/rest_framework/base.html:233 #, python-format msgid "Make a PATCH request on the %(name)s resource" msgstr "Appliquez une requête PATCH sur la ressource %(name)s" -#: ui/apps.py:9 ui/conf.py:22 ui/conf.py:38 ui/conf.py:53 +#: awx/ui/apps.py:9 +#: awx/ui/conf.py:22 +#: awx/ui/conf.py:38 +#: awx/ui/conf.py:53 msgid "UI" msgstr "IU" -#: ui/conf.py:16 +#: awx/ui/conf.py:16 msgid "Off" msgstr "Désactivé" -#: ui/conf.py:17 +#: awx/ui/conf.py:17 msgid "Anonymous" msgstr "Anonyme" -#: ui/conf.py:18 +#: awx/ui/conf.py:18 msgid "Detailed" msgstr "Détaillé" -#: ui/conf.py:20 +#: awx/ui/conf.py:20 msgid "Analytics Tracking State" msgstr "État du suivi analytique" -#: ui/conf.py:21 +#: awx/ui/conf.py:21 msgid "Enable or Disable Analytics Tracking." msgstr "Activez ou désactivez le suivi analytique." -#: ui/conf.py:31 +#: awx/ui/conf.py:31 msgid "Custom Login Info" msgstr "Infos de connexion personnalisées" -#: ui/conf.py:32 +#: awx/ui/conf.py:32 msgid "" "If needed, you can add specific information (such as a legal notice or a " -"disclaimer) to a text box in the login modal using this setting. Any content" -" added must be in plain text, as custom HTML or other markup languages are " +"disclaimer) to a text box in the login modal using this setting. Any content " +"added must be in plain text, as custom HTML or other markup languages are " "not supported. If multiple paragraphs of text are needed, new lines " "(paragraphs) must be escaped as `\\n` within the block of text." msgstr "" @@ -3931,21 +4330,21 @@ msgstr "" "(paragraphes) doivent être échappées sous la forme `\\n` dans le bloc de " "texte." -#: ui/conf.py:48 +#: awx/ui/conf.py:48 msgid "Custom Logo" msgstr "Logo personnalisé" -#: ui/conf.py:49 +#: awx/ui/conf.py:49 msgid "" -"To set up a custom logo, provide a file that you create. For the custom logo" -" to look its best, use a `.png` file with a transparent background. GIF, PNG" -" and JPEG formats are supported." +"To set up a custom logo, provide a file that you create. For the custom logo " +"to look its best, use a `.png` file with a transparent background. GIF, PNG " +"and JPEG formats are supported." msgstr "" -"Pour configurer un logo personnalisé, chargez un fichier que vous avez créé." -" Pour optimiser l'affichage du logo personnalisé, utilisez un fichier `.png`" -" avec un fond transparent. Les formats GIF, PNG et JPEG sont pris en charge." +"Pour configurer un logo personnalisé, chargez un fichier que vous avez créé. " +"Pour optimiser l'affichage du logo personnalisé, utilisez un fichier `.png` " +"avec un fond transparent. Les formats GIF, PNG et JPEG sont pris en charge." -#: ui/fields.py:29 +#: awx/ui/fields.py:29 msgid "" "Invalid format for custom logo. Must be a data URL with a base64-encoded " "GIF, PNG or JPEG image." @@ -3953,101 +4352,102 @@ msgstr "" "Format de logo personnalisé non valide. Entrez une URL de données avec une " "image GIF, PNG ou JPEG codée en base64." -#: ui/fields.py:30 +#: awx/ui/fields.py:30 msgid "Invalid base64-encoded data in data URL." msgstr "Données codées en base64 non valides dans l'URL de données" -#: ui/templates/ui/index.html:49 +#: awx/ui/templates/ui/index.html:49 msgid "" -"Your session will expire in 60 seconds, would you like to " -"continue?" +"Your session will expire in 60 seconds, would you like to continue?" msgstr "" -"Votre session expirera dans 60 secondes, voulez-vous continuer ?" +"Votre session expirera dans 60 secondes, voulez-vous continuer ?" -#: ui/templates/ui/index.html:64 +#: awx/ui/templates/ui/index.html:64 msgid "CANCEL" msgstr "ANNULER" -#: ui/templates/ui/index.html:116 +#: awx/ui/templates/ui/index.html:116 msgid "Set how many days of data should be retained." msgstr "" "Définissez le nombre de jours pendant lesquels les données doivent être " "conservées." -#: ui/templates/ui/index.html:122 +#: awx/ui/templates/ui/index.html:122 msgid "" -"Please enter an integer that is not " +"Please enter an integer that is not " "negative that is lower than " -"9999." +"prompt_for_days_form.days_to_keep.$error.max\"> that is lower than 9999." msgstr "" "Entrez un entier non négatif et inférieur à 9999." +"show=\"prompt_for_days_form.days_to_keep.$dirty && prompt_for_days_form." +"days_to_keep.$error.max\"> et inférieur à 9999." -#: ui/templates/ui/index.html:127 +#: awx/ui/templates/ui/index.html:127 msgid "" -"For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept.\n" +"For facts collected older than the time period specified, save one fact scan " +"(snapshot) per time window (frequency). For example, facts older than 30 " +"days are purged, while one weekly fact scan is kept.\n" "
\n" -"
CAUTION: Setting both numerical variables to \"0\" will delete all facts.\n" +"
CAUTION: Setting both numerical variables to \"0\" " +"will delete all facts.\n" "
\n" "
" msgstr "" -"Pour les faits collectés en amont de la période spécifiée, enregistrez un scan des faits (instantané) par fenêtre temporelle (fréquence). Par exemple, les faits antérieurs à 30 jours sont purgés, tandis qu'un scan de faits hebdomadaire est conservé.\n" +"Pour les faits collectés en amont de la période spécifiée, enregistrez un " +"scan des faits (instantané) par fenêtre temporelle (fréquence). Par exemple, " +"les faits antérieurs à 30 jours sont purgés, tandis qu'un scan de faits " +"hebdomadaire est conservé.\n" "
\n" -"
ATTENTION : le paramétrage des deux variables numériques sur \"0\" supprime l'ensemble des faits.\n" +"
ATTENTION : le paramétrage des deux variables numériques sur \"0\" " +"supprime l'ensemble des faits.\n" "
\n" "
" -#: ui/templates/ui/index.html:136 +#: awx/ui/templates/ui/index.html:136 msgid "Select a time period after which to remove old facts" msgstr "" "Sélectionnez un intervalle de temps après lequel les faits anciens pourront " "être supprimés" -#: ui/templates/ui/index.html:150 +#: awx/ui/templates/ui/index.html:150 msgid "" -"Please enter an integer that is not " -"negative that is lower than " -"9999." +"Please enter an integer " +"that is not negative " +"that is lower than 9999." msgstr "" -"Entrez un entier non négatif et inférieur à " -"9999
." +"Entrez un entier non négatif et inférieur à 9999." -#: ui/templates/ui/index.html:155 +#: awx/ui/templates/ui/index.html:155 msgid "Select a frequency for snapshot retention" msgstr "Sélectionnez une fréquence pour la conservation des instantanés" -#: ui/templates/ui/index.html:169 +#: awx/ui/templates/ui/index.html:169 msgid "" -"Please enter an integer that is not" -" negative that is not negative that is " "lower than 9999." msgstr "" -"Entrez un entier non " -"négatif non négatif et " "inférieur à 9999." -#: ui/templates/ui/index.html:175 +#: awx/ui/templates/ui/index.html:175 msgid "working..." msgstr "en cours..." diff --git a/awx/locale/ja/LC_MESSAGES/django.po b/awx/locale/ja/LC_MESSAGES/django.po index 7e5cf1156c..721de24e63 100644 --- a/awx/locale/ja/LC_MESSAGES/django.po +++ b/awx/locale/ja/LC_MESSAGES/django.po @@ -4,8 +4,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-12-15 12:05+0530\n" -"PO-Revision-Date: 2017-01-20 12:04+0000\n" -"Last-Translator: Copied by Zanata \n" +"PO-Revision-Date: 2017-02-02 01:04+0000\n" +"Last-Translator: asasaki \n" "Language-Team: Japanese\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -14,128 +14,135 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.9.6\n" -#: api/authentication.py:67 +#: awx/api/authentication.py:67 msgid "Invalid token header. No credentials provided." msgstr "無効なトークンヘッダーです。認証情報が提供されていません。" -#: api/authentication.py:70 +#: awx/api/authentication.py:70 msgid "Invalid token header. Token string should not contain spaces." msgstr "無効なトークンヘッダーです。トークン文字列にはスペースを含めることができません。" -#: api/authentication.py:105 +#: awx/api/authentication.py:105 msgid "User inactive or deleted" msgstr "ユーザーが非アクティブか、または削除されています" -#: api/authentication.py:161 +#: awx/api/authentication.py:161 msgid "Invalid task token" msgstr "無効なタスクトークン" -#: api/conf.py:12 +#: awx/api/conf.py:12 msgid "Idle Time Force Log Out" msgstr "アイドル時間、強制ログアウト" -#: api/conf.py:13 +#: awx/api/conf.py:13 msgid "" "Number of seconds that a user is inactive before they will need to login " "again." msgstr "ユーザーが再ログインするまでに非アクティブな状態になる秒数です。" -#: api/conf.py:14 api/conf.py:24 api/conf.py:33 sso/conf.py:124 -#: sso/conf.py:135 sso/conf.py:147 sso/conf.py:162 +#: awx/api/conf.py:14 +#: awx/api/conf.py:24 +#: awx/api/conf.py:33 +#: awx/sso/conf.py:124 +#: awx/sso/conf.py:135 +#: awx/sso/conf.py:147 +#: awx/sso/conf.py:162 msgid "Authentication" msgstr "認証" -#: api/conf.py:22 +#: awx/api/conf.py:22 msgid "Maximum number of simultaneous logins" msgstr "同時ログインの最大数" -#: api/conf.py:23 +#: awx/api/conf.py:23 msgid "" "Maximum number of simultaneous logins a user may have. To disable enter -1." msgstr "ユーザーが実行できる同時ログインの最大数です。無効にするには -1 を入力します。" -#: api/conf.py:31 +#: awx/api/conf.py:31 msgid "Enable HTTP Basic Auth" msgstr "HTTP Basic 認証の有効化" -#: api/conf.py:32 +#: awx/api/conf.py:32 msgid "Enable HTTP Basic Auth for the API Browser." msgstr "API ブラウザーの HTTP Basic 認証を有効にします。" -#: api/generics.py:462 +#: awx/api/generics.py:466 msgid "\"id\" is required to disassociate" msgstr "関連付けを解除するには 「id」が必要です" -#: api/metadata.py:50 +#: awx/api/metadata.py:50 msgid "Database ID for this {}." msgstr "この{}のデータベース ID。" -#: api/metadata.py:51 +#: awx/api/metadata.py:51 msgid "Name of this {}." msgstr "この{}の名前。" -#: api/metadata.py:52 +#: awx/api/metadata.py:52 msgid "Optional description of this {}." msgstr "この{}のオプションの説明。" -#: api/metadata.py:53 +#: awx/api/metadata.py:53 msgid "Data type for this {}." msgstr "この{}のデータタイプ。" -#: api/metadata.py:54 +#: awx/api/metadata.py:54 msgid "URL for this {}." msgstr "この{}の URL。" -#: api/metadata.py:55 +#: awx/api/metadata.py:55 msgid "Data structure with URLs of related resources." msgstr "関連リソースの URL のあるデータ構造。" -#: api/metadata.py:56 +#: awx/api/metadata.py:56 msgid "Data structure with name/description for related resources." msgstr "関連リソースの名前/説明のあるデータ構造。" -#: api/metadata.py:57 +#: awx/api/metadata.py:57 msgid "Timestamp when this {} was created." msgstr "この {} の作成時のタイムスタンプ。" -#: api/metadata.py:58 +#: awx/api/metadata.py:58 msgid "Timestamp when this {} was last modified." msgstr "この {} の最終変更時のタイムスタンプ。" -#: api/parsers.py:31 +#: awx/api/parsers.py:31 #, python-format msgid "JSON parse error - %s" msgstr "JSON パースエラー: %s" -#: api/serializers.py:248 +#: awx/api/serializers.py:250 msgid "Playbook Run" msgstr "Playbook 実行" -#: api/serializers.py:249 +#: awx/api/serializers.py:251 msgid "Command" msgstr "コマンド" -#: api/serializers.py:250 +#: awx/api/serializers.py:252 msgid "SCM Update" msgstr "SCM 更新" -#: api/serializers.py:251 +#: awx/api/serializers.py:253 msgid "Inventory Sync" msgstr "インベントリーの同期" -#: api/serializers.py:252 +#: awx/api/serializers.py:254 msgid "Management Job" msgstr "管理ジョブ" -#: api/serializers.py:253 +#: awx/api/serializers.py:255 msgid "Workflow Job" msgstr "ワークフロージョブ" -#: api/serializers.py:254 +#: awx/api/serializers.py:256 msgid "Workflow Template" -msgstr "" +msgstr "ワークフローテンプレート" -#: api/serializers.py:656 api/serializers.py:714 api/views.py:3805 +#: awx/api/serializers.py:658 +#: awx/api/serializers.py:716 +#: awx/api/views.py:3817 #, python-format msgid "" "Standard Output too large to display (%(text_size)d bytes), only download " @@ -144,244 +151,256 @@ msgstr "" "標準出力が大きすぎて表示できません (%(text_size)d バイト)。サイズが %(supported_size)d " "バイトを超える場合はダウンロードのみがサポートされます。" -#: api/serializers.py:729 +#: awx/api/serializers.py:731 msgid "Write-only field used to change the password." msgstr "パスワードを変更するために使用される書き込み専用フィールド。" -#: api/serializers.py:731 +#: awx/api/serializers.py:733 msgid "Set if the account is managed by an external service" msgstr "アカウントが外部サービスで管理される場合に設定されます" -#: api/serializers.py:755 +#: awx/api/serializers.py:757 msgid "Password required for new User." msgstr "新規ユーザーのパスワードを入力してください。" -#: api/serializers.py:839 +#: awx/api/serializers.py:841 #, python-format msgid "Unable to change %s on user managed by LDAP." msgstr "LDAP で管理されたユーザーの %s を変更できません。" -#: api/serializers.py:991 +#: awx/api/serializers.py:1002 msgid "Organization is missing" msgstr "組織がありません" -#: api/serializers.py:997 +#: awx/api/serializers.py:1006 +msgid "Update options must be set to false for manual projects." +msgstr "手動プロジェクトについては更新オプションを false に設定する必要があります。" + +#: awx/api/serializers.py:1012 msgid "Array of playbooks available within this project." msgstr "このプロジェクト内で利用可能な一連の Playbook。" -#: api/serializers.py:1179 +#: awx/api/serializers.py:1194 #, python-format msgid "Invalid port specification: %s" msgstr "無効なポート指定: %s" -#: api/serializers.py:1207 main/validators.py:193 +#: awx/api/serializers.py:1222 +#: awx/main/validators.py:193 msgid "Must be valid JSON or YAML." msgstr "有効な JSON または YAML である必要があります。" -#: api/serializers.py:1264 +#: awx/api/serializers.py:1279 msgid "Invalid group name." msgstr "無効なグループ名。" -#: api/serializers.py:1339 +#: awx/api/serializers.py:1354 msgid "" "Script must begin with a hashbang sequence: i.e.... #!/usr/bin/env python" msgstr "スクリプトは hashbang シーケンスで開始する必要があります (例: .... #!/usr/bin/env python)" -#: api/serializers.py:1392 +#: awx/api/serializers.py:1407 msgid "If 'source' is 'custom', 'source_script' must be provided." msgstr "「source」が「custom」である場合、「source_script」を指定する必要があります。" -#: api/serializers.py:1396 +#: awx/api/serializers.py:1411 msgid "" "The 'source_script' does not belong to the same organization as the " "inventory." msgstr "「source_script」はインベントリーと同じ組織に属しません。" -#: api/serializers.py:1398 +#: awx/api/serializers.py:1413 msgid "'source_script' doesn't exist." msgstr "「source_script」は存在しません。" -#: api/serializers.py:1757 +#: awx/api/serializers.py:1772 msgid "" "Write-only field used to add user to owner role. If provided, do not give " "either team or organization. Only valid for creation." msgstr "" "ユーザーを所有者ロールに追加するために使用される書き込み専用フィールドです。提供されている場合は、チームまたは組織のいずれも指定しないでください。作成時にのみ有効です。" -#: api/serializers.py:1762 +#: awx/api/serializers.py:1777 msgid "" "Write-only field used to add team to owner role. If provided, do not give " "either user or organization. Only valid for creation." msgstr "" "チームを所有者ロールに追加するために使用される書き込み専用フィールドです。提供されている場合は、ユーザーまたは組織のいずれも指定しないでください。作成時にのみ有効です。" -#: api/serializers.py:1767 +#: awx/api/serializers.py:1782 msgid "" -"Inherit permissions from organization roles. If provided on creation, do not" -" give either user or team." +"Inherit permissions from organization roles. If provided on creation, do not " +"give either user or team." msgstr "組織ロールからパーミッションを継承します。作成時に提供される場合は、ユーザーまたはチームのいずれも指定しないでください。" -#: api/serializers.py:1783 +#: awx/api/serializers.py:1798 msgid "Missing 'user', 'team', or 'organization'." msgstr "「user」、「team」、または「organization」がありません。" -#: api/serializers.py:1796 +#: awx/api/serializers.py:1811 msgid "" "Credential organization must be set and match before assigning to a team" msgstr "認証情報の組織が設定され、一致している状態でチームに割り当てる必要があります。" -#: api/serializers.py:1888 +#: awx/api/serializers.py:1903 msgid "This field is required." msgstr "このフィールドは必須です。" -#: api/serializers.py:1890 api/serializers.py:1892 +#: awx/api/serializers.py:1905 +#: awx/api/serializers.py:1907 msgid "Playbook not found for project." msgstr "プロジェクトの Playbook が見つかりません。" -#: api/serializers.py:1894 +#: awx/api/serializers.py:1909 msgid "Must select playbook for project." msgstr "プロジェクトの Playbook を選択してください。" -#: api/serializers.py:1958 main/models/jobs.py:278 +#: awx/api/serializers.py:1975 +msgid "Must either set a default value or ask to prompt on launch." +msgstr "起動時にプロントを出すには、デフォルト値を設定するか、またはプロンプトを出すよう指定する必要があります。" + +#: awx/api/serializers.py:1978 +#: awx/main/models/jobs.py:278 msgid "Scan jobs must be assigned a fixed inventory." msgstr "スキャンジョブに固定インベントリーが割り当てられている必要があります。" -#: api/serializers.py:1960 main/models/jobs.py:281 +#: awx/api/serializers.py:1980 +#: awx/main/models/jobs.py:281 msgid "Job types 'run' and 'check' must have assigned a project." msgstr "ジョブタイプ「run」および「check」によりプロジェクトが割り当てられている必要があります。" -#: api/serializers.py:1963 +#: awx/api/serializers.py:1987 msgid "Survey Enabled cannot be used with scan jobs." msgstr "Survey Enabled はスキャンジョブで使用できません。" -#: api/serializers.py:2023 +#: awx/api/serializers.py:2047 msgid "Invalid job template." msgstr "無効なジョブテンプレート。" -#: api/serializers.py:2108 +#: awx/api/serializers.py:2132 msgid "Credential not found or deleted." msgstr "認証情報が見つからないか、または削除されました。" -#: api/serializers.py:2110 +#: awx/api/serializers.py:2134 msgid "Job Template Project is missing or undefined." msgstr "ジョブテンプレートプロジェクトが見つからないか、または定義されていません。" -#: api/serializers.py:2112 +#: awx/api/serializers.py:2136 msgid "Job Template Inventory is missing or undefined." msgstr "ジョブテンプレートインベントリーが見つからないか、または定義されていません。" -#: api/serializers.py:2397 +#: awx/api/serializers.py:2421 #, python-format msgid "%(job_type)s is not a valid job type. The choices are %(choices)s." msgstr "%(job_type)s は有効なジョブタイプではありません。%(choices)s を選択できます。" -#: api/serializers.py:2402 +#: awx/api/serializers.py:2426 msgid "Workflow job template is missing during creation." msgstr "ワークフロージョブテンプレートが作成時に見つかりません。" -#: api/serializers.py:2407 +#: awx/api/serializers.py:2431 #, python-format msgid "Cannot nest a %s inside a WorkflowJobTemplate" msgstr "ワークフロージョブテンプレート内に %s をネストできません" -#: api/serializers.py:2645 +#: awx/api/serializers.py:2669 #, python-format msgid "Job Template '%s' is missing or undefined." msgstr "ジョブテンプレート「%s」が見つからない、または定義されていません。" -#: api/serializers.py:2671 +#: awx/api/serializers.py:2695 msgid "Must be a valid JSON or YAML dictionary." msgstr "有効な JSON または YAML 辞書でなければなりません。" -#: api/serializers.py:2813 +#: awx/api/serializers.py:2837 msgid "" "Missing required fields for Notification Configuration: notification_type" msgstr "通知設定の必須フィールドがありません: notification_type" -#: api/serializers.py:2836 +#: awx/api/serializers.py:2860 msgid "No values specified for field '{}'" msgstr "フィールド '{}' に値が指定されていません" -#: api/serializers.py:2841 +#: awx/api/serializers.py:2865 msgid "Missing required fields for Notification Configuration: {}." msgstr "通知設定の必須フィールドがありません: {}。" -#: api/serializers.py:2844 +#: awx/api/serializers.py:2868 msgid "Configuration field '{}' incorrect type, expected {}." msgstr "設定フィールド '{}' のタイプが正しくありません。{} が予期されました。" -#: api/serializers.py:2897 +#: awx/api/serializers.py:2921 msgid "Inventory Source must be a cloud resource." msgstr "インベントリーソースはクラウドリソースでなければなりません。" -#: api/serializers.py:2899 +#: awx/api/serializers.py:2923 msgid "Manual Project can not have a schedule set." msgstr "手動プロジェクトにはスケジュールを設定できません。" -#: api/serializers.py:2921 +#: awx/api/serializers.py:2945 msgid "" "DTSTART required in rrule. Value should match: DTSTART:YYYYMMDDTHHMMSSZ" msgstr "DTSTART が rrule で必要です。値は、DSTART:YYYYMMDDTHHMMSSZ に一致する必要があります。" -#: api/serializers.py:2923 +#: awx/api/serializers.py:2947 msgid "Multiple DTSTART is not supported." msgstr "複数の DTSTART はサポートされません。" -#: api/serializers.py:2925 +#: awx/api/serializers.py:2949 msgid "RRULE require in rrule." msgstr "RRULE が rrule で必要です。" -#: api/serializers.py:2927 +#: awx/api/serializers.py:2951 msgid "Multiple RRULE is not supported." msgstr "複数の RRULE はサポートされません。" -#: api/serializers.py:2929 +#: awx/api/serializers.py:2953 msgid "INTERVAL required in rrule." msgstr "INTERVAL が rrule で必要です。" -#: api/serializers.py:2931 +#: awx/api/serializers.py:2955 msgid "TZID is not supported." msgstr "TZID はサポートされません。" -#: api/serializers.py:2933 +#: awx/api/serializers.py:2957 msgid "SECONDLY is not supported." msgstr "SECONDLY はサポートされません。" -#: api/serializers.py:2935 +#: awx/api/serializers.py:2959 msgid "Multiple BYMONTHDAYs not supported." msgstr "複数の BYMONTHDAY はサポートされません。" -#: api/serializers.py:2937 +#: awx/api/serializers.py:2961 msgid "Multiple BYMONTHs not supported." msgstr "複数の BYMONTH はサポートされません。" -#: api/serializers.py:2939 +#: awx/api/serializers.py:2963 msgid "BYDAY with numeric prefix not supported." msgstr "数字の接頭辞のある BYDAY はサポートされません。" -#: api/serializers.py:2941 +#: awx/api/serializers.py:2965 msgid "BYYEARDAY not supported." msgstr "BYYEARDAY はサポートされません。" -#: api/serializers.py:2943 +#: awx/api/serializers.py:2967 msgid "BYWEEKNO not supported." msgstr "BYWEEKNO はサポートされません。" -#: api/serializers.py:2947 +#: awx/api/serializers.py:2971 msgid "COUNT > 999 is unsupported." msgstr "COUNT > 999 はサポートされません。" -#: api/serializers.py:2951 +#: awx/api/serializers.py:2975 msgid "rrule parsing failed validation." msgstr "rrule の構文解析で検証に失敗しました。" -#: api/serializers.py:2969 +#: awx/api/serializers.py:2997 msgid "" "A summary of the new and changed values when an object is created, updated, " "or deleted" msgstr "オブジェクトの作成、更新または削除時の新規値および変更された値の概要" -#: api/serializers.py:2971 +#: awx/api/serializers.py:2999 msgid "" "For create, update, and delete events this is the object type that was " "affected. For associate and disassociate events this is the object type " @@ -390,674 +409,756 @@ msgstr "" "作成、更新、および削除イベントの場合、これは影響を受けたオブジェクトタイプになります。関連付けおよび関連付け解除イベントの場合、これは object2 " "に関連付けられたか、またはその関連付けが解除されたオブジェクトタイプになります。" -#: api/serializers.py:2974 +#: awx/api/serializers.py:3002 msgid "" "Unpopulated for create, update, and delete events. For associate and " -"disassociate events this is the object type that object1 is being associated" -" with." +"disassociate events this is the object type that object1 is being associated " +"with." msgstr "" "作成、更新、および削除イベントの場合は設定されません。関連付けおよび関連付け解除イベントの場合、これは object1 " "が関連付けられるオブジェクトタイプになります。" -#: api/serializers.py:2977 +#: awx/api/serializers.py:3005 msgid "The action taken with respect to the given object(s)." msgstr "指定されたオブジェクトについて実行されたアクション。" -#: api/serializers.py:3077 +#: awx/api/serializers.py:3112 msgid "Unable to login with provided credentials." msgstr "提供される認証情報でログインできません。" -#: api/serializers.py:3079 +#: awx/api/serializers.py:3114 msgid "Must include \"username\" and \"password\"." msgstr "「username」および「password」を含める必要があります。" -#: api/views.py:99 +#: awx/api/views.py:99 msgid "Your license does not allow use of the activity stream." msgstr "お使いのライセンスではアクティビティーストリームを使用できません。" -#: api/views.py:109 +#: awx/api/views.py:109 msgid "Your license does not permit use of system tracking." msgstr "お使いのライセンスではシステムトラッキングを使用できません。" -#: api/views.py:119 +#: awx/api/views.py:119 msgid "Your license does not allow use of workflows." msgstr "お使いのライセンスではワークフローを使用できません。" -#: api/views.py:127 templates/rest_framework/api.html:28 +#: awx/api/views.py:127 +#: awx/templates/rest_framework/api.html:28 msgid "REST API" msgstr "REST API" -#: api/views.py:134 templates/rest_framework/api.html:4 +#: awx/api/views.py:134 +#: awx/templates/rest_framework/api.html:4 msgid "Ansible Tower REST API" msgstr "Ansible Tower REST API" -#: api/views.py:150 +#: awx/api/views.py:150 msgid "Version 1" msgstr "バージョン 1" -#: api/views.py:201 +#: awx/api/views.py:201 msgid "Ping" msgstr "Ping" -#: api/views.py:230 conf/apps.py:12 +#: awx/api/views.py:230 +#: awx/conf/apps.py:12 msgid "Configuration" msgstr "設定" -#: api/views.py:283 +#: awx/api/views.py:283 msgid "Invalid license data" msgstr "無効なライセンスデータ" -#: api/views.py:285 +#: awx/api/views.py:285 msgid "Missing 'eula_accepted' property" msgstr "'eula_accepted' プロパティーがありません" -#: api/views.py:289 +#: awx/api/views.py:289 msgid "'eula_accepted' value is invalid" msgstr "'eula_accepted' 値は無効です。" -#: api/views.py:292 +#: awx/api/views.py:292 msgid "'eula_accepted' must be True" msgstr "'eula_accepted' は True でなければなりません" -#: api/views.py:299 +#: awx/api/views.py:299 msgid "Invalid JSON" msgstr "無効な JSON" -#: api/views.py:307 +#: awx/api/views.py:307 msgid "Invalid License" msgstr "無効なライセンス" -#: api/views.py:317 +#: awx/api/views.py:317 msgid "Invalid license" msgstr "無効なライセンス" -#: api/views.py:325 +#: awx/api/views.py:325 #, python-format msgid "Failed to remove license (%s)" msgstr "ライセンスの削除に失敗しました (%s)" -#: api/views.py:330 +#: awx/api/views.py:330 msgid "Dashboard" msgstr "ダッシュボード" -#: api/views.py:436 +#: awx/api/views.py:436 msgid "Dashboard Jobs Graphs" msgstr "ダッシュボードのジョブグラフ" -#: api/views.py:472 +#: awx/api/views.py:472 #, python-format msgid "Unknown period \"%s\"" msgstr "不明な期間 \"%s\"" -#: api/views.py:486 +#: awx/api/views.py:486 msgid "Schedules" msgstr "スケジュール" -#: api/views.py:505 +#: awx/api/views.py:505 msgid "Schedule Jobs List" msgstr "スケジュールジョブの一覧" -#: api/views.py:715 +#: awx/api/views.py:715 msgid "Your Tower license only permits a single organization to exist." msgstr "お使いの Tower ライセンスでは、単一組織のみの存在が許可されます。" -#: api/views.py:940 api/views.py:1299 +#: awx/api/views.py:940 +#: awx/api/views.py:1299 msgid "Role 'id' field is missing." msgstr "ロール「id」フィールドがありません。" -#: api/views.py:946 api/views.py:4081 +#: awx/api/views.py:946 +#: awx/api/views.py:4093 msgid "You cannot assign an Organization role as a child role for a Team." msgstr "組織ロールをチームの子ロールとして割り当てることができません。" -#: api/views.py:950 api/views.py:4095 +#: awx/api/views.py:950 +#: awx/api/views.py:4107 msgid "You cannot grant system-level permissions to a team." msgstr "システムレベルのパーミッションをチームに付与できません。" -#: api/views.py:957 api/views.py:4087 +#: awx/api/views.py:957 +#: awx/api/views.py:4099 msgid "" "You cannot grant credential access to a team when the Organization field " "isn't set, or belongs to a different organization" msgstr "組織フィールドが設定されていないか、または別の組織に属する場合に認証情報のアクセス権をチームに付与できません" -#: api/views.py:1047 +#: awx/api/views.py:1047 msgid "Cannot delete project." msgstr "プロジェクトを削除できません。" -#: api/views.py:1076 +#: awx/api/views.py:1076 msgid "Project Schedules" msgstr "プロジェクトのスケジュール" -#: api/views.py:1180 api/views.py:2270 api/views.py:3276 +#: awx/api/views.py:1180 +#: awx/api/views.py:2271 +#: awx/api/views.py:3284 msgid "Cannot delete job resource when associated workflow job is running." msgstr "関連付けられたワークフロージョブが実行中の場合、ジョブリソースを削除できません。" -#: api/views.py:1257 +#: awx/api/views.py:1257 msgid "Me" msgstr "自分" -#: api/views.py:1303 api/views.py:4036 +#: awx/api/views.py:1303 +#: awx/api/views.py:4048 msgid "You may not perform any action with your own admin_role." msgstr "独自の admin_role でアクションを実行することはできません。" -#: api/views.py:1309 api/views.py:4040 +#: awx/api/views.py:1309 +#: awx/api/views.py:4052 msgid "You may not change the membership of a users admin_role" msgstr "ユーザーの admin_role のメンバーシップを変更することはできません" -#: api/views.py:1314 api/views.py:4045 +#: awx/api/views.py:1314 +#: awx/api/views.py:4057 msgid "" "You cannot grant credential access to a user not in the credentials' " "organization" msgstr "認証情報の組織に属さないユーザーに認証情報のアクセス権を付与することはできません" -#: api/views.py:1318 api/views.py:4049 +#: awx/api/views.py:1318 +#: awx/api/views.py:4061 msgid "You cannot grant private credential access to another user" msgstr "非公開の認証情報のアクセス権を別のユーザーに付与することはできません" -#: api/views.py:1416 +#: awx/api/views.py:1416 #, python-format msgid "Cannot change %s." msgstr "%s を変更できません。" -#: api/views.py:1422 +#: awx/api/views.py:1422 msgid "Cannot delete user." msgstr "ユーザーを削除できません。" -#: api/views.py:1570 +#: awx/api/views.py:1570 msgid "Cannot delete inventory script." msgstr "インベントリースクリプトを削除できません。" -#: api/views.py:1805 +#: awx/api/views.py:1806 msgid "Fact not found." msgstr "ファクトが見つかりませんでした。" -#: api/views.py:2125 +#: awx/api/views.py:2126 msgid "Inventory Source List" msgstr "インベントリーソース一覧" -#: api/views.py:2153 +#: awx/api/views.py:2154 msgid "Cannot delete inventory source." msgstr "インベントリーソースを削除できません。" -#: api/views.py:2161 +#: awx/api/views.py:2162 msgid "Inventory Source Schedules" msgstr "インベントリーソースのスケジュール" -#: api/views.py:2191 +#: awx/api/views.py:2192 msgid "Notification Templates can only be assigned when source is one of {}." msgstr "ソースが {} のいずれかである場合、通知テンプレートのみを割り当てることができます。" -#: api/views.py:2402 +#: awx/api/views.py:2403 msgid "Job Template Schedules" msgstr "ジョブテンプレートスケジュール" -#: api/views.py:2422 api/views.py:2438 +#: awx/api/views.py:2423 +#: awx/api/views.py:2439 msgid "Your license does not allow adding surveys." msgstr "お使いのライセンスでは Survey を追加できません。" -#: api/views.py:2445 +#: awx/api/views.py:2446 msgid "'name' missing from survey spec." msgstr "Survey の指定に「name」がありません。" -#: api/views.py:2447 +#: awx/api/views.py:2448 msgid "'description' missing from survey spec." msgstr "Survey の指定に「description」がありません。" -#: api/views.py:2449 +#: awx/api/views.py:2450 msgid "'spec' missing from survey spec." msgstr "Survey の指定に「spec」がありません。" -#: api/views.py:2451 +#: awx/api/views.py:2452 msgid "'spec' must be a list of items." msgstr "「spec」は項目の一覧にする必要があります。" -#: api/views.py:2453 +#: awx/api/views.py:2454 msgid "'spec' doesn't contain any items." msgstr "「spec」には項目が含まれません。" -#: api/views.py:2459 +#: awx/api/views.py:2460 #, python-format msgid "Survey question %s is not a json object." msgstr "Survey の質問 %s は json オブジェクトではありません。" -#: api/views.py:2461 +#: awx/api/views.py:2462 #, python-format msgid "'type' missing from survey question %s." msgstr "Survey の質問 %s に「type」がありません。" -#: api/views.py:2463 +#: awx/api/views.py:2464 #, python-format msgid "'question_name' missing from survey question %s." msgstr "Survey の質問 %s に「question_name」がありません。" -#: api/views.py:2465 +#: awx/api/views.py:2466 #, python-format msgid "'variable' missing from survey question %s." msgstr "Survey の質問 %s に「variable」がありません。" -#: api/views.py:2467 +#: awx/api/views.py:2468 #, python-format msgid "'variable' '%(item)s' duplicated in survey question %(survey)s." msgstr "Survey の質問%(survey)s で「variable」の「%(item)s」が重複しています。" -#: api/views.py:2472 +#: awx/api/views.py:2473 #, python-format msgid "'required' missing from survey question %s." msgstr "Survey の質問 %s に「required」がありません。" -#: api/views.py:2683 +#: awx/api/views.py:2684 msgid "No matching host could be found!" msgstr "一致するホストが見つかりませんでした!" -#: api/views.py:2686 +#: awx/api/views.py:2687 msgid "Multiple hosts matched the request!" msgstr "複数のホストが要求に一致しました!" -#: api/views.py:2691 +#: awx/api/views.py:2692 msgid "Cannot start automatically, user input required!" msgstr "自動的に開始できません。ユーザー入力が必要です!" -#: api/views.py:2698 +#: awx/api/views.py:2699 msgid "Host callback job already pending." msgstr "ホストのコールバックジョブがすでに保留中です。" -#: api/views.py:2711 +#: awx/api/views.py:2712 msgid "Error starting job!" msgstr "ジョブの開始時にエラーが発生しました!" -#: api/views.py:3040 +#: awx/api/views.py:3041 msgid "Workflow Job Template Schedules" msgstr "ワークフロージョブテンプレートのスケジュール" -#: api/views.py:3175 api/views.py:3714 +#: awx/api/views.py:3183 +#: awx/api/views.py:3726 msgid "Superuser privileges needed." msgstr "スーパーユーザー権限が必要です。" -#: api/views.py:3207 +#: awx/api/views.py:3215 msgid "System Job Template Schedules" msgstr "システムジョブテンプレートのスケジュール" -#: api/views.py:3399 +#: awx/api/views.py:3407 msgid "Job Host Summaries List" msgstr "ジョブホスト概要一覧" -#: api/views.py:3441 +#: awx/api/views.py:3449 msgid "Job Event Children List" msgstr "ジョブイベント子一覧" -#: api/views.py:3450 +#: awx/api/views.py:3458 msgid "Job Event Hosts List" msgstr "ジョブイベントホスト一覧" -#: api/views.py:3459 +#: awx/api/views.py:3467 msgid "Job Events List" msgstr "ジョブイベント一覧" -#: api/views.py:3668 +#: awx/api/views.py:3680 msgid "Ad Hoc Command Events List" msgstr "アドホックコマンドイベント一覧" -#: api/views.py:3862 +#: awx/api/views.py:3874 #, python-format msgid "Error generating stdout download file: %s" msgstr "stdout ダウンロードファイルの生成中にエラーが発生しました: %s" -#: api/views.py:3907 +#: awx/api/views.py:3919 msgid "Delete not allowed while there are pending notifications" msgstr "保留中の通知がある場合に削除は許可されません" -#: api/views.py:3914 +#: awx/api/views.py:3926 msgid "Notification Template Test" -msgstr "" +msgstr "通知テンプレートテスト" -#: api/views.py:4030 +#: awx/api/views.py:4042 msgid "User 'id' field is missing." msgstr "ユーザー「id」フィールドがありません。" -#: api/views.py:4073 +#: awx/api/views.py:4085 msgid "Team 'id' field is missing." msgstr "チーム「id」フィールドがありません。" -#: conf/conf.py:20 +#: awx/conf/conf.py:20 msgid "Bud Frogs" msgstr "Bud Frogs" -#: conf/conf.py:21 +#: awx/conf/conf.py:21 msgid "Bunny" msgstr "Bunny" -#: conf/conf.py:22 +#: awx/conf/conf.py:22 msgid "Cheese" msgstr "Cheese" -#: conf/conf.py:23 +#: awx/conf/conf.py:23 msgid "Daemon" msgstr "Daemon" -#: conf/conf.py:24 +#: awx/conf/conf.py:24 msgid "Default Cow" msgstr "Default Cow" -#: conf/conf.py:25 +#: awx/conf/conf.py:25 msgid "Dragon" msgstr "Dragon" -#: conf/conf.py:26 +#: awx/conf/conf.py:26 msgid "Elephant in Snake" msgstr "Elephant in Snake" -#: conf/conf.py:27 +#: awx/conf/conf.py:27 msgid "Elephant" msgstr "Elephant" -#: conf/conf.py:28 +#: awx/conf/conf.py:28 msgid "Eyes" msgstr "Eyes" -#: conf/conf.py:29 +#: awx/conf/conf.py:29 msgid "Hello Kitty" msgstr "Hello Kitty" -#: conf/conf.py:30 +#: awx/conf/conf.py:30 msgid "Kitty" msgstr "Kitty" -#: conf/conf.py:31 +#: awx/conf/conf.py:31 msgid "Luke Koala" msgstr "Luke Koala" -#: conf/conf.py:32 +#: awx/conf/conf.py:32 msgid "Meow" msgstr "Meow" -#: conf/conf.py:33 +#: awx/conf/conf.py:33 msgid "Milk" msgstr "Milk" -#: conf/conf.py:34 +#: awx/conf/conf.py:34 msgid "Moofasa" msgstr "Moofasa" -#: conf/conf.py:35 +#: awx/conf/conf.py:35 msgid "Moose" msgstr "Moose" -#: conf/conf.py:36 +#: awx/conf/conf.py:36 msgid "Ren" msgstr "Ren" -#: conf/conf.py:37 +#: awx/conf/conf.py:37 msgid "Sheep" msgstr "Sheep" -#: conf/conf.py:38 +#: awx/conf/conf.py:38 msgid "Small Cow" msgstr "Small Cow" -#: conf/conf.py:39 +#: awx/conf/conf.py:39 msgid "Stegosaurus" msgstr "Stegosaurus" -#: conf/conf.py:40 +#: awx/conf/conf.py:40 msgid "Stimpy" msgstr "Stimpy" -#: conf/conf.py:41 +#: awx/conf/conf.py:41 msgid "Super Milker" msgstr "Super Milker" -#: conf/conf.py:42 +#: awx/conf/conf.py:42 msgid "Three Eyes" msgstr "Three Eyes" -#: conf/conf.py:43 +#: awx/conf/conf.py:43 msgid "Turkey" msgstr "Turkey" -#: conf/conf.py:44 +#: awx/conf/conf.py:44 msgid "Turtle" msgstr "Turtle" -#: conf/conf.py:45 +#: awx/conf/conf.py:45 msgid "Tux" msgstr "Tux" -#: conf/conf.py:46 +#: awx/conf/conf.py:46 msgid "Udder" msgstr "Udder" -#: conf/conf.py:47 +#: awx/conf/conf.py:47 msgid "Vader Koala" msgstr "Vader Koala" -#: conf/conf.py:48 +#: awx/conf/conf.py:48 msgid "Vader" msgstr "Vader" -#: conf/conf.py:49 +#: awx/conf/conf.py:49 msgid "WWW" msgstr "WWW" -#: conf/conf.py:52 +#: awx/conf/conf.py:52 msgid "Cow Selection" msgstr "Cow Selection" -#: conf/conf.py:53 +#: awx/conf/conf.py:53 msgid "Select which cow to use with cowsay when running jobs." msgstr "ジョブの実行時に cowsay で使用する cow を選択します。" -#: conf/conf.py:54 conf/conf.py:75 +#: awx/conf/conf.py:54 +#: awx/conf/conf.py:75 msgid "Cows" msgstr "Cows" -#: conf/conf.py:73 +#: awx/conf/conf.py:73 msgid "Example Read-Only Setting" msgstr "読み取り専用設定の例" -#: conf/conf.py:74 +#: awx/conf/conf.py:74 msgid "Example setting that cannot be changed." msgstr "変更不可能な設定例" -#: conf/conf.py:93 +#: awx/conf/conf.py:93 msgid "Example Setting" msgstr "設定例" -#: conf/conf.py:94 +#: awx/conf/conf.py:94 msgid "Example setting which can be different for each user." msgstr "ユーザーごとに異なる設定例" -#: conf/conf.py:95 conf/registry.py:67 conf/views.py:46 +#: awx/conf/conf.py:95 +#: awx/conf/registry.py:76 +#: awx/conf/views.py:46 msgid "User" msgstr "ユーザー" -#: conf/fields.py:38 +#: awx/conf/fields.py:38 msgid "Enter a valid URL" msgstr "無効な URL の入力" -#: conf/license.py:19 +#: awx/conf/license.py:19 msgid "Your Tower license does not allow that." msgstr "お使いの Tower ライセンスではこれを許可しません。" -#: conf/management/commands/migrate_to_database_settings.py:41 +#: awx/conf/management/commands/migrate_to_database_settings.py:41 msgid "Only show which settings would be commented/migrated." msgstr "コメント/移行する設定についてのみ表示します。" -#: conf/management/commands/migrate_to_database_settings.py:48 +#: awx/conf/management/commands/migrate_to_database_settings.py:48 msgid "" "Skip over settings that would raise an error when commenting/migrating." msgstr "コメント/移行時にエラーを発生させる設定をスキップします。" -#: conf/management/commands/migrate_to_database_settings.py:55 +#: awx/conf/management/commands/migrate_to_database_settings.py:55 msgid "Skip commenting out settings in files." msgstr "ファイル内の設定のコメント化をスキップします。" -#: conf/management/commands/migrate_to_database_settings.py:61 +#: awx/conf/management/commands/migrate_to_database_settings.py:61 msgid "Backup existing settings files with this suffix." msgstr "この接尾辞を持つ既存の設定ファイルをバックアップします。" -#: conf/registry.py:55 +#: awx/conf/registry.py:64 +#: awx/conf/tests/unit/test_registry.py:169 +#: awx/conf/tests/unit/test_registry.py:192 +#: awx/conf/tests/unit/test_registry.py:196 +#: awx/conf/tests/unit/test_registry.py:201 +#: awx/conf/tests/unit/test_registry.py:208 msgid "All" msgstr "すべて" -#: conf/registry.py:56 +#: awx/conf/registry.py:65 +#: awx/conf/tests/unit/test_registry.py:170 +#: awx/conf/tests/unit/test_registry.py:193 +#: awx/conf/tests/unit/test_registry.py:197 +#: awx/conf/tests/unit/test_registry.py:202 +#: awx/conf/tests/unit/test_registry.py:209 msgid "Changed" msgstr "変更済み" -#: conf/registry.py:68 +#: awx/conf/registry.py:77 msgid "User-Defaults" msgstr "ユーザー設定" -#: conf/views.py:38 +#: awx/conf/tests/unit/test_registry.py:46 +#: awx/conf/tests/unit/test_registry.py:56 +#: awx/conf/tests/unit/test_registry.py:72 +#: awx/conf/tests/unit/test_registry.py:87 +#: awx/conf/tests/unit/test_registry.py:100 +#: awx/conf/tests/unit/test_registry.py:106 +#: awx/conf/tests/unit/test_registry.py:126 +#: awx/conf/tests/unit/test_registry.py:140 +#: awx/conf/tests/unit/test_registry.py:146 +#: awx/conf/tests/unit/test_registry.py:159 +#: awx/conf/tests/unit/test_registry.py:171 +#: awx/conf/tests/unit/test_registry.py:180 +#: awx/conf/tests/unit/test_registry.py:198 +#: awx/conf/tests/unit/test_registry.py:210 +#: awx/conf/tests/unit/test_registry.py:219 +#: awx/conf/tests/unit/test_registry.py:225 +#: awx/conf/tests/unit/test_registry.py:237 +#: awx/conf/tests/unit/test_registry.py:245 +#: awx/conf/tests/unit/test_registry.py:288 +#: awx/conf/tests/unit/test_registry.py:306 +#: awx/conf/tests/unit/test_settings.py:67 +#: awx/conf/tests/unit/test_settings.py:81 +#: awx/conf/tests/unit/test_settings.py:97 +#: awx/conf/tests/unit/test_settings.py:110 +#: awx/conf/tests/unit/test_settings.py:127 +#: awx/conf/tests/unit/test_settings.py:143 +#: awx/conf/tests/unit/test_settings.py:162 +#: awx/conf/tests/unit/test_settings.py:183 +#: awx/conf/tests/unit/test_settings.py:197 +#: awx/conf/tests/unit/test_settings.py:221 +#: awx/conf/tests/unit/test_settings.py:241 +#: awx/conf/tests/unit/test_settings.py:258 +#: awx/main/conf.py:19 +#: awx/main/conf.py:29 +#: awx/main/conf.py:39 +#: awx/main/conf.py:48 +#: awx/main/conf.py:60 +#: awx/main/conf.py:78 +#: awx/main/conf.py:103 +msgid "System" +msgstr "システム" + +#: awx/conf/tests/unit/test_registry.py:165 +#: awx/conf/tests/unit/test_registry.py:172 +#: awx/conf/tests/unit/test_registry.py:187 +#: awx/conf/tests/unit/test_registry.py:203 +#: awx/conf/tests/unit/test_registry.py:211 +msgid "OtherSystem" +msgstr "他のシステム" + +#: awx/conf/views.py:38 msgid "Setting Categories" msgstr "設定カテゴリー" -#: conf/views.py:61 +#: awx/conf/views.py:61 msgid "Setting Detail" msgstr "設定の詳細" -#: main/access.py:255 +#: awx/main/access.py:255 #, python-format msgid "Bad data found in related field %s." msgstr "関連フィールド %s に不正データが見つかりました。" -#: main/access.py:296 +#: awx/main/access.py:296 msgid "License is missing." msgstr "ライセンスが見つかりません。" -#: main/access.py:298 +#: awx/main/access.py:298 msgid "License has expired." msgstr "ライセンスの有効期限が切れました。" -#: main/access.py:303 +#: awx/main/access.py:306 #, python-format msgid "License count of %s instances has been reached." msgstr "%s インスタンスのライセンス数に達しました。" -#: main/access.py:305 +#: awx/main/access.py:308 #, python-format msgid "License count of %s instances has been exceeded." msgstr "%s インスタンスのライセンス数を超えました。" -#: main/access.py:307 +#: awx/main/access.py:310 msgid "Host count exceeds available instances." msgstr "ホスト数が利用可能なインスタンスの上限を上回っています。" -#: main/access.py:311 +#: awx/main/access.py:314 #, python-format msgid "Feature %s is not enabled in the active license." msgstr "機能 %s はアクティブなライセンスで有効にされていません。" -#: main/access.py:313 +#: awx/main/access.py:316 msgid "Features not found in active license." msgstr "各種機能はアクティブなライセンスにありません。" -#: main/access.py:511 main/access.py:578 main/access.py:698 main/access.py:961 -#: main/access.py:1200 main/access.py:1597 +#: awx/main/access.py:514 +#: awx/main/access.py:581 +#: awx/main/access.py:706 +#: awx/main/access.py:969 +#: awx/main/access.py:1208 +#: awx/main/access.py:1605 msgid "Resource is being used by running jobs" msgstr "リソースが実行中のジョブで使用されています" -#: main/access.py:622 +#: awx/main/access.py:625 msgid "Unable to change inventory on a host." msgstr "ホストのインベントリーを変更できません。" -#: main/access.py:634 main/access.py:679 +#: awx/main/access.py:642 +#: awx/main/access.py:687 msgid "Cannot associate two items from different inventories." msgstr "異なるインベントリーの 2 つの項目を関連付けることはできません。" -#: main/access.py:667 +#: awx/main/access.py:675 msgid "Unable to change inventory on a group." msgstr "グループのインベントリーを変更できません。" -#: main/access.py:881 +#: awx/main/access.py:889 msgid "Unable to change organization on a team." msgstr "チームの組織を変更できません。" -#: main/access.py:894 +#: awx/main/access.py:902 msgid "The {} role cannot be assigned to a team" msgstr "{} ロールをチームに割り当てることができません" -#: main/access.py:896 +#: awx/main/access.py:904 msgid "The admin_role for a User cannot be assigned to a team" msgstr "ユーザーの admin_role をチームに割り当てることができません" -#: main/access.py:1670 +#: awx/main/access.py:1678 msgid "" "You do not have permission to the workflow job resources required for " "relaunch." -msgstr "" +msgstr "再起動に必要なワークフロージョブリソースへのパーミッションがありません。" -#: main/apps.py:9 +#: awx/main/apps.py:9 msgid "Main" msgstr "メイン" -#: main/conf.py:17 +#: awx/main/conf.py:17 msgid "Enable Activity Stream" msgstr "アクティビティーストリームの有効化" -#: main/conf.py:18 +#: awx/main/conf.py:18 msgid "Enable capturing activity for the Tower activity stream." msgstr "Tower アクティビティーストリームのアクティビティーのキャプチャーを有効にします。" -#: main/conf.py:19 main/conf.py:29 main/conf.py:39 main/conf.py:48 -#: main/conf.py:60 main/conf.py:78 main/conf.py:103 -msgid "System" -msgstr "システム" - -#: main/conf.py:27 +#: awx/main/conf.py:27 msgid "Enable Activity Stream for Inventory Sync" msgstr "インベントリー同期のアクティビティティーストリームの有効化" -#: main/conf.py:28 +#: awx/main/conf.py:28 msgid "" "Enable capturing activity for the Tower activity stream when running " "inventory sync." msgstr "インベントリー同期の実行時に Tower アクティビティーストリームのアクティビティーのキャプチャーを有効にします。" -#: main/conf.py:37 +#: awx/main/conf.py:37 msgid "All Users Visible to Organization Admins" msgstr "組織管理者に表示されるすべてのユーザー" -#: main/conf.py:38 +#: awx/main/conf.py:38 msgid "" "Controls whether any Organization Admin can view all users, even those not " "associated with their Organization." msgstr "組織管理者が、それぞれの組織に関連付けられていないすべてのユーザーを閲覧できるかどうかを制御します。" -#: main/conf.py:46 +#: awx/main/conf.py:46 msgid "Enable Tower Administrator Alerts" msgstr "Tower 管理者アラートの有効化" -#: main/conf.py:47 +#: awx/main/conf.py:47 msgid "" "Allow Tower to email Admin users for system events that may require " "attention." msgstr "Tower から管理者ユーザーに対し、注意を要する可能性のあるシステムイベントについてのメールを送信することを許可します。" -#: main/conf.py:57 +#: awx/main/conf.py:57 msgid "Base URL of the Tower host" msgstr "Tower ホストのベース URL" -#: main/conf.py:58 +#: awx/main/conf.py:58 msgid "" -"This setting is used by services like notifications to render a valid url to" -" the Tower host." +"This setting is used by services like notifications to render a valid url to " +"the Tower host." msgstr "この設定は、有効な URL を Tower ホストにレンダリングする通知などのサービスで使用されます。" -#: main/conf.py:67 +#: awx/main/conf.py:67 msgid "Remote Host Headers" msgstr "リモートホストヘッダー" -#: main/conf.py:68 +#: awx/main/conf.py:68 msgid "" -"HTTP headers and meta keys to search to determine remote host name or IP. Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if behind a reverse proxy.\n" +"HTTP headers and meta keys to search to determine remote host name or IP. " +"Add additional items to this list, such as \"HTTP_X_FORWARDED_FOR\", if " +"behind a reverse proxy.\n" "\n" -"Note: The headers will be searched in order and the first found remote host name or IP will be used.\n" +"Note: The headers will be searched in order and the first found remote host " +"name or IP will be used.\n" "\n" "In the below example 8.8.8.7 would be the chosen IP address.\n" "X-Forwarded-For: 8.8.8.7, 192.168.2.1, 127.0.0.1\n" "Host: 127.0.0.1\n" "REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']" msgstr "" -"リモートホスト名または IP を判別するために検索する HTTP ヘッダーおよびメタキーです。リバースプロキシーの後ろの場合は、\"HTTP_X_FORWARDED_FOR\" のように項目をこの一覧に追加します。\n" +"リモートホスト名または IP を判別するために検索する HTTP " +"ヘッダーおよびメタキーです。リバースプロキシーの後ろの場合は、\"HTTP_X_FORWARDED_FOR\" のように項目をこの一覧に追加します。\n" "\n" "注: ヘッダーが順番に検索され、最初に検出されるリモートホスト名または IP が使用されます。\n" "\n" @@ -1066,11 +1167,11 @@ msgstr "" "Host: 127.0.0.1\n" "REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']" -#: main/conf.py:99 +#: awx/main/conf.py:99 msgid "Tower License" msgstr "Tower ライセンス" -#: main/conf.py:100 +#: awx/main/conf.py:100 msgid "" "The license controls which features and functionality are enabled in Tower. " "Use /api/v1/config/ to update or change the license." @@ -1078,72 +1179,81 @@ msgstr "" "ライセンスによって、Tower で有効にされる特長および機能が制御されます。ライセンスを更新または変更するには、/api/v1/config/ " "を使用します。" -#: main/conf.py:110 +#: awx/main/conf.py:110 msgid "Ansible Modules Allowed for Ad Hoc Jobs" msgstr "アドホックジョブで許可される Ansible モジュール" -#: main/conf.py:111 +#: awx/main/conf.py:111 msgid "List of modules allowed to be used by ad-hoc jobs." msgstr "アドホックジョブで使用できるモジュール一覧。" -#: main/conf.py:112 main/conf.py:121 main/conf.py:130 main/conf.py:140 -#: main/conf.py:150 main/conf.py:160 main/conf.py:170 main/conf.py:180 -#: main/conf.py:190 main/conf.py:202 main/conf.py:214 main/conf.py:226 +#: awx/main/conf.py:112 +#: awx/main/conf.py:121 +#: awx/main/conf.py:130 +#: awx/main/conf.py:140 +#: awx/main/conf.py:150 +#: awx/main/conf.py:160 +#: awx/main/conf.py:170 +#: awx/main/conf.py:180 +#: awx/main/conf.py:190 +#: awx/main/conf.py:202 +#: awx/main/conf.py:214 +#: awx/main/conf.py:226 msgid "Jobs" msgstr "ジョブ" -#: main/conf.py:119 +#: awx/main/conf.py:119 msgid "Enable job isolation" msgstr "ジョブの分離の有効化" -#: main/conf.py:120 +#: awx/main/conf.py:120 msgid "" "Isolates an Ansible job from protected parts of the Tower system to prevent " "exposing sensitive information." msgstr "機密情報の公開を防ぐために Tower システムの保護された部分から Ansible ジョブを分離します。" -#: main/conf.py:128 +#: awx/main/conf.py:128 msgid "Job isolation execution path" msgstr "ジョブ分離の実行パス" -#: main/conf.py:129 +#: awx/main/conf.py:129 msgid "" "Create temporary working directories for isolated jobs in this location." msgstr "この場所に分離されたジョブの一時作業ディレクトリーを作成します。" -#: main/conf.py:138 +#: awx/main/conf.py:138 msgid "Paths to hide from isolated jobs" msgstr "分離されたジョブから非表示にするパス" -#: main/conf.py:139 +#: awx/main/conf.py:139 msgid "Additional paths to hide from isolated processes." msgstr "分離されたプロセスから非表示にする追加パス。" -#: main/conf.py:148 +#: awx/main/conf.py:148 msgid "Paths to expose to isolated jobs" msgstr "分離されたジョブに公開するパス" -#: main/conf.py:149 +#: awx/main/conf.py:149 msgid "" -"Whitelist of paths that would otherwise be hidden to expose to isolated " -"jobs." +"Whitelist of paths that would otherwise be hidden to expose to isolated jobs." +"" msgstr "分離されたジョブに公開されないように非表示にされることがあるパスのホワイトリスト。" -#: main/conf.py:158 +#: awx/main/conf.py:158 msgid "Standard Output Maximum Display Size" msgstr "標準出力の最大表示サイズ" -#: main/conf.py:159 +#: awx/main/conf.py:159 msgid "" "Maximum Size of Standard Output in bytes to display before requiring the " "output be downloaded." msgstr "出力のダウンロードを要求する前に表示される標準出力の最大サイズ (バイト単位)。" -#: main/conf.py:168 +#: awx/main/conf.py:168 msgid "Job Event Standard Output Maximum Display Size" msgstr "ジョブイベントの標準出力の最大表示サイズ" -#: main/conf.py:169 +#: awx/main/conf.py:169 msgid "" "Maximum Size of Standard Output in bytes to display for a single job or ad " "hoc command event. `stdout` will end with `…` when truncated." @@ -1151,31 +1261,31 @@ msgstr "" "単一ジョブまたはアドホックコマンドイベントについて表示される標準出力の最大サイズ (バイト単位)。`stdout` は切り捨てが実行されると `…` " "で終了します。" -#: main/conf.py:178 +#: awx/main/conf.py:178 msgid "Maximum Scheduled Jobs" msgstr "スケジュール済みジョブの最大数" -#: main/conf.py:179 +#: awx/main/conf.py:179 msgid "" "Maximum number of the same job template that can be waiting to run when " "launching from a schedule before no more are created." msgstr "スケジュールからの起動時に実行を待機している同じジョブテンプレートの最大数です (これ以上作成されることはありません)。" -#: main/conf.py:188 +#: awx/main/conf.py:188 msgid "Ansible Callback Plugins" msgstr "Ansible コールバックプラグイン" -#: main/conf.py:189 +#: awx/main/conf.py:189 msgid "" "List of paths to search for extra callback plugins to be used when running " "jobs." msgstr "ジョブの実行時に使用される追加のコールバックプラグインについて検索するパスの一覧。" -#: main/conf.py:199 +#: awx/main/conf.py:199 msgid "Default Job Timeout" msgstr "デフォルトのジョブタイムアウト" -#: main/conf.py:200 +#: awx/main/conf.py:200 msgid "" "Maximum time to allow jobs to run. Use value of 0 to indicate that no " "timeout should be imposed. A timeout set on an individual job template will " @@ -1184,11 +1294,11 @@ msgstr "" "ジョブの実行可能な最大時間。値 0 " "が使用されている場合はタイムアウトを設定できないことを示します。個別のジョブテンプレートに設定されるタイムアウトはこれを上書きします。" -#: main/conf.py:211 +#: awx/main/conf.py:211 msgid "Default Inventory Update Timeout" msgstr "デフォルトのインベントリー更新タイムアウト" -#: main/conf.py:212 +#: awx/main/conf.py:212 msgid "" "Maximum time to allow inventory updates to run. Use value of 0 to indicate " "that no timeout should be imposed. A timeout set on an individual inventory " @@ -1197,11 +1307,11 @@ msgstr "" "インベントリー更新の実行可能な最大時間。値 0 " "が設定されている場合はタイムアウトを設定できないことを示します。個別のインベントリーソースに設定されるタイムアウトはこれを上書きします。" -#: main/conf.py:223 +#: awx/main/conf.py:223 msgid "Default Project Update Timeout" msgstr "デフォルトのプロジェクト更新タイムアウト" -#: main/conf.py:224 +#: awx/main/conf.py:224 msgid "" "Maximum time to allow project updates to run. Use value of 0 to indicate " "that no timeout should be imposed. A timeout set on an individual project " @@ -1210,1512 +1320,1645 @@ msgstr "" "プロジェクト更新の実行可能な最大時間。値 0 " "が設定されている場合はタイムアウトを設定できないことを示します。個別のプロジェクトに設定されるタイムアウトはこれを上書きします。" -#: main/conf.py:234 +#: awx/main/conf.py:234 msgid "Logging Aggregator" -msgstr "" +msgstr "ログアグリゲーター" -#: main/conf.py:235 +#: awx/main/conf.py:235 msgid "Hostname/IP where external logs will be sent to." -msgstr "" +msgstr "外部ログの送信先のホスト名/IP" -#: main/conf.py:236 main/conf.py:245 main/conf.py:255 main/conf.py:264 -#: main/conf.py:274 main/conf.py:288 main/conf.py:300 main/conf.py:309 +#: awx/main/conf.py:236 +#: awx/main/conf.py:245 +#: awx/main/conf.py:255 +#: awx/main/conf.py:264 +#: awx/main/conf.py:274 +#: awx/main/conf.py:288 +#: awx/main/conf.py:300 +#: awx/main/conf.py:309 msgid "Logging" msgstr "ロギング" -#: main/conf.py:243 +#: awx/main/conf.py:243 msgid "Logging Aggregator Port" -msgstr "" +msgstr "ログアグリゲーターポート" -#: main/conf.py:244 +#: awx/main/conf.py:244 msgid "Port on Logging Aggregator to send logs to (if required)." -msgstr "" +msgstr "ログの送信先のログアグリゲーターのポート (必要な場合)。" -#: main/conf.py:253 +#: awx/main/conf.py:253 msgid "Logging Aggregator Type" -msgstr "" +msgstr "ログアグリゲーターのタイプ" -#: main/conf.py:254 +#: awx/main/conf.py:254 msgid "Format messages for the chosen log aggregator." -msgstr "" +msgstr "選択されたログアグリゲーターのメッセージのフォーマット。" -#: main/conf.py:262 +#: awx/main/conf.py:262 msgid "Logging Aggregator Username" -msgstr "" +msgstr "ログアグリゲーターのユーザー名" -#: main/conf.py:263 +#: awx/main/conf.py:263 msgid "Username for external log aggregator (if required)." -msgstr "" +msgstr "外部ログアグリゲーターのユーザー名 (必要な場合)。" -#: main/conf.py:272 +#: awx/main/conf.py:272 msgid "Logging Aggregator Password/Token" -msgstr "" +msgstr "ログアグリゲーターのパスワード/トークン" -#: main/conf.py:273 +#: awx/main/conf.py:273 msgid "" "Password or authentication token for external log aggregator (if required)." -msgstr "" +msgstr "外部ログアグリゲーターのパスワードまたは認証トークン (必要な場合)。" -#: main/conf.py:281 +#: awx/main/conf.py:281 msgid "Loggers to send data to the log aggregator from" msgstr "ログアグリゲーターにデータを送信するロガー" -#: main/conf.py:282 +#: awx/main/conf.py:282 msgid "" -"List of loggers that will send HTTP logs to the collector, these can include any or all of: \n" +"List of loggers that will send HTTP logs to the collector, these can include " +"any or all of: \n" "awx - Tower service logs\n" "activity_stream - activity stream records\n" "job_events - callback data from Ansible job events\n" "system_tracking - facts gathered from scan jobs." msgstr "" +"HTTP ログをコレクターに送信するロガーの一覧です。これらには以下のいずれか、またはすべてが含まれます。\n" +"awx - Tower サービスログ\n" +"activity_stream - アクティビティーストリームレコード\n" +"job_events - Ansible ジョブイベントからのコールバックデータ\n" +"system_tracking - スキャンジョブから生成されるファクト" -#: main/conf.py:295 +#: awx/main/conf.py:295 msgid "Log System Tracking Facts Individually" -msgstr "" +msgstr "ログシステムトラッキングの個別ファクト" -#: main/conf.py:296 +#: awx/main/conf.py:296 msgid "" "If set, system tracking facts will be sent for each package, service, " -"orother item found in a scan, allowing for greater search query granularity." -" If unset, facts will be sent as a single dictionary, allowing for greater " +"orother item found in a scan, allowing for greater search query granularity. " +"If unset, facts will be sent as a single dictionary, allowing for greater " "efficiency in fact processing." msgstr "" +"設定されている場合、スキャンで見つかる各パッケージ、サービスその他の項目についてのサービスシステムトラッキングのファクトが送信され、検索クエリーの詳細度が上がります。設定されていない場合、ファクトは単一辞書として送信され、ファクトの処理の効率が上がります。" -#: main/conf.py:307 +#: awx/main/conf.py:307 msgid "Enable External Logging" -msgstr "" +msgstr "外部ログの有効化" -#: main/conf.py:308 +#: awx/main/conf.py:308 msgid "Enable sending logs to external log aggregator." -msgstr "" +msgstr "外部ログアグリゲーターへのログ送信の有効化" -#: main/models/activity_stream.py:22 +#: awx/main/models/activity_stream.py:22 msgid "Entity Created" msgstr "エンティティーの作成" -#: main/models/activity_stream.py:23 +#: awx/main/models/activity_stream.py:23 msgid "Entity Updated" msgstr "エンティティーの更新" -#: main/models/activity_stream.py:24 +#: awx/main/models/activity_stream.py:24 msgid "Entity Deleted" msgstr "エンティティーの削除" -#: main/models/activity_stream.py:25 +#: awx/main/models/activity_stream.py:25 msgid "Entity Associated with another Entity" msgstr "エンティティーの別のエンティティーへの関連付け" -#: main/models/activity_stream.py:26 +#: awx/main/models/activity_stream.py:26 msgid "Entity was Disassociated with another Entity" msgstr "エンティティーの別のエンティティーとの関連付けの解除" -#: main/models/ad_hoc_commands.py:96 +#: awx/main/models/ad_hoc_commands.py:96 msgid "No valid inventory." msgstr "有効なインベントリーはありません。" -#: main/models/ad_hoc_commands.py:103 main/models/jobs.py:161 +#: awx/main/models/ad_hoc_commands.py:103 +#: awx/main/models/jobs.py:161 msgid "You must provide a machine / SSH credential." msgstr "マシン/SSH 認証情報を入力してください。" -#: main/models/ad_hoc_commands.py:114 main/models/ad_hoc_commands.py:122 +#: awx/main/models/ad_hoc_commands.py:114 +#: awx/main/models/ad_hoc_commands.py:122 msgid "Invalid type for ad hoc command" msgstr "アドホックコマンドの無効なタイプ" -#: main/models/ad_hoc_commands.py:117 +#: awx/main/models/ad_hoc_commands.py:117 msgid "Unsupported module for ad hoc commands." msgstr "アドホックコマンドのサポートされていないモジュール。" -#: main/models/ad_hoc_commands.py:125 +#: awx/main/models/ad_hoc_commands.py:125 #, python-format msgid "No argument passed to %s module." msgstr "%s モジュールに渡される引数はありません。" -#: main/models/ad_hoc_commands.py:222 main/models/jobs.py:763 +#: awx/main/models/ad_hoc_commands.py:222 +#: awx/main/models/jobs.py:763 msgid "Host Failed" msgstr "ホストの失敗" -#: main/models/ad_hoc_commands.py:223 main/models/jobs.py:764 +#: awx/main/models/ad_hoc_commands.py:223 +#: awx/main/models/jobs.py:764 msgid "Host OK" msgstr "ホスト OK" -#: main/models/ad_hoc_commands.py:224 main/models/jobs.py:767 +#: awx/main/models/ad_hoc_commands.py:224 +#: awx/main/models/jobs.py:767 msgid "Host Unreachable" msgstr "ホストに到達できません" -#: main/models/ad_hoc_commands.py:229 main/models/jobs.py:766 +#: awx/main/models/ad_hoc_commands.py:229 +#: awx/main/models/jobs.py:766 msgid "Host Skipped" msgstr "ホストがスキップされました" -#: main/models/ad_hoc_commands.py:239 main/models/jobs.py:794 +#: awx/main/models/ad_hoc_commands.py:239 +#: awx/main/models/jobs.py:794 msgid "Debug" msgstr "デバッグ" -#: main/models/ad_hoc_commands.py:240 main/models/jobs.py:795 +#: awx/main/models/ad_hoc_commands.py:240 +#: awx/main/models/jobs.py:795 msgid "Verbose" msgstr "詳細" -#: main/models/ad_hoc_commands.py:241 main/models/jobs.py:796 +#: awx/main/models/ad_hoc_commands.py:241 +#: awx/main/models/jobs.py:796 msgid "Deprecated" msgstr "非推奨" -#: main/models/ad_hoc_commands.py:242 main/models/jobs.py:797 +#: awx/main/models/ad_hoc_commands.py:242 +#: awx/main/models/jobs.py:797 msgid "Warning" msgstr "警告" -#: main/models/ad_hoc_commands.py:243 main/models/jobs.py:798 +#: awx/main/models/ad_hoc_commands.py:243 +#: awx/main/models/jobs.py:798 msgid "System Warning" msgstr "システム警告" -#: main/models/ad_hoc_commands.py:244 main/models/jobs.py:799 -#: main/models/unified_jobs.py:64 +#: awx/main/models/ad_hoc_commands.py:244 +#: awx/main/models/jobs.py:799 +#: awx/main/models/unified_jobs.py:64 msgid "Error" msgstr "エラー" -#: main/models/base.py:45 main/models/base.py:51 main/models/base.py:56 +#: awx/main/models/base.py:45 +#: awx/main/models/base.py:51 +#: awx/main/models/base.py:56 msgid "Run" msgstr "実行" -#: main/models/base.py:46 main/models/base.py:52 main/models/base.py:57 +#: awx/main/models/base.py:46 +#: awx/main/models/base.py:52 +#: awx/main/models/base.py:57 msgid "Check" msgstr "チェック" -#: main/models/base.py:47 +#: awx/main/models/base.py:47 msgid "Scan" msgstr "スキャン" -#: main/models/base.py:61 +#: awx/main/models/base.py:61 msgid "Read Inventory" msgstr "インベントリーの読み取り" -#: main/models/base.py:62 +#: awx/main/models/base.py:62 msgid "Edit Inventory" msgstr "インベントリーの編集" -#: main/models/base.py:63 +#: awx/main/models/base.py:63 msgid "Administrate Inventory" msgstr "インベントリーの管理" -#: main/models/base.py:64 +#: awx/main/models/base.py:64 msgid "Deploy To Inventory" msgstr "インベントリーへのデプロイ" -#: main/models/base.py:65 +#: awx/main/models/base.py:65 msgid "Deploy To Inventory (Dry Run)" msgstr "インベントリーへのデプロイ (ドライラン)" -#: main/models/base.py:66 +#: awx/main/models/base.py:66 msgid "Scan an Inventory" msgstr "インベントリーのスキャン" -#: main/models/base.py:67 +#: awx/main/models/base.py:67 msgid "Create a Job Template" msgstr "ジョブテンプレートの作成" -#: main/models/credential.py:33 +#: awx/main/models/credential.py:33 msgid "Machine" msgstr "マシン" -#: main/models/credential.py:34 +#: awx/main/models/credential.py:34 msgid "Network" msgstr "ネットワーク" -#: main/models/credential.py:35 +#: awx/main/models/credential.py:35 msgid "Source Control" msgstr "ソースコントロール" -#: main/models/credential.py:36 +#: awx/main/models/credential.py:36 msgid "Amazon Web Services" msgstr "Amazon Web サービス" -#: main/models/credential.py:37 +#: awx/main/models/credential.py:37 msgid "Rackspace" msgstr "Rackspace" -#: main/models/credential.py:38 main/models/inventory.py:713 +#: awx/main/models/credential.py:38 +#: awx/main/models/inventory.py:713 msgid "VMware vCenter" msgstr "VMware vCenter" -#: main/models/credential.py:39 main/models/inventory.py:714 +#: awx/main/models/credential.py:39 +#: awx/main/models/inventory.py:714 msgid "Red Hat Satellite 6" msgstr "Red Hat Satellite 6" -#: main/models/credential.py:40 main/models/inventory.py:715 +#: awx/main/models/credential.py:40 +#: awx/main/models/inventory.py:715 msgid "Red Hat CloudForms" msgstr "Red Hat CloudForms" -#: main/models/credential.py:41 main/models/inventory.py:710 +#: awx/main/models/credential.py:41 +#: awx/main/models/inventory.py:710 msgid "Google Compute Engine" msgstr "Google Compute Engine" -#: main/models/credential.py:42 main/models/inventory.py:711 +#: awx/main/models/credential.py:42 +#: awx/main/models/inventory.py:711 msgid "Microsoft Azure Classic (deprecated)" msgstr "Microsoft Azure Classic (非推奨)" -#: main/models/credential.py:43 main/models/inventory.py:712 +#: awx/main/models/credential.py:43 +#: awx/main/models/inventory.py:712 msgid "Microsoft Azure Resource Manager" msgstr "Microsoft Azure Resource Manager" -#: main/models/credential.py:44 main/models/inventory.py:716 +#: awx/main/models/credential.py:44 +#: awx/main/models/inventory.py:716 msgid "OpenStack" msgstr "OpenStack" -#: main/models/credential.py:48 +#: awx/main/models/credential.py:48 msgid "None" msgstr "なし" -#: main/models/credential.py:49 +#: awx/main/models/credential.py:49 msgid "Sudo" msgstr "Sudo" -#: main/models/credential.py:50 +#: awx/main/models/credential.py:50 msgid "Su" msgstr "Su" -#: main/models/credential.py:51 +#: awx/main/models/credential.py:51 msgid "Pbrun" msgstr "Pbrun" -#: main/models/credential.py:52 +#: awx/main/models/credential.py:52 msgid "Pfexec" msgstr "Pfexec" -#: main/models/credential.py:53 +#: awx/main/models/credential.py:53 msgid "DZDO" -msgstr "" +msgstr "DZDO" -#: main/models/credential.py:54 +#: awx/main/models/credential.py:54 msgid "Pmrun" -msgstr "" +msgstr "Pmrun" -#: main/models/credential.py:103 +#: awx/main/models/credential.py:103 msgid "Host" msgstr "ホスト" -#: main/models/credential.py:104 +#: awx/main/models/credential.py:104 msgid "The hostname or IP address to use." msgstr "使用するホスト名または IP アドレス。" -#: main/models/credential.py:110 +#: awx/main/models/credential.py:110 msgid "Username" msgstr "ユーザー名" -#: main/models/credential.py:111 +#: awx/main/models/credential.py:111 msgid "Username for this credential." msgstr "この認証情報のユーザー名。" -#: main/models/credential.py:117 +#: awx/main/models/credential.py:117 msgid "Password" msgstr "パスワード" -#: main/models/credential.py:118 +#: awx/main/models/credential.py:118 msgid "" "Password for this credential (or \"ASK\" to prompt the user for machine " "credentials)." msgstr "この認証情報のパスワード (またはマシンの認証情報を求めるプロンプトを出すには 「ASK」)。" -#: main/models/credential.py:125 +#: awx/main/models/credential.py:125 msgid "Security Token" msgstr "セキュリティートークン" -#: main/models/credential.py:126 +#: awx/main/models/credential.py:126 msgid "Security Token for this credential" msgstr "この認証情報のセキュリティートークン" -#: main/models/credential.py:132 +#: awx/main/models/credential.py:132 msgid "Project" msgstr "プロジェクト" -#: main/models/credential.py:133 +#: awx/main/models/credential.py:133 msgid "The identifier for the project." msgstr "プロジェクトの識別子。" -#: main/models/credential.py:139 +#: awx/main/models/credential.py:139 msgid "Domain" msgstr "ドメイン" -#: main/models/credential.py:140 +#: awx/main/models/credential.py:140 msgid "The identifier for the domain." msgstr "ドメインの識別子。" -#: main/models/credential.py:145 +#: awx/main/models/credential.py:145 msgid "SSH private key" msgstr "SSH 秘密鍵" -#: main/models/credential.py:146 +#: awx/main/models/credential.py:146 msgid "RSA or DSA private key to be used instead of password." msgstr "パスワードの代わりに使用される RSA または DSA 秘密鍵。" -#: main/models/credential.py:152 +#: awx/main/models/credential.py:152 msgid "SSH key unlock" msgstr "SSH キーのロック解除" -#: main/models/credential.py:153 +#: awx/main/models/credential.py:153 msgid "" "Passphrase to unlock SSH private key if encrypted (or \"ASK\" to prompt the " "user for machine credentials)." msgstr "" "暗号化されている場合は SSH 秘密鍵のロックを解除するためのパスフレーズ (またはマシンの認証情報を求めるプロンプトを出すには「ASK」)。" -#: main/models/credential.py:161 +#: awx/main/models/credential.py:161 msgid "Privilege escalation method." msgstr "権限昇格メソッド。" -#: main/models/credential.py:167 +#: awx/main/models/credential.py:167 msgid "Privilege escalation username." msgstr "権限昇格ユーザー名。" -#: main/models/credential.py:173 +#: awx/main/models/credential.py:173 msgid "Password for privilege escalation method." msgstr "権限昇格メソッドのパスワード。" -#: main/models/credential.py:179 +#: awx/main/models/credential.py:179 msgid "Vault password (or \"ASK\" to prompt the user)." msgstr "Vault パスワード (またはユーザーにプロンプトを出すには「ASK」)。" -#: main/models/credential.py:183 +#: awx/main/models/credential.py:183 msgid "Whether to use the authorize mechanism." msgstr "承認メカニズムを使用するかどうか。" -#: main/models/credential.py:189 +#: awx/main/models/credential.py:189 msgid "Password used by the authorize mechanism." msgstr "承認メカニズムで使用されるパスワード。" -#: main/models/credential.py:195 +#: awx/main/models/credential.py:195 msgid "Client Id or Application Id for the credential" msgstr "認証情報のクライアント ID またはアプリケーション ID" -#: main/models/credential.py:201 +#: awx/main/models/credential.py:201 msgid "Secret Token for this credential" msgstr "この認証情報のシークレットトークン" -#: main/models/credential.py:207 +#: awx/main/models/credential.py:207 msgid "Subscription identifier for this credential" msgstr "この認証情報のサブスクリプション識別子" -#: main/models/credential.py:213 +#: awx/main/models/credential.py:213 msgid "Tenant identifier for this credential" msgstr "この認証情報のテナント識別子" -#: main/models/credential.py:283 +#: awx/main/models/credential.py:283 msgid "Host required for VMware credential." msgstr "VMware 認証情報に必要なホスト。" -#: main/models/credential.py:285 +#: awx/main/models/credential.py:285 msgid "Host required for OpenStack credential." msgstr "OpenStack 認証情報に必要なホスト。" -#: main/models/credential.py:294 +#: awx/main/models/credential.py:294 msgid "Access key required for AWS credential." msgstr "AWS 認証情報に必要なアクセスキー。" -#: main/models/credential.py:296 +#: awx/main/models/credential.py:296 msgid "Username required for Rackspace credential." msgstr "Rackspace 認証情報に必要なユーザー名。" -#: main/models/credential.py:299 +#: awx/main/models/credential.py:299 msgid "Username required for VMware credential." msgstr "VMware 認証情報に必要なユーザー名。" -#: main/models/credential.py:301 +#: awx/main/models/credential.py:301 msgid "Username required for OpenStack credential." msgstr "OpenStack 認証情報に必要なユーザー名。" -#: main/models/credential.py:307 +#: awx/main/models/credential.py:307 msgid "Secret key required for AWS credential." msgstr "AWS 認証情報に必要なシークレットキー。" -#: main/models/credential.py:309 +#: awx/main/models/credential.py:309 msgid "API key required for Rackspace credential." msgstr "Rackspace 認証情報に必要な API キー。" -#: main/models/credential.py:311 +#: awx/main/models/credential.py:311 msgid "Password required for VMware credential." msgstr "VMware 認証情報に必要なパスワード。" -#: main/models/credential.py:313 +#: awx/main/models/credential.py:313 msgid "Password or API key required for OpenStack credential." msgstr "OpenStack 認証情報に必要なパスワードまたは API キー。" -#: main/models/credential.py:319 +#: awx/main/models/credential.py:319 msgid "Project name required for OpenStack credential." msgstr "OpenStack 認証情報に必要なプロジェクト名。" -#: main/models/credential.py:346 +#: awx/main/models/credential.py:346 msgid "SSH key unlock must be set when SSH key is encrypted." msgstr "SSH キーの暗号化時に SSH キーのロック解除を設定する必要があります。" -#: main/models/credential.py:352 +#: awx/main/models/credential.py:352 msgid "Credential cannot be assigned to both a user and team." msgstr "認証情報はユーザーとチームの両方に割り当てることができません。" -#: main/models/fact.py:21 +#: awx/main/models/fact.py:21 msgid "Host for the facts that the fact scan captured." msgstr "ファクトスキャンがキャプチャーしたファクトのホスト。" -#: main/models/fact.py:26 +#: awx/main/models/fact.py:26 msgid "Date and time of the corresponding fact scan gathering time." msgstr "対応するファクトスキャン収集時間の日時。" -#: main/models/fact.py:29 +#: awx/main/models/fact.py:29 msgid "" "Arbitrary JSON structure of module facts captured at timestamp for a single " "host." msgstr "単一ホストのタイムスタンプでキャプチャーされるモジュールファクトの任意の JSON 構造。" -#: main/models/inventory.py:45 +#: awx/main/models/inventory.py:45 msgid "inventories" msgstr "インベントリー" -#: main/models/inventory.py:52 +#: awx/main/models/inventory.py:52 msgid "Organization containing this inventory." msgstr "このインベントリーを含む組織。" -#: main/models/inventory.py:58 +#: awx/main/models/inventory.py:58 msgid "Inventory variables in JSON or YAML format." msgstr "JSON または YAML 形式のインベントリー変数。" -#: main/models/inventory.py:63 +#: awx/main/models/inventory.py:63 msgid "Flag indicating whether any hosts in this inventory have failed." msgstr "このインベントリーのホストが失敗したかどうかを示すフラグ。" -#: main/models/inventory.py:68 +#: awx/main/models/inventory.py:68 msgid "Total number of hosts in this inventory." msgstr "このインべントリー内のホストの合計数。" -#: main/models/inventory.py:73 +#: awx/main/models/inventory.py:73 msgid "Number of hosts in this inventory with active failures." msgstr "アクティブなエラーのあるこのインベントリー内のホストの数。" -#: main/models/inventory.py:78 +#: awx/main/models/inventory.py:78 msgid "Total number of groups in this inventory." msgstr "このインべントリー内のグループの合計数。" -#: main/models/inventory.py:83 +#: awx/main/models/inventory.py:83 msgid "Number of groups in this inventory with active failures." msgstr "アクティブなエラーのあるこのインベントリー内のグループの数。" -#: main/models/inventory.py:88 +#: awx/main/models/inventory.py:88 msgid "" "Flag indicating whether this inventory has any external inventory sources." msgstr "このインベントリーに外部のインベントリーソースがあるかどうかを示すフラグ。" -#: main/models/inventory.py:93 +#: awx/main/models/inventory.py:93 msgid "" "Total number of external inventory sources configured within this inventory." msgstr "このインベントリー内で設定される外部インベントリーソースの合計数。" -#: main/models/inventory.py:98 +#: awx/main/models/inventory.py:98 msgid "Number of external inventory sources in this inventory with failures." msgstr "エラーのあるこのインベントリー内の外部インベントリーソースの数。" -#: main/models/inventory.py:339 +#: awx/main/models/inventory.py:339 msgid "Is this host online and available for running jobs?" msgstr "このホストはオンラインで、ジョブを実行するために利用できますか?" -#: main/models/inventory.py:345 +#: awx/main/models/inventory.py:345 msgid "" "The value used by the remote inventory source to uniquely identify the host" msgstr "ホストを一意に識別するためにリモートインベントリーソースで使用される値" -#: main/models/inventory.py:350 +#: awx/main/models/inventory.py:350 msgid "Host variables in JSON or YAML format." msgstr "JSON または YAML 形式のホスト変数。" -#: main/models/inventory.py:372 +#: awx/main/models/inventory.py:372 msgid "Flag indicating whether the last job failed for this host." msgstr "このホストの最後のジョブが失敗したかどうかを示すフラグ。" -#: main/models/inventory.py:377 +#: awx/main/models/inventory.py:377 msgid "" "Flag indicating whether this host was created/updated from any external " "inventory sources." msgstr "このホストが外部インベントリーソースから作成/更新されたかどうかを示すフラグ。" -#: main/models/inventory.py:383 +#: awx/main/models/inventory.py:383 msgid "Inventory source(s) that created or modified this host." msgstr "このホストを作成または変更したインベントリーソース。" -#: main/models/inventory.py:474 +#: awx/main/models/inventory.py:474 msgid "Group variables in JSON or YAML format." msgstr "JSON または YAML 形式のグループ変数。" -#: main/models/inventory.py:480 +#: awx/main/models/inventory.py:480 msgid "Hosts associated directly with this group." msgstr "このグループに直接関連付けられたホスト。" -#: main/models/inventory.py:485 +#: awx/main/models/inventory.py:485 msgid "Total number of hosts directly or indirectly in this group." msgstr "このグループに直接的または間接的に属するホストの合計数。" -#: main/models/inventory.py:490 +#: awx/main/models/inventory.py:490 msgid "Flag indicating whether this group has any hosts with active failures." msgstr "このグループにアクティブなエラーのあるホストがあるかどうかを示すフラグ。" -#: main/models/inventory.py:495 +#: awx/main/models/inventory.py:495 msgid "Number of hosts in this group with active failures." msgstr "アクティブなエラーのあるこのグループ内のホストの数。" -#: main/models/inventory.py:500 +#: awx/main/models/inventory.py:500 msgid "Total number of child groups contained within this group." msgstr "このグループに含まれる子グループの合計数。" -#: main/models/inventory.py:505 +#: awx/main/models/inventory.py:505 msgid "Number of child groups within this group that have active failures." msgstr "アクティブなエラーのあるこのグループ内の子グループの数。" -#: main/models/inventory.py:510 +#: awx/main/models/inventory.py:510 msgid "" "Flag indicating whether this group was created/updated from any external " "inventory sources." msgstr "このグループが外部インベントリーソースから作成/更新されたかどうかを示すフラグ。" -#: main/models/inventory.py:516 +#: awx/main/models/inventory.py:516 msgid "Inventory source(s) that created or modified this group." msgstr "このグループを作成または変更したインベントリーソース。" -#: main/models/inventory.py:706 main/models/projects.py:42 -#: main/models/unified_jobs.py:402 +#: awx/main/models/inventory.py:706 +#: awx/main/models/projects.py:42 +#: awx/main/models/unified_jobs.py:402 msgid "Manual" msgstr "手動" -#: main/models/inventory.py:707 +#: awx/main/models/inventory.py:707 msgid "Local File, Directory or Script" msgstr "ローカルファイル、ディレクトリーまたはスクリプト" -#: main/models/inventory.py:708 +#: awx/main/models/inventory.py:708 msgid "Rackspace Cloud Servers" msgstr "Rackspace クラウドサーバー" -#: main/models/inventory.py:709 +#: awx/main/models/inventory.py:709 msgid "Amazon EC2" msgstr "Amazon EC2" -#: main/models/inventory.py:717 +#: awx/main/models/inventory.py:717 msgid "Custom Script" msgstr "カスタムスクリプト" -#: main/models/inventory.py:828 +#: awx/main/models/inventory.py:828 msgid "Inventory source variables in YAML or JSON format." msgstr "YAML または JSON 形式のインベントリーソース変数。" -#: main/models/inventory.py:847 +#: awx/main/models/inventory.py:847 msgid "" "Comma-separated list of filter expressions (EC2 only). Hosts are imported " "when ANY of the filters match." msgstr "カンマ区切りのフィルター式の一覧 (EC2 のみ) です。ホストは、フィルターのいずれかが一致する場合にインポートされます。" -#: main/models/inventory.py:853 +#: awx/main/models/inventory.py:853 msgid "Limit groups automatically created from inventory source (EC2 only)." msgstr "インベントリーソースから自動的に作成されるグループを制限します (EC2 のみ)。" -#: main/models/inventory.py:857 +#: awx/main/models/inventory.py:857 msgid "Overwrite local groups and hosts from remote inventory source." msgstr "リモートインベントリーソースからのローカルグループおよびホストを上書きします。" -#: main/models/inventory.py:861 +#: awx/main/models/inventory.py:861 msgid "Overwrite local variables from remote inventory source." msgstr "リモートインベントリーソースからのローカル変数を上書きします。" -#: main/models/inventory.py:893 +#: awx/main/models/inventory.py:893 msgid "Availability Zone" msgstr "アベイラビリティーゾーン" -#: main/models/inventory.py:894 +#: awx/main/models/inventory.py:894 msgid "Image ID" msgstr "イメージ ID" -#: main/models/inventory.py:895 +#: awx/main/models/inventory.py:895 msgid "Instance ID" msgstr "インスタンス ID" -#: main/models/inventory.py:896 +#: awx/main/models/inventory.py:896 msgid "Instance Type" msgstr "インスタンスタイプ" -#: main/models/inventory.py:897 +#: awx/main/models/inventory.py:897 msgid "Key Name" msgstr "キー名" -#: main/models/inventory.py:898 +#: awx/main/models/inventory.py:898 msgid "Region" msgstr "リージョン" -#: main/models/inventory.py:899 +#: awx/main/models/inventory.py:899 msgid "Security Group" msgstr "セキュリティーグループ" -#: main/models/inventory.py:900 +#: awx/main/models/inventory.py:900 msgid "Tags" msgstr "タグ" -#: main/models/inventory.py:901 +#: awx/main/models/inventory.py:901 msgid "VPC ID" msgstr "VPC ID" -#: main/models/inventory.py:902 +#: awx/main/models/inventory.py:902 msgid "Tag None" msgstr "タグ None" -#: main/models/inventory.py:973 +#: awx/main/models/inventory.py:973 #, python-format msgid "" "Cloud-based inventory sources (such as %s) require credentials for the " "matching cloud service." msgstr "クラウドベースのインベントリーソース (%s など) には一致するクラウドサービスの認証情報が必要です。" -#: main/models/inventory.py:980 +#: awx/main/models/inventory.py:980 msgid "Credential is required for a cloud source." msgstr "認証情報がクラウドソースに必要です。" -#: main/models/inventory.py:1005 +#: awx/main/models/inventory.py:1005 #, python-format msgid "Invalid %(source)s region: %(region)s" -msgstr "" +msgstr "無効な %(source)s リージョン: %(region)s" -#: main/models/inventory.py:1030 +#: awx/main/models/inventory.py:1030 #, python-format msgid "Invalid filter expression: %(filter)s" -msgstr "" +msgstr "無効なフィルター式: %(filter)s" -#: main/models/inventory.py:1048 +#: awx/main/models/inventory.py:1048 #, python-format msgid "Invalid group by choice: %(choice)s" -msgstr "" +msgstr "無効なグループ (選択による): %(choice)s" -#: main/models/inventory.py:1195 +#: awx/main/models/inventory.py:1195 #, python-format msgid "" "Unable to configure this item for cloud sync. It is already managed by %s." msgstr "クラウド同期用にこの項目を設定できません。すでに %s によって管理されています。" -#: main/models/inventory.py:1290 +#: awx/main/models/inventory.py:1290 msgid "Inventory script contents" msgstr "インベントリースクリプトの内容" -#: main/models/inventory.py:1295 +#: awx/main/models/inventory.py:1295 msgid "Organization owning this inventory script" msgstr "このインベントリースクリプトを所有する組織" -#: main/models/jobs.py:169 +#: awx/main/models/jobs.py:169 msgid "You must provide a network credential." msgstr "ネットワーク認証情報を指定する必要があります。" -#: main/models/jobs.py:177 +#: awx/main/models/jobs.py:177 msgid "" "Must provide a credential for a cloud provider, such as Amazon Web Services " "or Rackspace." msgstr "Amazon Web Services または Rackspace などのクラウドプロバイダーの認証情報を指定する必要があります。" -#: main/models/jobs.py:269 +#: awx/main/models/jobs.py:269 msgid "Job Template must provide 'inventory' or allow prompting for it." msgstr "ジョブテンプレートは「inventory」を指定するか、このプロンプトを許可する必要があります。" -#: main/models/jobs.py:273 +#: awx/main/models/jobs.py:273 msgid "Job Template must provide 'credential' or allow prompting for it." msgstr "ジョブテンプレートは「credential」を指定するか、このプロンプトを許可する必要があります。" -#: main/models/jobs.py:362 +#: awx/main/models/jobs.py:362 msgid "Cannot override job_type to or from a scan job." msgstr "スキャンジョブから/への job_type を上書きを実行できません。" -#: main/models/jobs.py:365 +#: awx/main/models/jobs.py:365 msgid "Inventory cannot be changed at runtime for scan jobs." msgstr "インベントリーはスキャンジョブの実行時に変更できません。" -#: main/models/jobs.py:431 main/models/projects.py:243 +#: awx/main/models/jobs.py:431 +#: awx/main/models/projects.py:243 msgid "SCM Revision" msgstr "SCM リビジョン" -#: main/models/jobs.py:432 +#: awx/main/models/jobs.py:432 msgid "The SCM Revision from the Project used for this job, if available" msgstr "このジョブに使用されるプロジェクトからの SCM リビジョン (ある場合)" -#: main/models/jobs.py:440 +#: awx/main/models/jobs.py:440 msgid "" "The SCM Refresh task used to make sure the playbooks were available for the " "job run" msgstr "SCM 更新タスクは、Playbook がジョブの実行で利用可能であったことを確認するために使用されます" -#: main/models/jobs.py:662 +#: awx/main/models/jobs.py:662 msgid "job host summaries" msgstr "ジョブホストの概要" -#: main/models/jobs.py:765 +#: awx/main/models/jobs.py:765 msgid "Host Failure" msgstr "ホストの失敗" -#: main/models/jobs.py:768 main/models/jobs.py:782 +#: awx/main/models/jobs.py:768 +#: awx/main/models/jobs.py:782 msgid "No Hosts Remaining" msgstr "残りのホストがありません" -#: main/models/jobs.py:769 +#: awx/main/models/jobs.py:769 msgid "Host Polling" msgstr "ホストのポーリング" -#: main/models/jobs.py:770 +#: awx/main/models/jobs.py:770 msgid "Host Async OK" msgstr "ホストの非同期 OK" -#: main/models/jobs.py:771 +#: awx/main/models/jobs.py:771 msgid "Host Async Failure" msgstr "ホストの非同期失敗" -#: main/models/jobs.py:772 +#: awx/main/models/jobs.py:772 msgid "Item OK" msgstr "項目 OK" -#: main/models/jobs.py:773 +#: awx/main/models/jobs.py:773 msgid "Item Failed" msgstr "項目の失敗" -#: main/models/jobs.py:774 +#: awx/main/models/jobs.py:774 msgid "Item Skipped" msgstr "項目のスキップ" -#: main/models/jobs.py:775 +#: awx/main/models/jobs.py:775 msgid "Host Retry" msgstr "ホストの再試行" -#: main/models/jobs.py:777 +#: awx/main/models/jobs.py:777 msgid "File Difference" msgstr "ファイルの相違点" -#: main/models/jobs.py:778 +#: awx/main/models/jobs.py:778 msgid "Playbook Started" msgstr "Playbook の開始" -#: main/models/jobs.py:779 +#: awx/main/models/jobs.py:779 msgid "Running Handlers" msgstr "実行中のハンドラー" -#: main/models/jobs.py:780 +#: awx/main/models/jobs.py:780 msgid "Including File" msgstr "組み込みファイル" -#: main/models/jobs.py:781 +#: awx/main/models/jobs.py:781 msgid "No Hosts Matched" msgstr "一致するホストがありません" -#: main/models/jobs.py:783 +#: awx/main/models/jobs.py:783 msgid "Task Started" msgstr "タスクの開始" -#: main/models/jobs.py:785 +#: awx/main/models/jobs.py:785 msgid "Variables Prompted" msgstr "変数のプロモート" -#: main/models/jobs.py:786 +#: awx/main/models/jobs.py:786 msgid "Gathering Facts" msgstr "ファクトの収集" -#: main/models/jobs.py:787 +#: awx/main/models/jobs.py:787 msgid "internal: on Import for Host" msgstr "内部: ホストのインポート時" -#: main/models/jobs.py:788 +#: awx/main/models/jobs.py:788 msgid "internal: on Not Import for Host" msgstr "内部: ホストの非インポート時" -#: main/models/jobs.py:789 +#: awx/main/models/jobs.py:789 msgid "Play Started" msgstr "プレイの開始" -#: main/models/jobs.py:790 +#: awx/main/models/jobs.py:790 msgid "Playbook Complete" msgstr "Playbook の完了" -#: main/models/jobs.py:1200 +#: awx/main/models/jobs.py:1200 msgid "Remove jobs older than a certain number of days" msgstr "特定の日数より前のジョブを削除" -#: main/models/jobs.py:1201 +#: awx/main/models/jobs.py:1201 msgid "Remove activity stream entries older than a certain number of days" msgstr "特定の日数より前のアクティビティーストリームのエントリーを削除" -#: main/models/jobs.py:1202 +#: awx/main/models/jobs.py:1202 msgid "Purge and/or reduce the granularity of system tracking data" msgstr "システムトラッキングデータの詳細度の削除/削減" -#: main/models/label.py:29 +#: awx/main/models/label.py:29 msgid "Organization this label belongs to." msgstr "このラベルが属する組織。" -#: main/models/notifications.py:31 +#: awx/main/models/notifications.py:31 msgid "Email" msgstr "メール" -#: main/models/notifications.py:32 +#: awx/main/models/notifications.py:32 msgid "Slack" msgstr "Slack" -#: main/models/notifications.py:33 +#: awx/main/models/notifications.py:33 msgid "Twilio" msgstr "Twilio" -#: main/models/notifications.py:34 +#: awx/main/models/notifications.py:34 msgid "Pagerduty" msgstr "Pagerduty" -#: main/models/notifications.py:35 +#: awx/main/models/notifications.py:35 msgid "HipChat" msgstr "HipChat" -#: main/models/notifications.py:36 +#: awx/main/models/notifications.py:36 msgid "Webhook" msgstr "Webhook" -#: main/models/notifications.py:37 +#: awx/main/models/notifications.py:37 msgid "IRC" msgstr "IRC" -#: main/models/notifications.py:127 main/models/unified_jobs.py:59 +#: awx/main/models/notifications.py:127 +#: awx/main/models/unified_jobs.py:59 msgid "Pending" msgstr "保留中" -#: main/models/notifications.py:128 main/models/unified_jobs.py:62 +#: awx/main/models/notifications.py:128 +#: awx/main/models/unified_jobs.py:62 msgid "Successful" msgstr "成功" -#: main/models/notifications.py:129 main/models/unified_jobs.py:63 +#: awx/main/models/notifications.py:129 +#: awx/main/models/unified_jobs.py:63 msgid "Failed" msgstr "失敗" -#: main/models/organization.py:157 +#: awx/main/models/organization.py:157 msgid "Execute Commands on the Inventory" msgstr "インベントリーでのコマンドの実行" -#: main/models/organization.py:211 +#: awx/main/models/organization.py:211 msgid "Token not invalidated" msgstr "トークンが無効にされませんでした" -#: main/models/organization.py:212 +#: awx/main/models/organization.py:212 msgid "Token is expired" msgstr "トークンは期限切れです" -#: main/models/organization.py:213 +#: awx/main/models/organization.py:213 msgid "" "The maximum number of allowed sessions for this user has been exceeded." -msgstr "" +msgstr "このユーザーに許可される最大セッション数を超えました。" -#: main/models/organization.py:216 +#: awx/main/models/organization.py:216 msgid "Invalid token" msgstr "無効なトークン" -#: main/models/organization.py:233 +#: awx/main/models/organization.py:233 msgid "Reason the auth token was invalidated." msgstr "認証トークンが無効にされた理由。" -#: main/models/organization.py:272 +#: awx/main/models/organization.py:272 msgid "Invalid reason specified" msgstr "無効な理由が特定されました" -#: main/models/projects.py:43 +#: awx/main/models/projects.py:43 msgid "Git" msgstr "Git" -#: main/models/projects.py:44 +#: awx/main/models/projects.py:44 msgid "Mercurial" msgstr "Mercurial" -#: main/models/projects.py:45 +#: awx/main/models/projects.py:45 msgid "Subversion" msgstr "Subversion" -#: main/models/projects.py:71 +#: awx/main/models/projects.py:71 msgid "" "Local path (relative to PROJECTS_ROOT) containing playbooks and related " "files for this project." msgstr "このプロジェクトの Playbook および関連するファイルを含むローカルパス (PROJECTS_ROOT との相対)。" -#: main/models/projects.py:80 +#: awx/main/models/projects.py:80 msgid "SCM Type" msgstr "SCM タイプ" -#: main/models/projects.py:81 +#: awx/main/models/projects.py:81 msgid "Specifies the source control system used to store the project." msgstr "プロジェクトを保存するために使用されるソースコントロールシステムを指定します。" -#: main/models/projects.py:87 +#: awx/main/models/projects.py:87 msgid "SCM URL" msgstr "SCM URL" -#: main/models/projects.py:88 +#: awx/main/models/projects.py:88 msgid "The location where the project is stored." msgstr "プロジェクトが保存される場所。" -#: main/models/projects.py:94 +#: awx/main/models/projects.py:94 msgid "SCM Branch" msgstr "SCM ブランチ" -#: main/models/projects.py:95 +#: awx/main/models/projects.py:95 msgid "Specific branch, tag or commit to checkout." msgstr "チェックアウトする特定のブランチ、タグまたはコミット。" -#: main/models/projects.py:99 +#: awx/main/models/projects.py:99 msgid "Discard any local changes before syncing the project." msgstr "ローカル変更を破棄してからプロジェクトを同期します。" -#: main/models/projects.py:103 +#: awx/main/models/projects.py:103 msgid "Delete the project before syncing." msgstr "プロジェクトを削除してから同期します。" -#: main/models/projects.py:116 +#: awx/main/models/projects.py:116 msgid "The amount of time to run before the task is canceled." msgstr "タスクが取り消される前の実行時間。" -#: main/models/projects.py:130 +#: awx/main/models/projects.py:130 msgid "Invalid SCM URL." msgstr "無効な SCM URL。" -#: main/models/projects.py:133 +#: awx/main/models/projects.py:133 msgid "SCM URL is required." msgstr "SCM URL が必要です。" -#: main/models/projects.py:142 +#: awx/main/models/projects.py:142 msgid "Credential kind must be 'scm'." msgstr "認証情報の種類は 'scm' にする必要があります。" -#: main/models/projects.py:157 +#: awx/main/models/projects.py:157 msgid "Invalid credential." msgstr "無効な認証情報。" -#: main/models/projects.py:229 +#: awx/main/models/projects.py:229 msgid "Update the project when a job is launched that uses the project." msgstr "プロジェクトを使用するジョブの起動時にプロジェクトを更新します。" -#: main/models/projects.py:234 +#: awx/main/models/projects.py:234 msgid "" "The number of seconds after the last project update ran that a newproject " "update will be launched as a job dependency." msgstr "新規プロジェクトの更新がジョブの依存関係として起動される最終プロジェクト更新後の秒数。" -#: main/models/projects.py:244 +#: awx/main/models/projects.py:244 msgid "The last revision fetched by a project update" msgstr "プロジェクト更新で取得される最新リビジョン" -#: main/models/projects.py:251 +#: awx/main/models/projects.py:251 msgid "Playbook Files" msgstr "Playbook ファイル" -#: main/models/projects.py:252 +#: awx/main/models/projects.py:252 msgid "List of playbooks found in the project" msgstr "プロジェクトにある Playbook の一覧" -#: main/models/rbac.py:122 +#: awx/main/models/rbac.py:36 +msgid "System Administrator" +msgstr "システム管理者" + +#: awx/main/models/rbac.py:37 +msgid "System Auditor" +msgstr "システム監査者" + +#: awx/main/models/rbac.py:38 +msgid "Ad Hoc" +msgstr "アドホック" + +#: awx/main/models/rbac.py:39 +msgid "Admin" +msgstr "管理者" + +#: awx/main/models/rbac.py:40 +msgid "Auditor" +msgstr "監査者" + +#: awx/main/models/rbac.py:41 +msgid "Execute" +msgstr "実行" + +#: awx/main/models/rbac.py:42 +msgid "Member" +msgstr "メンバー" + +#: awx/main/models/rbac.py:43 +msgid "Read" +msgstr "読み込み" + +#: awx/main/models/rbac.py:44 +msgid "Update" +msgstr "更新" + +#: awx/main/models/rbac.py:45 +msgid "Use" +msgstr "使用" + +#: awx/main/models/rbac.py:49 +msgid "Can manage all aspects of the system" +msgstr "システムのすべての側面を管理可能" + +#: awx/main/models/rbac.py:50 +msgid "Can view all settings on the system" +msgstr "システムのすべての設定を表示可能" + +#: awx/main/models/rbac.py:51 +msgid "May run ad hoc commands on an inventory" +msgstr "インベントリーでアドホックコマンドを実行可能" + +#: awx/main/models/rbac.py:52 +#, python-format +msgid "Can manage all aspects of the %s" +msgstr "%s のすべての側面を管理可能" + +#: awx/main/models/rbac.py:53 +#, python-format +msgid "Can view all settings for the %s" +msgstr "%s のすべての設定を表示可能" + +#: awx/main/models/rbac.py:54 +#, python-format +msgid "May run the %s" +msgstr "%s を実行可能" + +#: awx/main/models/rbac.py:55 +#, python-format +msgid "User is a member of the %s" +msgstr "ユーザーは %s のメンバーです" + +#: awx/main/models/rbac.py:56 +#, python-format +msgid "May view settings for the %s" +msgstr "%s の設定を表示可能" + +#: awx/main/models/rbac.py:57 +msgid "" +"May update project or inventory or group using the configured source update " +"system" +msgstr "設定済みのソース更新システムを使用してプロジェクト、インベントリーまたはグループを更新可能" + +#: awx/main/models/rbac.py:58 +#, python-format +msgid "Can use the %s in a job template" +msgstr "ジョブテンプレートで %s を使用可能" + +#: awx/main/models/rbac.py:122 msgid "roles" msgstr "ロール" -#: main/models/rbac.py:438 +#: awx/main/models/rbac.py:438 msgid "role_ancestors" msgstr "role_ancestors" -#: main/models/schedules.py:69 +#: awx/main/models/schedules.py:69 msgid "Enables processing of this schedule by Tower." msgstr "Tower によるこのスケジュールの処理を有効にします。" -#: main/models/schedules.py:75 +#: awx/main/models/schedules.py:75 msgid "The first occurrence of the schedule occurs on or after this time." msgstr "スケジュールの最初のオカレンスはこの時間またはこの時間の後に生じます。" -#: main/models/schedules.py:81 +#: awx/main/models/schedules.py:81 msgid "" "The last occurrence of the schedule occurs before this time, aftewards the " "schedule expires." msgstr "スケジュールの最後のオカレンスはこの時間の前に生じます。その後スケジュールが期限切れになります。" -#: main/models/schedules.py:85 +#: awx/main/models/schedules.py:85 msgid "A value representing the schedules iCal recurrence rule." msgstr "スケジュールの iCal 繰り返しルールを表す値。" -#: main/models/schedules.py:91 +#: awx/main/models/schedules.py:91 msgid "The next time that the scheduled action will run." msgstr "スケジュールされたアクションが次に実行される時間。" -#: main/models/unified_jobs.py:58 +#: awx/main/models/unified_jobs.py:58 msgid "New" msgstr "新規" -#: main/models/unified_jobs.py:60 +#: awx/main/models/unified_jobs.py:60 msgid "Waiting" msgstr "待機中" -#: main/models/unified_jobs.py:61 +#: awx/main/models/unified_jobs.py:61 msgid "Running" msgstr "実行中" -#: main/models/unified_jobs.py:65 +#: awx/main/models/unified_jobs.py:65 msgid "Canceled" msgstr "取り消されました" -#: main/models/unified_jobs.py:69 +#: awx/main/models/unified_jobs.py:69 msgid "Never Updated" msgstr "更新されていません" -#: main/models/unified_jobs.py:73 ui/templates/ui/index.html:85 -#: ui/templates/ui/index.html.py:104 +#: awx/main/models/unified_jobs.py:73 +#: awx/ui/templates/ui/index.html:85 +#: awx/ui/templates/ui/index.html.py:104 msgid "OK" msgstr "OK" -#: main/models/unified_jobs.py:74 +#: awx/main/models/unified_jobs.py:74 msgid "Missing" msgstr "不明" -#: main/models/unified_jobs.py:78 +#: awx/main/models/unified_jobs.py:78 msgid "No External Source" msgstr "外部ソースがありません" -#: main/models/unified_jobs.py:85 +#: awx/main/models/unified_jobs.py:85 msgid "Updating" msgstr "更新中" -#: main/models/unified_jobs.py:403 +#: awx/main/models/unified_jobs.py:403 msgid "Relaunch" msgstr "再起動" -#: main/models/unified_jobs.py:404 +#: awx/main/models/unified_jobs.py:404 msgid "Callback" msgstr "コールバック" -#: main/models/unified_jobs.py:405 +#: awx/main/models/unified_jobs.py:405 msgid "Scheduled" msgstr "スケジュール済み" -#: main/models/unified_jobs.py:406 +#: awx/main/models/unified_jobs.py:406 msgid "Dependency" msgstr "依存関係" -#: main/models/unified_jobs.py:407 +#: awx/main/models/unified_jobs.py:407 msgid "Workflow" msgstr "ワークフロー" -#: main/models/unified_jobs.py:408 +#: awx/main/models/unified_jobs.py:408 msgid "Sync" -msgstr "" +msgstr "同期" -#: main/models/unified_jobs.py:454 +#: awx/main/models/unified_jobs.py:454 msgid "The Tower node the job executed on." msgstr "ジョブが実行される Tower ノード。" -#: main/models/unified_jobs.py:480 +#: awx/main/models/unified_jobs.py:480 msgid "The date and time the job was queued for starting." msgstr "ジョブが開始のために待機した日時。" -#: main/models/unified_jobs.py:486 +#: awx/main/models/unified_jobs.py:486 msgid "The date and time the job finished execution." msgstr "ジョブが実行を完了した日時。" -#: main/models/unified_jobs.py:492 +#: awx/main/models/unified_jobs.py:492 msgid "Elapsed time in seconds that the job ran." msgstr "ジョブ実行の経過時間 (秒単位)" -#: main/models/unified_jobs.py:514 +#: awx/main/models/unified_jobs.py:514 msgid "" -"A status field to indicate the state of the job if it wasn't able to run and" -" capture stdout" +"A status field to indicate the state of the job if it wasn't able to run and " +"capture stdout" msgstr "stdout の実行およびキャプチャーを実行できない場合のジョブの状態を示すための状態フィールド" -#: main/notifications/base.py:17 main/notifications/email_backend.py:28 -msgid "" -"{} #{} had status {} on Ansible Tower, view details at {}\n" +#: awx/main/notifications/base.py:17 +#: awx/main/notifications/email_backend.py:28 +msgid "{} #{} had status {} on Ansible Tower, view details at {}\n" "\n" -msgstr "" -"{} #{} には Ansible Tower のステータス {} があります。詳細については {} で確認してください\n" +msgstr "{} #{} には Ansible Tower のステータス {} があります。詳細については {} で確認してください\n" "\n" -#: main/notifications/hipchat_backend.py:46 +#: awx/main/notifications/hipchat_backend.py:46 msgid "Error sending messages: {}" msgstr "メッセージの送信時のエラー: {}" -#: main/notifications/hipchat_backend.py:48 +#: awx/main/notifications/hipchat_backend.py:48 msgid "Error sending message to hipchat: {}" msgstr "メッセージの hipchat への送信時のエラー: {}" -#: main/notifications/irc_backend.py:54 +#: awx/main/notifications/irc_backend.py:54 msgid "Exception connecting to irc server: {}" msgstr "irc サーバーへの接続時の例外: {}" -#: main/notifications/pagerduty_backend.py:39 +#: awx/main/notifications/pagerduty_backend.py:39 msgid "Exception connecting to PagerDuty: {}" msgstr "PagerDuty への接続時の例外: {}" -#: main/notifications/pagerduty_backend.py:48 -#: main/notifications/slack_backend.py:52 -#: main/notifications/twilio_backend.py:46 +#: awx/main/notifications/pagerduty_backend.py:48 +#: awx/main/notifications/slack_backend.py:52 +#: awx/main/notifications/twilio_backend.py:46 msgid "Exception sending messages: {}" msgstr "メッセージの送信時の例外: {}" -#: main/notifications/twilio_backend.py:36 +#: awx/main/notifications/twilio_backend.py:36 msgid "Exception connecting to Twilio: {}" msgstr "Twilio への接続時の例外: {}" -#: main/notifications/webhook_backend.py:38 -#: main/notifications/webhook_backend.py:40 +#: awx/main/notifications/webhook_backend.py:38 +#: awx/main/notifications/webhook_backend.py:40 msgid "Error sending notification webhook: {}" msgstr "通知 webhook の送信時のエラー: {}" -#: main/scheduler/__init__.py:130 +#: awx/main/scheduler/__init__.py:130 msgid "" "Job spawned from workflow could not start because it was not in the right " "state or required manual credentials" -msgstr "" +msgstr "ワークフローから起動されるジョブは、正常な状態にないか、または手動の認証が必要であるために開始できませんでした" -#: main/tasks.py:180 +#: awx/main/tasks.py:180 msgid "Ansible Tower host usage over 90%" msgstr "Ansible Tower ホストの使用率が 90% を超えました" -#: main/tasks.py:185 +#: awx/main/tasks.py:185 msgid "Ansible Tower license will expire soon" msgstr "Ansible Tower ライセンスがまもなく期限切れになります" -#: main/tasks.py:240 +#: awx/main/tasks.py:240 msgid "status_str must be either succeeded or failed" msgstr "status_str は成功または失敗のいずれかである必要があります" -#: main/utils/common.py:89 +#: awx/main/utils/common.py:89 #, python-format msgid "Unable to convert \"%s\" to boolean" msgstr "\"%s\" をブール値に変換できません" -#: main/utils/common.py:243 +#: awx/main/utils/common.py:243 #, python-format msgid "Unsupported SCM type \"%s\"" msgstr "サポートされない SCM タイプ \"%s\"" -#: main/utils/common.py:250 main/utils/common.py:262 main/utils/common.py:281 +#: awx/main/utils/common.py:250 +#: awx/main/utils/common.py:262 +#: awx/main/utils/common.py:281 #, python-format msgid "Invalid %s URL" msgstr "無効な %s URL" -#: main/utils/common.py:252 main/utils/common.py:290 +#: awx/main/utils/common.py:252 +#: awx/main/utils/common.py:290 #, python-format msgid "Unsupported %s URL" msgstr "サポートされていない %s URL" -#: main/utils/common.py:292 +#: awx/main/utils/common.py:292 #, python-format msgid "Unsupported host \"%s\" for file:// URL" msgstr "ファイル:// URL のサポートされていないホスト \"%s\" " -#: main/utils/common.py:294 +#: awx/main/utils/common.py:294 #, python-format msgid "Host is required for %s URL" msgstr "%s URL にはホストが必要です" -#: main/utils/common.py:312 +#: awx/main/utils/common.py:312 #, python-format msgid "Username must be \"git\" for SSH access to %s." msgstr "%s への SSH アクセスではユーザー名を \"git\" にする必要があります。" -#: main/utils/common.py:318 +#: awx/main/utils/common.py:318 #, python-format msgid "Username must be \"hg\" for SSH access to %s." msgstr "%s への SSH アクセスではユーザー名を \"hg\" にする必要があります。" -#: main/validators.py:60 +#: awx/main/validators.py:60 #, python-format msgid "Invalid certificate or key: %r..." msgstr "無効な証明書またはキー: %r..." -#: main/validators.py:74 +#: awx/main/validators.py:74 #, python-format msgid "Invalid private key: unsupported type \"%s\"" msgstr "無効な秘密鍵: サポートされていないタイプ \"%s\"" -#: main/validators.py:78 +#: awx/main/validators.py:78 #, python-format msgid "Unsupported PEM object type: \"%s\"" msgstr "サポートされていない PEM オブジェクトタイプ: \"%s\"" -#: main/validators.py:103 +#: awx/main/validators.py:103 msgid "Invalid base64-encoded data" msgstr "無効な base64 エンコードされたデータ" -#: main/validators.py:122 +#: awx/main/validators.py:122 msgid "Exactly one private key is required." msgstr "秘密鍵が 1 つのみ必要です。" -#: main/validators.py:124 +#: awx/main/validators.py:124 msgid "At least one private key is required." msgstr "1 つ以上の秘密鍵が必要です。" -#: main/validators.py:126 +#: awx/main/validators.py:126 #, python-format msgid "" -"At least %(min_keys)d private keys are required, only %(key_count)d " -"provided." +"At least %(min_keys)d private keys are required, only %(key_count)d provided." +"" msgstr "%(min_keys)d 以上の秘密鍵が必要です。提供数: %(key_count)d のみ。" -#: main/validators.py:129 +#: awx/main/validators.py:129 #, python-format msgid "Only one private key is allowed, %(key_count)d provided." msgstr "秘密鍵が 1 つのみ許可されます。提供数: %(key_count)d" -#: main/validators.py:131 +#: awx/main/validators.py:131 #, python-format msgid "" "No more than %(max_keys)d private keys are allowed, %(key_count)d provided." msgstr "%(max_keys)d を超える秘密鍵は許可されません。提供数: %(key_count)d " -#: main/validators.py:136 +#: awx/main/validators.py:136 msgid "Exactly one certificate is required." msgstr "証明書が 1 つのみ必要です。" -#: main/validators.py:138 +#: awx/main/validators.py:138 msgid "At least one certificate is required." msgstr "1 つ以上の証明書が必要です。" -#: main/validators.py:140 +#: awx/main/validators.py:140 #, python-format msgid "" "At least %(min_certs)d certificates are required, only %(cert_count)d " "provided." msgstr "%(min_certs)d 以上の証明書が必要です。提供数: %(cert_count)d のみ。" -#: main/validators.py:143 +#: awx/main/validators.py:143 #, python-format msgid "Only one certificate is allowed, %(cert_count)d provided." msgstr "証明書が 1 つのみ許可されます。提供数: %(cert_count)d" -#: main/validators.py:145 +#: awx/main/validators.py:145 #, python-format msgid "" -"No more than %(max_certs)d certificates are allowed, %(cert_count)d " -"provided." +"No more than %(max_certs)d certificates are allowed, %(cert_count)d provided." +"" msgstr "%(max_certs)d を超える証明書は許可されません。提供数: %(cert_count)d" -#: main/views.py:20 +#: awx/main/views.py:20 msgid "API Error" msgstr "API エラー" -#: main/views.py:49 +#: awx/main/views.py:49 msgid "Bad Request" msgstr "不正な要求です" -#: main/views.py:50 +#: awx/main/views.py:50 msgid "The request could not be understood by the server." msgstr "要求がサーバーによって認識されませんでした。" -#: main/views.py:57 +#: awx/main/views.py:57 msgid "Forbidden" msgstr "許可されていません" -#: main/views.py:58 +#: awx/main/views.py:58 msgid "You don't have permission to access the requested resource." msgstr "要求されたリソースにアクセスするためのパーミッションがありません。" -#: main/views.py:65 +#: awx/main/views.py:65 msgid "Not Found" msgstr "見つかりません" -#: main/views.py:66 +#: awx/main/views.py:66 msgid "The requested resource could not be found." msgstr "要求されたリソースは見つかりませんでした。" -#: main/views.py:73 +#: awx/main/views.py:73 msgid "Server Error" msgstr "サーバーエラー" -#: main/views.py:74 +#: awx/main/views.py:74 msgid "A server error has occurred." msgstr "サーバーエラーが発生しました。" -#: settings/defaults.py:611 +#: awx/settings/defaults.py:611 msgid "Chicago" msgstr "シカゴ" -#: settings/defaults.py:612 +#: awx/settings/defaults.py:612 msgid "Dallas/Ft. Worth" msgstr "ダラス/フォートワース" -#: settings/defaults.py:613 +#: awx/settings/defaults.py:613 msgid "Northern Virginia" msgstr "北バージニア" -#: settings/defaults.py:614 +#: awx/settings/defaults.py:614 msgid "London" msgstr "ロンドン" -#: settings/defaults.py:615 +#: awx/settings/defaults.py:615 msgid "Sydney" msgstr "シドニー" -#: settings/defaults.py:616 +#: awx/settings/defaults.py:616 msgid "Hong Kong" msgstr "香港" -#: settings/defaults.py:643 +#: awx/settings/defaults.py:643 msgid "US East (Northern Virginia)" msgstr "米国東部 (バージニア北部)" -#: settings/defaults.py:644 +#: awx/settings/defaults.py:644 msgid "US East (Ohio)" msgstr "米国東部 (オハイオ)" -#: settings/defaults.py:645 +#: awx/settings/defaults.py:645 msgid "US West (Oregon)" msgstr "米国西部 (オレゴン)" -#: settings/defaults.py:646 +#: awx/settings/defaults.py:646 msgid "US West (Northern California)" msgstr "米国西部 (北カリフォルニア)" -#: settings/defaults.py:647 +#: awx/settings/defaults.py:647 msgid "Canada (Central)" -msgstr "" +msgstr "カナダ (中部)" -#: settings/defaults.py:648 +#: awx/settings/defaults.py:648 msgid "EU (Frankfurt)" msgstr "EU (フランクフルト)" -#: settings/defaults.py:649 +#: awx/settings/defaults.py:649 msgid "EU (Ireland)" msgstr "EU (アイルランド)" -#: settings/defaults.py:650 +#: awx/settings/defaults.py:650 msgid "EU (London)" -msgstr "" +msgstr "EU (ロンドン)" -#: settings/defaults.py:651 +#: awx/settings/defaults.py:651 msgid "Asia Pacific (Singapore)" msgstr "アジア太平洋 (シンガポール)" -#: settings/defaults.py:652 +#: awx/settings/defaults.py:652 msgid "Asia Pacific (Sydney)" msgstr "アジア太平洋 (シドニー)" -#: settings/defaults.py:653 +#: awx/settings/defaults.py:653 msgid "Asia Pacific (Tokyo)" msgstr "アジア太平洋 (東京)" -#: settings/defaults.py:654 +#: awx/settings/defaults.py:654 msgid "Asia Pacific (Seoul)" msgstr "アジア太平洋 (ソウル)" -#: settings/defaults.py:655 +#: awx/settings/defaults.py:655 msgid "Asia Pacific (Mumbai)" msgstr "アジア太平洋 (ムンバイ)" -#: settings/defaults.py:656 +#: awx/settings/defaults.py:656 msgid "South America (Sao Paulo)" msgstr "南アメリカ (サンパウロ)" -#: settings/defaults.py:657 +#: awx/settings/defaults.py:657 msgid "US West (GovCloud)" msgstr "米国西部 (GovCloud)" -#: settings/defaults.py:658 +#: awx/settings/defaults.py:658 msgid "China (Beijing)" msgstr "中国 (北京)" -#: settings/defaults.py:707 +#: awx/settings/defaults.py:707 msgid "US East (B)" msgstr "米国東部 (B)" -#: settings/defaults.py:708 +#: awx/settings/defaults.py:708 msgid "US East (C)" msgstr "米国東部 (C)" -#: settings/defaults.py:709 +#: awx/settings/defaults.py:709 msgid "US East (D)" msgstr "米国東部 (D)" -#: settings/defaults.py:710 +#: awx/settings/defaults.py:710 msgid "US Central (A)" msgstr "米国中部 (A)" -#: settings/defaults.py:711 +#: awx/settings/defaults.py:711 msgid "US Central (B)" msgstr "米国中部 (B)" -#: settings/defaults.py:712 +#: awx/settings/defaults.py:712 msgid "US Central (C)" msgstr "米国中部 (C)" -#: settings/defaults.py:713 +#: awx/settings/defaults.py:713 msgid "US Central (F)" msgstr "米国中部 (F)" -#: settings/defaults.py:714 +#: awx/settings/defaults.py:714 msgid "Europe West (B)" msgstr "欧州西部 (B)" -#: settings/defaults.py:715 +#: awx/settings/defaults.py:715 msgid "Europe West (C)" msgstr "欧州西部 (C)" -#: settings/defaults.py:716 +#: awx/settings/defaults.py:716 msgid "Europe West (D)" msgstr "欧州西部 (D)" -#: settings/defaults.py:717 +#: awx/settings/defaults.py:717 msgid "Asia East (A)" msgstr "アジア東部 (A)" -#: settings/defaults.py:718 +#: awx/settings/defaults.py:718 msgid "Asia East (B)" msgstr "アジア東部 (B)" -#: settings/defaults.py:719 +#: awx/settings/defaults.py:719 msgid "Asia East (C)" msgstr "アジア東部 (C)" -#: settings/defaults.py:743 +#: awx/settings/defaults.py:743 msgid "US Central" msgstr "米国中部" -#: settings/defaults.py:744 +#: awx/settings/defaults.py:744 msgid "US East" msgstr "米国東部" -#: settings/defaults.py:745 +#: awx/settings/defaults.py:745 msgid "US East 2" msgstr "米国東部 2" -#: settings/defaults.py:746 +#: awx/settings/defaults.py:746 msgid "US North Central" msgstr "米国中北部" -#: settings/defaults.py:747 +#: awx/settings/defaults.py:747 msgid "US South Central" msgstr "米国中南部" -#: settings/defaults.py:748 +#: awx/settings/defaults.py:748 msgid "US West" msgstr "米国西部" -#: settings/defaults.py:749 +#: awx/settings/defaults.py:749 msgid "Europe North" msgstr "欧州北部" -#: settings/defaults.py:750 +#: awx/settings/defaults.py:750 msgid "Europe West" msgstr "欧州西部" -#: settings/defaults.py:751 +#: awx/settings/defaults.py:751 msgid "Asia Pacific East" msgstr "アジア太平洋東部" -#: settings/defaults.py:752 +#: awx/settings/defaults.py:752 msgid "Asia Pacific Southeast" msgstr "アジア太平洋南東部" -#: settings/defaults.py:753 +#: awx/settings/defaults.py:753 msgid "Japan East" msgstr "日本東部" -#: settings/defaults.py:754 +#: awx/settings/defaults.py:754 msgid "Japan West" msgstr "日本西部" -#: settings/defaults.py:755 +#: awx/settings/defaults.py:755 msgid "Brazil South" msgstr "ブラジル南部" -#: sso/apps.py:9 +#: awx/sso/apps.py:9 msgid "Single Sign-On" msgstr "シングルサインオン" -#: sso/conf.py:27 +#: awx/sso/conf.py:27 msgid "" "Mapping to organization admins/users from social auth accounts. This setting\n" "controls which users are placed into which Tower organizations based on\n" @@ -2735,13 +2978,16 @@ msgid "" " the organization.\n" " If a string or list of strings, specifies the usernames and emails for\n" " users who will be added to the organization. Strings in the format\n" -" \"//\" will be interpreted as JavaScript regular expressions and\n" -" may also be used instead of string literals; only \"i\" and \"m\" are supported\n" +" \"//\" will be interpreted as JavaScript regular " +"expressions and\n" +" may also be used instead of string literals; only \"i\" and \"m\" are " +"supported\n" " for flags.\n" "- remove_admins: True/False. Defaults to True.\n" " If True, a user who does not match will be removed from the organization's\n" " administrative list.\n" -"- users: None, True/False, string or list of strings. Same rules apply as for\n" +"- users: None, True/False, string or list of strings. Same rules apply as " +"for\n" " admins.\n" "- remove_users: True/False. Defaults to True. Same rules as apply for \n" " remove_admins." @@ -2771,7 +3017,7 @@ msgstr "" "- remove_users: True/False。デフォルトで True に設定されます。remove_admins の\n" " 場合と同じルールが適用されます。" -#: sso/conf.py:76 +#: awx/sso/conf.py:76 msgid "" "Mapping of team members (users) from social auth accounts. Keys are team\n" "names (will be created if not present). Values are dictionaries of options\n" @@ -2788,8 +3034,10 @@ msgid "" " members.\n" " If a string or list of strings, specifies expressions used to match users.\n" " User will be added as a team member if the username or email matches.\n" -" Strings in the format \"//\" will be interpreted as JavaScript\n" -" regular expressions and may also be used instead of string literals; only \"i\"\n" +" Strings in the format \"//\" will be interpreted as " +"JavaScript\n" +" regular expressions and may also be used instead of string literals; only " +"\"i\"\n" " and \"m\" are supported for flags.\n" "- remove: True/False. Defaults to True. If True, a user who does not match\n" " the rules above will be removed from the team." @@ -2815,131 +3063,141 @@ msgstr "" "- remove: True/False。デフォルトで True に設定されます。True の場合、上記のルール\n" " に一致しないユーザーはチームから削除されます。" -#: sso/conf.py:119 +#: awx/sso/conf.py:119 msgid "Authentication Backends" msgstr "認証バックエンド" -#: sso/conf.py:120 +#: awx/sso/conf.py:120 msgid "" "List of authentication backends that are enabled based on license features " "and other authentication settings." msgstr "ライセンスの特長およびその他の認証設定に基づいて有効にされる認証バックエンドの一覧。" -#: sso/conf.py:133 +#: awx/sso/conf.py:133 msgid "Social Auth Organization Map" msgstr "ソーシャル認証組織マップ" -#: sso/conf.py:145 +#: awx/sso/conf.py:145 msgid "Social Auth Team Map" msgstr "ソーシャル認証チームマップ" -#: sso/conf.py:157 +#: awx/sso/conf.py:157 msgid "Social Auth User Fields" msgstr "ソーシャル認証ユーザーフィールド" -#: sso/conf.py:158 +#: awx/sso/conf.py:158 msgid "" -"When set to an empty list `[]`, this setting prevents new user accounts from" -" being created. Only users who have previously logged in using social auth " -"or have a user account with a matching email address will be able to login." +"When set to an empty list `[]`, this setting prevents new user accounts from " +"being created. Only users who have previously logged in using social auth or " +"have a user account with a matching email address will be able to login." msgstr "" "空リスト " "`[]`に設定される場合、この設定により新規ユーザーアカウントは作成できなくなります。ソーシャル認証を使ってログインしたことのあるユーザーまたは一致するメールアドレスのユーザーアカウントを持つユーザーのみがログインできます。" -#: sso/conf.py:176 +#: awx/sso/conf.py:176 msgid "LDAP Server URI" msgstr "LDAP サーバー URI" -#: sso/conf.py:177 +#: awx/sso/conf.py:177 msgid "" "URI to connect to LDAP server, such as \"ldap://ldap.example.com:389\" (non-" -"SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be" -" specified by separating with spaces or commas. LDAP authentication is " +"SSL) or \"ldaps://ldap.example.com:636\" (SSL). Multiple LDAP servers may be " +"specified by separating with spaces or commas. LDAP authentication is " "disabled if this parameter is empty." msgstr "" -"\"ldap://ldap.example.com:389\" (非 SSL) または \"ldaps://ldap.example.com:636\"" -" (SSL) などの LDAP サーバーに接続する URI です。複数の LDAP サーバーをスペースまたはカンマで区切って指定できます。LDAP " +"\"ldap://ldap.example.com:389\" (非 SSL) または \"ldaps://ldap.example.com:636\" " +"(SSL) などの LDAP サーバーに接続する URI です。複数の LDAP サーバーをスペースまたはカンマで区切って指定できます。LDAP " "認証は、このパラメーターが空の場合は無効になります。" -#: sso/conf.py:181 sso/conf.py:199 sso/conf.py:211 sso/conf.py:223 -#: sso/conf.py:239 sso/conf.py:258 sso/conf.py:280 sso/conf.py:296 -#: sso/conf.py:315 sso/conf.py:332 sso/conf.py:349 sso/conf.py:365 -#: sso/conf.py:382 sso/conf.py:420 sso/conf.py:461 +#: awx/sso/conf.py:181 +#: awx/sso/conf.py:199 +#: awx/sso/conf.py:211 +#: awx/sso/conf.py:223 +#: awx/sso/conf.py:239 +#: awx/sso/conf.py:258 +#: awx/sso/conf.py:280 +#: awx/sso/conf.py:296 +#: awx/sso/conf.py:315 +#: awx/sso/conf.py:332 +#: awx/sso/conf.py:349 +#: awx/sso/conf.py:365 +#: awx/sso/conf.py:382 +#: awx/sso/conf.py:420 +#: awx/sso/conf.py:461 msgid "LDAP" msgstr "LDAP" -#: sso/conf.py:193 +#: awx/sso/conf.py:193 msgid "LDAP Bind DN" msgstr "LDAP バインド DN" -#: sso/conf.py:194 +#: awx/sso/conf.py:194 msgid "" "DN (Distinguished Name) of user to bind for all search queries. Normally in " "the format \"CN=Some User,OU=Users,DC=example,DC=com\" but may also be " "specified as \"DOMAIN\\username\" for Active Directory. This is the system " "user account we will use to login to query LDAP for other user information." msgstr "" -"すべての検索クエリーについてバインドするユーザーの DN (識別名) です。通常、形式は \"CN=Some " -"User,OU=Users,DC=example,DC=com\" になりますが、Active Directory の場合 " -"\"DOMAIN\\username\" として指定することもできます。これは、他のユーザー情報についての LDAP " -"クエリー実行時のログインに使用するシステムユーザーアカウントです。" +"すべての検索クエリーについてバインドするユーザーの DN (識別名) です。通常、形式は \"CN=Some User,OU=Users,DC=" +"example,DC=com\" になりますが、Active Directory の場合 \"DOMAIN\\username\" " +"として指定することもできます。これは、他のユーザー情報についての LDAP クエリー実行時のログインに使用するシステムユーザーアカウントです。" -#: sso/conf.py:209 +#: awx/sso/conf.py:209 msgid "LDAP Bind Password" msgstr "LDAP バインドパスワード" -#: sso/conf.py:210 +#: awx/sso/conf.py:210 msgid "Password used to bind LDAP user account." msgstr "LDAP ユーザーアカウントをバインドするために使用されるパスワード。" -#: sso/conf.py:221 +#: awx/sso/conf.py:221 msgid "LDAP Start TLS" msgstr "LDAP Start TLS" -#: sso/conf.py:222 +#: awx/sso/conf.py:222 msgid "Whether to enable TLS when the LDAP connection is not using SSL." msgstr "LDAP 接続が SSL を使用していない場合に TLS を有効にするかどうか。" -#: sso/conf.py:232 +#: awx/sso/conf.py:232 msgid "LDAP Connection Options" msgstr "LDAP 接続オプション" -#: sso/conf.py:233 +#: awx/sso/conf.py:233 msgid "" "Additional options to set for the LDAP connection. LDAP referrals are " "disabled by default (to prevent certain LDAP queries from hanging with AD). " -"Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to " -"https://www.python-ldap.org/doc/html/ldap.html#options for possible options " -"and values that can be set." +"Option names should be strings (e.g. \"OPT_REFERRALS\"). Refer to https://" +"www.python-ldap.org/doc/html/ldap.html#options for possible options and " +"values that can be set." msgstr "" "LDAP 設定に設定する追加オプションです。LDAP 照会はデフォルトで無効にされます (特定の LDAP クエリーが AD " "でハングすることを避けるため)。オプション名は文字列でなければなりません (例: " -"\"OPT_REFERRALS\")。可能なオプションおよび設定できる値については、https://www.python-" -"ldap.org/doc/html/ldap.html#options を参照してください。" +"\"OPT_REFERRALS\")。可能なオプションおよび設定できる値については、https://www.python-ldap.org/doc/" +"html/ldap.html#options を参照してください。" -#: sso/conf.py:251 +#: awx/sso/conf.py:251 msgid "LDAP User Search" msgstr "LDAP ユーザー検索" -#: sso/conf.py:252 +#: awx/sso/conf.py:252 msgid "" "LDAP search query to find users. Any user that matches the given pattern " "will be able to login to Tower. The user should also be mapped into an " "Tower organization (as defined in the AUTH_LDAP_ORGANIZATION_MAP setting). " "If multiple search queries need to be supported use of \"LDAPUnion\" is " -"possible. See python-ldap documentation as linked at the top of this " -"section." +"possible. See python-ldap documentation as linked at the top of this section." +"" msgstr "" "ユーザーを検索するための LDAP 検索クエリーです。指定パターンに一致するユーザーは Tower にログインできます。ユーザーは Tower " "組織にマップされている必要もあります (AUTH_LDAP_ORGANIZATION_MAP " "設定で定義)。複数の検索クエリーがサポートされる必要がある場合、\"LDAPUnion\" を使用できます。このセクションの先頭にリンクされている " "python-ldap ドキュメントを参照してください。" -#: sso/conf.py:274 +#: awx/sso/conf.py:274 msgid "LDAP User DN Template" msgstr "LDAP ユーザー DN テンプレート" -#: sso/conf.py:275 +#: awx/sso/conf.py:275 msgid "" "Alternative to user search, if user DNs are all of the same format. This " "approach will be more efficient for user lookups than searching if it is " @@ -2947,55 +3205,55 @@ msgid "" "will be used instead of AUTH_LDAP_USER_SEARCH." msgstr "" "ユーザー DN " -"の形式がすべて同じである場合のユーザー検索の代替法になります。この方法は、組織の環境で使用可能であるかどうかを検索する場合よりも効率的なユーザー検索方法になります。この設定に値がある場合、それが" -" AUTH_LDAP_USER_SEARCH の代わりに使用されます。" +"の形式がすべて同じである場合のユーザー検索の代替法になります。この方法は、組織の環境で使用可能であるかどうかを検索する場合よりも効率的なユーザー検索方法になります。この設定に値がある場合、それが " +"AUTH_LDAP_USER_SEARCH の代わりに使用されます。" -#: sso/conf.py:290 +#: awx/sso/conf.py:290 msgid "LDAP User Attribute Map" msgstr "LDAP ユーザー属性マップ" -#: sso/conf.py:291 +#: awx/sso/conf.py:291 msgid "" "Mapping of LDAP user schema to Tower API user attributes (key is user " -"attribute name, value is LDAP attribute name). The default setting is valid" -" for ActiveDirectory but users with other LDAP configurations may need to " +"attribute name, value is LDAP attribute name). The default setting is valid " +"for ActiveDirectory but users with other LDAP configurations may need to " "change the values (not the keys) of the dictionary/hash-table." msgstr "" "LDAP ユーザースキーマの Tower API ユーザー属性へのマッピングです (キーはユーザー属性名で、値は LDAP " "属性名です)。デフォルト設定は ActiveDirectory で有効ですが、他の LDAP 設定を持つユーザーは、辞書/ハッシュテーブルの値 " "(キーではない) を変更する必要ある場合があります。" -#: sso/conf.py:310 +#: awx/sso/conf.py:310 msgid "LDAP Group Search" msgstr "LDAP グループ検索" -#: sso/conf.py:311 +#: awx/sso/conf.py:311 msgid "" -"Users in Tower are mapped to organizations based on their membership in LDAP" -" groups. This setting defines the LDAP search query to find groups. Note " -"that this, unlike the user search above, does not support LDAPSearchUnion." +"Users in Tower are mapped to organizations based on their membership in LDAP " +"groups. This setting defines the LDAP search query to find groups. Note that " +"this, unlike the user search above, does not support LDAPSearchUnion." msgstr "" "Tower のユーザーは LDAP グループのメンバーシップに基づいて組織にマップされます。この設定は、グループを検索できるように LDAP " "検索クエリーを定義します。上記のユーザー検索とは異なり、これは LDAPSearchUnion をサポートしないことに注意してください。" -#: sso/conf.py:328 +#: awx/sso/conf.py:328 msgid "LDAP Group Type" msgstr "LDAP グループタイプ" -#: sso/conf.py:329 +#: awx/sso/conf.py:329 msgid "" -"The group type may need to be changed based on the type of the LDAP server." -" Values are listed at: http://pythonhosted.org/django-auth-ldap/groups.html" -"#types-of-groups" +"The group type may need to be changed based on the type of the LDAP server. " +"Values are listed at: http://pythonhosted.org/django-auth-ldap/groups." +"html#types-of-groups" msgstr "" -"グループタイプは LDAP サーバーのタイプに基づいて変更する必要がある場合があります。値は以下に記載されています: " -"http://pythonhosted.org/django-auth-ldap/groups.html#types-of-groups" +"グループタイプは LDAP サーバーのタイプに基づいて変更する必要がある場合があります。値は以下に記載されています: http://" +"pythonhosted.org/django-auth-ldap/groups.html#types-of-groups" -#: sso/conf.py:344 +#: awx/sso/conf.py:344 msgid "LDAP Require Group" msgstr "LDAP 要求グループ" -#: sso/conf.py:345 +#: awx/sso/conf.py:345 msgid "" "Group DN required to login. If specified, user must be a member of this " "group to login via LDAP. If not set, everyone in LDAP that matches the user " @@ -3005,11 +3263,11 @@ msgstr "" "経由でログインするにはユーザーはこのグループのメンバーである必要があります。設定されていない場合は、ユーザー検索に一致する LDAP " "のすべてのユーザーが Tower 経由でログインできます。1つの要求グループのみがサポートされます。" -#: sso/conf.py:361 +#: awx/sso/conf.py:361 msgid "LDAP Deny Group" msgstr "LDAP 拒否グループ" -#: sso/conf.py:362 +#: awx/sso/conf.py:362 msgid "" "Group DN denied from login. If specified, user will not be allowed to login " "if a member of this group. Only one deny group is supported." @@ -3017,11 +3275,11 @@ msgstr "" "グループ DN がログインで拒否されます。指定されている場合、ユーザーはこのグループのメンバーの場合にログインできません。1 " "つの拒否グループのみがサポートされます。" -#: sso/conf.py:375 +#: awx/sso/conf.py:375 msgid "LDAP User Flags By Group" msgstr "LDAP ユーザーフラグ (グループ別)" -#: sso/conf.py:376 +#: awx/sso/conf.py:376 msgid "" "User profile flags updated from group membership (key is user attribute " "name, value is group DN). These are boolean fields that are matched based " @@ -3033,25 +3291,38 @@ msgstr "" "DN)。これらは、ユーザーが指定グループのメンバーであるかに基づいて一致するブール値フィールドです。is_superuser " "のみがこのメソッドで設定可能です。このフラグは、現在の LDAP 設定に基づいてログイン時に true および false に設定されます。" -#: sso/conf.py:394 +#: awx/sso/conf.py:394 msgid "LDAP Organization Map" msgstr "LDAP 組織マップ" -#: sso/conf.py:395 +#: awx/sso/conf.py:395 msgid "" -"Mapping between organization admins/users and LDAP groups. This controls what users are placed into what Tower organizations relative to their LDAP group memberships. Keys are organization names. Organizations will be created if not present. Values are dictionaries defining the options for each organization's membership. For each organization it is possible to specify what groups are automatically users of the organization and also what groups can administer the organization.\n" +"Mapping between organization admins/users and LDAP groups. This controls " +"what users are placed into what Tower organizations relative to their LDAP " +"group memberships. Keys are organization names. Organizations will be " +"created if not present. Values are dictionaries defining the options for " +"each organization's membership. For each organization it is possible to " +"specify what groups are automatically users of the organization and also " +"what groups can administer the organization.\n" "\n" " - admins: None, True/False, string or list of strings.\n" " If None, organization admins will not be updated based on LDAP values.\n" -" If True, all users in LDAP will automatically be added as admins of the organization.\n" -" If False, no LDAP users will be automatically added as admins of the organization.\n" -" If a string or list of strings, specifies the group DN(s) that will be added of the organization if they match any of the specified groups.\n" +" If True, all users in LDAP will automatically be added as admins of the " +"organization.\n" +" If False, no LDAP users will be automatically added as admins of the " +"organization.\n" +" If a string or list of strings, specifies the group DN(s) that will be " +"added of the organization if they match any of the specified groups.\n" " - remove_admins: True/False. Defaults to True.\n" -" If True, a user who is not an member of the given groups will be removed from the organization's administrative list.\n" -" - users: None, True/False, string or list of strings. Same rules apply as for admins.\n" -" - remove_users: True/False. Defaults to True. Same rules apply as for remove_admins." +" If True, a user who is not an member of the given groups will be removed " +"from the organization's administrative list.\n" +" - users: None, True/False, string or list of strings. Same rules apply as " +"for admins.\n" +" - remove_users: True/False. Defaults to True. Same rules apply as for " +"remove_admins." msgstr "" -"組織管理者/ユーザーと LDAP グループ間のマッピングです。これは、LDAP グループメンバーシップと相対してどのユーザーをどの Tower 組織に配置するかを制御します。キーは組織名です。組織は存在しない場合に作成されます。値は、各組織のメンバーシップのオプションを定義する辞書です。各組織については、自動的に組織のユーザーにするユーザーと組織を管理できるグループを指定できます。\n" +"組織管理者/ユーザーと LDAP グループ間のマッピングです。これは、LDAP グループメンバーシップと相対してどのユーザーをどの Tower " +"組織に配置するかを制御します。キーは組織名です。組織は存在しない場合に作成されます。値は、各組織のメンバーシップのオプションを定義する辞書です。各組織については、自動的に組織のユーザーにするユーザーと組織を管理できるグループを指定できます。\n" "\n" " - admins: None、True/False、文字列または文字列の一覧。\n" " None の場合、組織管理者は LDAP 値に基づいて更新されません。\n" @@ -3061,24 +3332,33 @@ msgstr "" " - remove_admins: True/False。デフォルトで True に設定されます。\n" " True の場合、指定グループのメンバーでないユーザーは組織の管理者リストから削除されます。\n" " - users: None、True/False、文字列または文字列の一覧。管理者の場合と同じルールが適用されます。\n" -" - remove_users: True/False。デフォルトで True に設定されます。remove_admins の場合と同じルールが適用されます。" +" - remove_users: True/False。デフォルトで True に設定されます。remove_admins " +"の場合と同じルールが適用されます。" -#: sso/conf.py:443 +#: awx/sso/conf.py:443 msgid "LDAP Team Map" msgstr "LDAP チームマップ" -#: sso/conf.py:444 +#: awx/sso/conf.py:444 msgid "" -"Mapping between team members (users) and LDAP groups. Keys are team names (will be created if not present). Values are dictionaries of options for each team's membership, where each can contain the following parameters:\n" +"Mapping between team members (users) and LDAP groups. Keys are team names " +"(will be created if not present). Values are dictionaries of options for " +"each team's membership, where each can contain the following parameters:\n" "\n" -" - organization: string. The name of the organization to which the team belongs. The team will be created if the combination of organization and team name does not exist. The organization will first be created if it does not exist.\n" +" - organization: string. The name of the organization to which the team " +"belongs. The team will be created if the combination of organization and " +"team name does not exist. The organization will first be created if it does " +"not exist.\n" " - users: None, True/False, string or list of strings.\n" " If None, team members will not be updated.\n" " If True/False, all LDAP users will be added/removed as team members.\n" -" If a string or list of strings, specifies the group DN(s). User will be added as a team member if the user is a member of ANY of these groups.\n" -"- remove: True/False. Defaults to True. If True, a user who is not a member of the given groups will be removed from the team." +" If a string or list of strings, specifies the group DN(s). User will be " +"added as a team member if the user is a member of ANY of these groups.\n" +"- remove: True/False. Defaults to True. If True, a user who is not a member " +"of the given groups will be removed from the team." msgstr "" -"チームメンバー (ユーザー) と LDAP グループ間のマッピングです。キーはチーム名です (存在しない場合に作成されます)。値は各チームのメンバーシップのオプションの辞書です。各値には以下のパラメーターが含まれます。\n" +"チームメンバー (ユーザー) と LDAP グループ間のマッピングです。キーはチーム名です " +"(存在しない場合に作成されます)。値は各チームのメンバーシップのオプションの辞書です。各値には以下のパラメーターが含まれます。\n" "\n" " - organization: 文字列。チームが属する組織の名前です。組織とチーム名の組み合わせ\n" " が存在しない場合にチームが作成されます。組織がまず作成されます (存在しない場合)。\n" @@ -3087,92 +3367,100 @@ msgstr "" " True/False の場合、すべての LDAP ユーザーがチームメンバーとして追加/削除されます。\n" " 文字列または文字列の一覧の場合、グループ DN を指定します。\n" " ユーザーがこれらのグループのいずれかのメンバーである場合、チームメンバーとして追加されます。\n" -"- remove: True/False。デフォルトで True に設定されます。True の場合、指定グループのメンバーでないユーザーはチームから削除されます。" +"- remove: True/False。デフォルトで True に設定されます。True " +"の場合、指定グループのメンバーでないユーザーはチームから削除されます。" -#: sso/conf.py:487 +#: awx/sso/conf.py:487 msgid "RADIUS Server" msgstr "RADIUS サーバー" -#: sso/conf.py:488 +#: awx/sso/conf.py:488 msgid "" -"Hostname/IP of RADIUS server. RADIUS authentication will be disabled if this" -" setting is empty." +"Hostname/IP of RADIUS server. RADIUS authentication will be disabled if this " +"setting is empty." msgstr "RADIUS サーバーのホスト名/IP です。この設定が空の場合は RADIUS 認証は無効にされます。" -#: sso/conf.py:490 sso/conf.py:504 sso/conf.py:516 +#: awx/sso/conf.py:490 +#: awx/sso/conf.py:504 +#: awx/sso/conf.py:516 msgid "RADIUS" msgstr "RADIUS" -#: sso/conf.py:502 +#: awx/sso/conf.py:502 msgid "RADIUS Port" msgstr "RADIUS ポート" -#: sso/conf.py:503 +#: awx/sso/conf.py:503 msgid "Port of RADIUS server." msgstr "RADIUS サーバーのポート。" -#: sso/conf.py:514 +#: awx/sso/conf.py:514 msgid "RADIUS Secret" msgstr "RADIUS シークレット" -#: sso/conf.py:515 +#: awx/sso/conf.py:515 msgid "Shared secret for authenticating to RADIUS server." msgstr "RADIUS サーバーに対して認証するための共有シークレット。" -#: sso/conf.py:531 +#: awx/sso/conf.py:531 msgid "Google OAuth2 Callback URL" msgstr "Google OAuth2 コールバック URL" -#: sso/conf.py:532 +#: awx/sso/conf.py:532 msgid "" "Create a project at https://console.developers.google.com/ to obtain an " "OAuth2 key and secret for a web application. Ensure that the Google+ API is " "enabled. Provide this URL as the callback URL for your application." msgstr "" -"web アプリケーションの OAuth2 キーおよびシークレットを取得するために " -"https://console.developers.google.com/ にプロジェクトを作成します。Google+ API " -"が有効であることを確認します。この URL をアプリケーションのコールバック URL として指定します。" +"web アプリケーションの OAuth2 キーおよびシークレットを取得するために https://console.developers.google." +"com/ にプロジェクトを作成します。Google+ API が有効であることを確認します。この URL をアプリケーションのコールバック URL " +"として指定します。" -#: sso/conf.py:536 sso/conf.py:547 sso/conf.py:558 sso/conf.py:571 -#: sso/conf.py:585 sso/conf.py:597 sso/conf.py:609 +#: awx/sso/conf.py:536 +#: awx/sso/conf.py:547 +#: awx/sso/conf.py:558 +#: awx/sso/conf.py:571 +#: awx/sso/conf.py:585 +#: awx/sso/conf.py:597 +#: awx/sso/conf.py:609 msgid "Google OAuth2" msgstr "Google OAuth2" -#: sso/conf.py:545 +#: awx/sso/conf.py:545 msgid "Google OAuth2 Key" msgstr "Google OAuth2 キー" -#: sso/conf.py:546 +#: awx/sso/conf.py:546 msgid "" -"The OAuth2 key from your web application at " -"https://console.developers.google.com/." +"The OAuth2 key from your web application at https://console.developers." +"google.com/." msgstr "web アプリケーションの OAuth2 キー (https://console.developers.google.com/)。" -#: sso/conf.py:556 +#: awx/sso/conf.py:556 msgid "Google OAuth2 Secret" msgstr "Google OAuth2 シークレット" -#: sso/conf.py:557 +#: awx/sso/conf.py:557 msgid "" -"The OAuth2 secret from your web application at " -"https://console.developers.google.com/." +"The OAuth2 secret from your web application at https://console.developers." +"google.com/." msgstr "web アプリケーションの OAuth2 シークレット (https://console.developers.google.com/)。" -#: sso/conf.py:568 +#: awx/sso/conf.py:568 msgid "Google OAuth2 Whitelisted Domains" msgstr "Google OAuth2 ホワイトリストドメイン" -#: sso/conf.py:569 +#: awx/sso/conf.py:569 msgid "" "Update this setting to restrict the domains who are allowed to login using " "Google OAuth2." msgstr "この設定を更新し、Google OAuth2 を使用してログインできるドメインを制限します。" -#: sso/conf.py:580 +#: awx/sso/conf.py:580 msgid "Google OAuth2 Extra Arguments" msgstr "Google OAuth2 追加引数" -#: sso/conf.py:581 +#: awx/sso/conf.py:581 msgid "" "Extra arguments for Google OAuth2 login. When only allowing a single domain " "to authenticate, set to `{\"hd\": \"yourdomain.com\"}` and Google will not " @@ -3182,200 +3470,215 @@ msgstr "" "Google OAuth2 ログインの追加引数です。単一ドメインの認証のみを許可する場合、`{\"hd\": \"yourdomain.com\"}` " "に設定すると、Google はユーザーが複数の Google アカウントでログインしている場合でもその他のアカウントを表示しません。" -#: sso/conf.py:595 +#: awx/sso/conf.py:595 msgid "Google OAuth2 Organization Map" msgstr "Google OAuth2 組織マップ" -#: sso/conf.py:607 +#: awx/sso/conf.py:607 msgid "Google OAuth2 Team Map" msgstr "Google OAuth2 チームマップ" -#: sso/conf.py:623 +#: awx/sso/conf.py:623 msgid "GitHub OAuth2 Callback URL" msgstr "GitHub OAuth2 コールバック URL" -#: sso/conf.py:624 +#: awx/sso/conf.py:624 msgid "" "Create a developer application at https://github.com/settings/developers to " "obtain an OAuth2 key (Client ID) and secret (Client Secret). Provide this " "URL as the callback URL for your application." msgstr "" -"OAuth2 キー (クライアント ID) およびシークレット (クライアントシークレット) を取得するために " -"https://github.com/settings/developers に開発者アプリケーションを作成します。この URL " -"をアプリケーションのコールバック URL として指定します。" +"OAuth2 キー (クライアント ID) およびシークレット (クライアントシークレット) を取得するために https://github.com/" +"settings/developers に開発者アプリケーションを作成します。この URL をアプリケーションのコールバック URL として指定します。" -#: sso/conf.py:628 sso/conf.py:639 sso/conf.py:649 sso/conf.py:661 -#: sso/conf.py:673 +#: awx/sso/conf.py:628 +#: awx/sso/conf.py:639 +#: awx/sso/conf.py:649 +#: awx/sso/conf.py:661 +#: awx/sso/conf.py:673 msgid "GitHub OAuth2" msgstr "GitHub OAuth2" -#: sso/conf.py:637 +#: awx/sso/conf.py:637 msgid "GitHub OAuth2 Key" msgstr "GitHub OAuth2 キー" -#: sso/conf.py:638 +#: awx/sso/conf.py:638 msgid "The OAuth2 key (Client ID) from your GitHub developer application." msgstr "GitHub 開発者アプリケーションからの OAuth2 キー (クライアント ID)。" -#: sso/conf.py:647 +#: awx/sso/conf.py:647 msgid "GitHub OAuth2 Secret" msgstr "GitHub OAuth2 シークレット" -#: sso/conf.py:648 +#: awx/sso/conf.py:648 msgid "" "The OAuth2 secret (Client Secret) from your GitHub developer application." msgstr "GitHub 開発者アプリケーションからの OAuth2 シークレット (クライアントシークレット)。" -#: sso/conf.py:659 +#: awx/sso/conf.py:659 msgid "GitHub OAuth2 Organization Map" msgstr "GitHub OAuth2 組織マップ" -#: sso/conf.py:671 +#: awx/sso/conf.py:671 msgid "GitHub OAuth2 Team Map" msgstr "GitHub OAuth2 チームマップ" -#: sso/conf.py:687 +#: awx/sso/conf.py:687 msgid "GitHub Organization OAuth2 Callback URL" msgstr "GitHub 組織 OAuth2 コールバック URL" -#: sso/conf.py:688 sso/conf.py:763 +#: awx/sso/conf.py:688 +#: awx/sso/conf.py:763 msgid "" -"Create an organization-owned application at " -"https://github.com/organizations//settings/applications and obtain " -"an OAuth2 key (Client ID) and secret (Client Secret). Provide this URL as " -"the callback URL for your application." +"Create an organization-owned application at https://github.com/organizations/" +"/settings/applications and obtain an OAuth2 key (Client ID) and " +"secret (Client Secret). Provide this URL as the callback URL for your " +"application." msgstr "" -"組織が所有するアプリケーションを " -"https://github.com/organizations//settings/applications に作成し、OAuth2" -" キー (クライアント ID) およびシークレット (クライアントシークレット) を取得します。この URL をアプリケーションのコールバック URL " -"として指定します。" +"組織が所有するアプリケーションを https://github.com/organizations//settings/" +"applications に作成し、OAuth2 キー (クライアント ID) およびシークレット (クライアントシークレット) を取得します。この " +"URL をアプリケーションのコールバック URL として指定します。" -#: sso/conf.py:692 sso/conf.py:703 sso/conf.py:713 sso/conf.py:725 -#: sso/conf.py:736 sso/conf.py:748 +#: awx/sso/conf.py:692 +#: awx/sso/conf.py:703 +#: awx/sso/conf.py:713 +#: awx/sso/conf.py:725 +#: awx/sso/conf.py:736 +#: awx/sso/conf.py:748 msgid "GitHub Organization OAuth2" msgstr "GitHub 組織 OAuth2" -#: sso/conf.py:701 +#: awx/sso/conf.py:701 msgid "GitHub Organization OAuth2 Key" msgstr "GitHub 組織 OAuth2 キー" -#: sso/conf.py:702 sso/conf.py:777 +#: awx/sso/conf.py:702 +#: awx/sso/conf.py:777 msgid "The OAuth2 key (Client ID) from your GitHub organization application." msgstr "GitHub 組織アプリケーションからの OAuth2 キー (クライアント ID)。" -#: sso/conf.py:711 +#: awx/sso/conf.py:711 msgid "GitHub Organization OAuth2 Secret" msgstr "GitHub 組織 OAuth2 シークレット" -#: sso/conf.py:712 sso/conf.py:787 +#: awx/sso/conf.py:712 +#: awx/sso/conf.py:787 msgid "" "The OAuth2 secret (Client Secret) from your GitHub organization application." msgstr "GitHub 組織アプリケーションからの OAuth2 シークレット (クライアントシークレット)。" -#: sso/conf.py:722 +#: awx/sso/conf.py:722 msgid "GitHub Organization Name" msgstr "GitHub 組織名" -#: sso/conf.py:723 +#: awx/sso/conf.py:723 msgid "" "The name of your GitHub organization, as used in your organization's URL: " "https://github.com//." msgstr "GitHub 組織の名前で、組織の URL (https://github.com//) で使用されます。" -#: sso/conf.py:734 +#: awx/sso/conf.py:734 msgid "GitHub Organization OAuth2 Organization Map" msgstr "GitHub 組織 OAuth2 組織マップ" -#: sso/conf.py:746 +#: awx/sso/conf.py:746 msgid "GitHub Organization OAuth2 Team Map" msgstr "GitHub 組織 OAuth2 チームマップ" -#: sso/conf.py:762 +#: awx/sso/conf.py:762 msgid "GitHub Team OAuth2 Callback URL" msgstr "GitHub チーム OAuth2 コールバック URL" -#: sso/conf.py:767 sso/conf.py:778 sso/conf.py:788 sso/conf.py:800 -#: sso/conf.py:811 sso/conf.py:823 +#: awx/sso/conf.py:767 +#: awx/sso/conf.py:778 +#: awx/sso/conf.py:788 +#: awx/sso/conf.py:800 +#: awx/sso/conf.py:811 +#: awx/sso/conf.py:823 msgid "GitHub Team OAuth2" msgstr "GitHub チーム OAuth2" -#: sso/conf.py:776 +#: awx/sso/conf.py:776 msgid "GitHub Team OAuth2 Key" msgstr "GitHub チーム OAuth2 キー" -#: sso/conf.py:786 +#: awx/sso/conf.py:786 msgid "GitHub Team OAuth2 Secret" msgstr "GitHub チーム OAuth2 シークレット" -#: sso/conf.py:797 +#: awx/sso/conf.py:797 msgid "GitHub Team ID" msgstr "GitHub チーム ID" -#: sso/conf.py:798 +#: awx/sso/conf.py:798 msgid "" -"Find the numeric team ID using the Github API: http://fabian-" -"kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/." +"Find the numeric team ID using the Github API: http://fabian-kostadinov." +"github.io/2015/01/16/how-to-find-a-github-team-id/." msgstr "" -"Github API を使用して数値のチーム ID を検索します: http://fabian-" -"kostadinov.github.io/2015/01/16/how-to-find-a-github-team-id/" +"Github API を使用して数値のチーム ID を検索します: http://fabian-kostadinov.github.io/2015/01/" +"16/how-to-find-a-github-team-id/" -#: sso/conf.py:809 +#: awx/sso/conf.py:809 msgid "GitHub Team OAuth2 Organization Map" msgstr "GitHub チーム OAuth2 組織マップ" -#: sso/conf.py:821 +#: awx/sso/conf.py:821 msgid "GitHub Team OAuth2 Team Map" msgstr "GitHub チーム OAuth2 チームマップ" -#: sso/conf.py:837 +#: awx/sso/conf.py:837 msgid "Azure AD OAuth2 Callback URL" msgstr "Azure AD OAuth2 コールバック URL" -#: sso/conf.py:838 +#: awx/sso/conf.py:838 msgid "" -"Register an Azure AD application as described by https://msdn.microsoft.com" -"/en-us/library/azure/dn132599.aspx and obtain an OAuth2 key (Client ID) and " +"Register an Azure AD application as described by https://msdn.microsoft.com/" +"en-us/library/azure/dn132599.aspx and obtain an OAuth2 key (Client ID) and " "secret (Client Secret). Provide this URL as the callback URL for your " "application." msgstr "" -"Azure AD アプリケーションを https://msdn.microsoft.com/en-" -"us/library/azure/dn132599.aspx の説明に従って登録し、OAuth2 キー (クライアント ID) およびシークレット " -"(クライアントシークレット) を取得します。この URL をアプリケーションのコールバック URL として指定します。" +"Azure AD アプリケーションを https://msdn.microsoft.com/en-us/library/azure/dn132599." +"aspx の説明に従って登録し、OAuth2 キー (クライアント ID) およびシークレット (クライアントシークレット) を取得します。この URL " +"をアプリケーションのコールバック URL として指定します。" -#: sso/conf.py:842 sso/conf.py:853 sso/conf.py:863 sso/conf.py:875 -#: sso/conf.py:887 +#: awx/sso/conf.py:842 +#: awx/sso/conf.py:853 +#: awx/sso/conf.py:863 +#: awx/sso/conf.py:875 +#: awx/sso/conf.py:887 msgid "Azure AD OAuth2" msgstr "Azure AD OAuth2" -#: sso/conf.py:851 +#: awx/sso/conf.py:851 msgid "Azure AD OAuth2 Key" msgstr "Azure AD OAuth2 キー" -#: sso/conf.py:852 +#: awx/sso/conf.py:852 msgid "The OAuth2 key (Client ID) from your Azure AD application." msgstr "Azure AD アプリケーションからの OAuth2 キー (クライアント ID)。" -#: sso/conf.py:861 +#: awx/sso/conf.py:861 msgid "Azure AD OAuth2 Secret" msgstr "Azure AD OAuth2 シークレット" -#: sso/conf.py:862 +#: awx/sso/conf.py:862 msgid "The OAuth2 secret (Client Secret) from your Azure AD application." msgstr "Azure AD アプリケーションからの OAuth2 シークレット (クライアントシークレット)。" -#: sso/conf.py:873 +#: awx/sso/conf.py:873 msgid "Azure AD OAuth2 Organization Map" msgstr "Azure AD OAuth2 組織マップ" -#: sso/conf.py:885 +#: awx/sso/conf.py:885 msgid "Azure AD OAuth2 Team Map" msgstr "Azure AD OAuth2 チームマップ" -#: sso/conf.py:906 +#: awx/sso/conf.py:906 msgid "SAML Service Provider Callback URL" msgstr "SAML サービスプロバイダーコールバック URL" -#: sso/conf.py:907 +#: awx/sso/conf.py:907 msgid "" "Register Tower as a service provider (SP) with each identity provider (IdP) " "you have configured. Provide your SP Entity ID and this callback URL for " @@ -3384,307 +3687,324 @@ msgstr "" "設定済みの各アイデンティティープロバイダー (IdP) で Tower をサービスプロバイダー (SP) として登録します。SP エンティティー ID " "およびアプリケーションのこのコールバック URL を指定します。" -#: sso/conf.py:910 sso/conf.py:924 sso/conf.py:937 sso/conf.py:951 -#: sso/conf.py:965 sso/conf.py:983 sso/conf.py:1005 sso/conf.py:1024 -#: sso/conf.py:1044 sso/conf.py:1078 sso/conf.py:1091 +#: awx/sso/conf.py:910 +#: awx/sso/conf.py:924 +#: awx/sso/conf.py:937 +#: awx/sso/conf.py:951 +#: awx/sso/conf.py:965 +#: awx/sso/conf.py:983 +#: awx/sso/conf.py:1005 +#: awx/sso/conf.py:1024 +#: awx/sso/conf.py:1044 +#: awx/sso/conf.py:1078 +#: awx/sso/conf.py:1091 msgid "SAML" msgstr "SAML" -#: sso/conf.py:921 +#: awx/sso/conf.py:921 msgid "SAML Service Provider Metadata URL" msgstr "SAML サービスプロバイダーメタデータ URL" -#: sso/conf.py:922 +#: awx/sso/conf.py:922 msgid "" "If your identity provider (IdP) allows uploading an XML metadata file, you " "can download one from this URL." msgstr "" "アイデンティティープロバイダー (IdP) が XML メタデータファイルのアップロードを許可する場合、この URL からダウンロードできます。" -#: sso/conf.py:934 +#: awx/sso/conf.py:934 msgid "SAML Service Provider Entity ID" msgstr "SAML サービスプロバイダーエンティティー ID" -#: sso/conf.py:935 +#: awx/sso/conf.py:935 msgid "" "The application-defined unique identifier used as the audience of the SAML " "service provider (SP) configuration." msgstr "SAML サービスプロバイダー (SP) 設定の対象として使用されるアプリケーションで定義される固有識別子。" -#: sso/conf.py:948 +#: awx/sso/conf.py:948 msgid "SAML Service Provider Public Certificate" msgstr "SAML サービスプロバイダーの公開証明書" -#: sso/conf.py:949 +#: awx/sso/conf.py:949 msgid "" -"Create a keypair for Tower to use as a service provider (SP) and include the" -" certificate content here." +"Create a keypair for Tower to use as a service provider (SP) and include the " +"certificate content here." msgstr "サービスプロバイダー (SP) として使用するための Tower のキーペアを作成し、ここに証明書の内容を組み込みます。" -#: sso/conf.py:962 +#: awx/sso/conf.py:962 msgid "SAML Service Provider Private Key" msgstr "SAML サービスプロバイダーの秘密鍵|" -#: sso/conf.py:963 +#: awx/sso/conf.py:963 msgid "" -"Create a keypair for Tower to use as a service provider (SP) and include the" -" private key content here." +"Create a keypair for Tower to use as a service provider (SP) and include the " +"private key content here." msgstr "サービスプロバイダー (SP) として使用するための Tower のキーペアを作成し、ここに秘密鍵の内容を組み込みます。" -#: sso/conf.py:981 +#: awx/sso/conf.py:981 msgid "SAML Service Provider Organization Info" msgstr "SAML サービスプロバイダーの組織情報" -#: sso/conf.py:982 +#: awx/sso/conf.py:982 msgid "Configure this setting with information about your app." msgstr "アプリの情報でこの設定を行います。" -#: sso/conf.py:1003 +#: awx/sso/conf.py:1003 msgid "SAML Service Provider Technical Contact" msgstr "SAML サービスプロバイダーテクニカルサポートの問い合わせ先" -#: sso/conf.py:1004 sso/conf.py:1023 +#: awx/sso/conf.py:1004 +#: awx/sso/conf.py:1023 msgid "Configure this setting with your contact information." msgstr "問い合わせ先情報で設定を行います。" -#: sso/conf.py:1022 +#: awx/sso/conf.py:1022 msgid "SAML Service Provider Support Contact" msgstr "SAML サービスプロバイダーサポートの問い合わせ先" -#: sso/conf.py:1037 +#: awx/sso/conf.py:1037 msgid "SAML Enabled Identity Providers" msgstr "SAML で有効にされたアイデンティティープロバイダー" -#: sso/conf.py:1038 +#: awx/sso/conf.py:1038 msgid "" "Configure the Entity ID, SSO URL and certificate for each identity provider " "(IdP) in use. Multiple SAML IdPs are supported. Some IdPs may provide user " -"data using attribute names that differ from the default OIDs " -"(https://github.com/omab/python-social-" -"auth/blob/master/social/backends/saml.py#L16). Attribute names may be " -"overridden for each IdP." +"data using attribute names that differ from the default OIDs (https://github." +"com/omab/python-social-auth/blob/master/social/backends/saml.py#L16). " +"Attribute names may be overridden for each IdP." msgstr "" -"使用中のそれぞれのアイデンティティープロバイダー (IdP) についてのエンティティー ID、SSO URL および証明書を設定します。複数の SAML" -" IdP がサポートされます。一部の IdP はデフォルト OID とは異なる属性名を使用してユーザーデータを提供することがあります " -"(https://github.com/omab/python-social-" -"auth/blob/master/social/backends/saml.py#L16)。それぞれの IdP の属性名を上書きできます。" +"使用中のそれぞれのアイデンティティープロバイダー (IdP) についてのエンティティー ID、SSO URL および証明書を設定します。複数の SAML " +"IdP がサポートされます。一部の IdP はデフォルト OID とは異なる属性名を使用してユーザーデータを提供することがあります (https://" +"github.com/omab/python-social-auth/blob/master/social/backends/saml." +"py#L16)。それぞれの IdP の属性名を上書きできます。" -#: sso/conf.py:1076 +#: awx/sso/conf.py:1076 msgid "SAML Organization Map" msgstr "SAML 組織マップ" -#: sso/conf.py:1089 +#: awx/sso/conf.py:1089 msgid "SAML Team Map" msgstr "SAML チームマップ" -#: sso/fields.py:123 +#: awx/sso/fields.py:123 msgid "Invalid connection option(s): {invalid_options}." msgstr "無効な接続オプション: {invalid_options}" -#: sso/fields.py:194 +#: awx/sso/fields.py:194 msgid "Base" msgstr "ベース" -#: sso/fields.py:195 +#: awx/sso/fields.py:195 msgid "One Level" msgstr "1 レベル" -#: sso/fields.py:196 +#: awx/sso/fields.py:196 msgid "Subtree" msgstr "サブツリー" -#: sso/fields.py:214 +#: awx/sso/fields.py:214 msgid "Expected a list of three items but got {length} instead." msgstr "3 つの項目の一覧が予期されましが、{length} が取得されました。" -#: sso/fields.py:215 +#: awx/sso/fields.py:215 msgid "Expected an instance of LDAPSearch but got {input_type} instead." msgstr "LDAPSearch のインスタンスが予期されましたが、{input_type} が取得されました。" -#: sso/fields.py:251 +#: awx/sso/fields.py:251 msgid "" "Expected an instance of LDAPSearch or LDAPSearchUnion but got {input_type} " "instead." msgstr "" "LDAPSearch または LDAPSearchUnion のインスタンスが予期されましたが、{input_type} が取得されました。" -#: sso/fields.py:278 +#: awx/sso/fields.py:278 msgid "Invalid user attribute(s): {invalid_attrs}." msgstr "無効なユーザー属性: {invalid_attrs}" -#: sso/fields.py:295 +#: awx/sso/fields.py:295 msgid "Expected an instance of LDAPGroupType but got {input_type} instead." msgstr "LDAPGroupType のインスタンスが予期されましたが、{input_type} が取得されました。" -#: sso/fields.py:323 +#: awx/sso/fields.py:323 msgid "Invalid user flag: \"{invalid_flag}\"." msgstr "無効なユーザーフラグ: \"{invalid_flag}\"" -#: sso/fields.py:339 sso/fields.py:506 +#: awx/sso/fields.py:339 +#: awx/sso/fields.py:506 msgid "" -"Expected None, True, False, a string or list of strings but got {input_type}" -" instead." +"Expected None, True, False, a string or list of strings but got {input_type} " +"instead." msgstr "None、True、False、文字列または文字列の一覧が予期されましたが、{input_type} が取得されました。" -#: sso/fields.py:375 +#: awx/sso/fields.py:375 msgid "Missing key(s): {missing_keys}." msgstr "キーがありません: {missing_keys}" -#: sso/fields.py:376 +#: awx/sso/fields.py:376 msgid "Invalid key(s): {invalid_keys}." msgstr "無効なキー: {invalid_keys}" -#: sso/fields.py:425 sso/fields.py:542 +#: awx/sso/fields.py:425 +#: awx/sso/fields.py:542 msgid "Invalid key(s) for organization map: {invalid_keys}." msgstr "組織マップの無効なキー: {invalid_keys}" -#: sso/fields.py:443 +#: awx/sso/fields.py:443 msgid "Missing required key for team map: {invalid_keys}." msgstr "チームマップの必要なキーがありません: {invalid_keys}" -#: sso/fields.py:444 sso/fields.py:561 +#: awx/sso/fields.py:444 +#: awx/sso/fields.py:561 msgid "Invalid key(s) for team map: {invalid_keys}." msgstr "チームマップの無効なキー: {invalid_keys}" -#: sso/fields.py:560 +#: awx/sso/fields.py:560 msgid "Missing required key for team map: {missing_keys}." msgstr "チームマップで必要なキーがありません: {missing_keys}" -#: sso/fields.py:578 +#: awx/sso/fields.py:578 msgid "Missing required key(s) for org info record: {missing_keys}." msgstr "組織情報レコードで必要なキーがありません: {missing_keys}" -#: sso/fields.py:591 +#: awx/sso/fields.py:591 msgid "Invalid language code(s) for org info: {invalid_lang_codes}." msgstr "組織情報の無効な言語コード: {invalid_lang_codes}" -#: sso/fields.py:610 +#: awx/sso/fields.py:610 msgid "Missing required key(s) for contact: {missing_keys}." msgstr "問い合わせ先の必要なキーがありません: {missing_keys}" -#: sso/fields.py:622 +#: awx/sso/fields.py:622 msgid "Missing required key(s) for IdP: {missing_keys}." msgstr "IdP で必要なキーがありません: {missing_keys}" -#: sso/pipeline.py:24 +#: awx/sso/pipeline.py:24 msgid "An account cannot be found for {0}" msgstr "{0} のアカウントが見つかりません" -#: sso/pipeline.py:30 +#: awx/sso/pipeline.py:30 msgid "Your account is inactive" msgstr "アカウントが非アクティブです" -#: sso/validators.py:19 sso/validators.py:44 +#: awx/sso/validators.py:19 +#: awx/sso/validators.py:44 #, python-format msgid "DN must include \"%%(user)s\" placeholder for username: %s" msgstr "DN にはユーザー名の \"%%(user)s\" プレースホルダーを含める必要があります: %s" -#: sso/validators.py:26 +#: awx/sso/validators.py:26 #, python-format msgid "Invalid DN: %s" msgstr "無効な DN: %s" -#: sso/validators.py:56 +#: awx/sso/validators.py:56 #, python-format msgid "Invalid filter: %s" msgstr "無効なフィルター: %s" -#: templates/error.html:4 ui/templates/ui/index.html:8 +#: awx/templates/error.html:4 +#: awx/ui/templates/ui/index.html:8 msgid "Ansible Tower" msgstr "Ansible Tower" -#: templates/rest_framework/api.html:39 +#: awx/templates/rest_framework/api.html:39 msgid "Ansible Tower API Guide" msgstr "Ansible Tower API ガイド" -#: templates/rest_framework/api.html:40 +#: awx/templates/rest_framework/api.html:40 msgid "Back to Ansible Tower" msgstr "Ansible Tower に戻る" -#: templates/rest_framework/api.html:41 +#: awx/templates/rest_framework/api.html:41 msgid "Resize" msgstr "サイズの変更" -#: templates/rest_framework/base.html:78 templates/rest_framework/base.html:92 +#: awx/templates/rest_framework/base.html:78 +#: awx/templates/rest_framework/base.html:92 #, python-format msgid "Make a GET request on the %(name)s resource" msgstr "%(name)s リソースでの GET 要求" -#: templates/rest_framework/base.html:80 +#: awx/templates/rest_framework/base.html:80 msgid "Specify a format for the GET request" msgstr "GET 要求の形式を指定" -#: templates/rest_framework/base.html:86 +#: awx/templates/rest_framework/base.html:86 #, python-format msgid "" "Make a GET request on the %(name)s resource with the format set to " "`%(format)s`" msgstr "形式が `%(format)s` に設定された状態での %(name)s リソースでの GET 要求" -#: templates/rest_framework/base.html:100 +#: awx/templates/rest_framework/base.html:100 #, python-format msgid "Make an OPTIONS request on the %(name)s resource" msgstr "%(name)s リソースでの OPTIONS 要求" -#: templates/rest_framework/base.html:106 +#: awx/templates/rest_framework/base.html:106 #, python-format msgid "Make a DELETE request on the %(name)s resource" msgstr "%(name)s リソースでの DELETE 要求" -#: templates/rest_framework/base.html:113 +#: awx/templates/rest_framework/base.html:113 msgid "Filters" msgstr "フィルター" -#: templates/rest_framework/base.html:172 -#: templates/rest_framework/base.html:186 +#: awx/templates/rest_framework/base.html:172 +#: awx/templates/rest_framework/base.html:186 #, python-format msgid "Make a POST request on the %(name)s resource" msgstr "%(name)s リソースでの POST 要求" -#: templates/rest_framework/base.html:216 -#: templates/rest_framework/base.html:230 +#: awx/templates/rest_framework/base.html:216 +#: awx/templates/rest_framework/base.html:230 #, python-format msgid "Make a PUT request on the %(name)s resource" msgstr "%(name)s リソースでの PUT 要求" -#: templates/rest_framework/base.html:233 +#: awx/templates/rest_framework/base.html:233 #, python-format msgid "Make a PATCH request on the %(name)s resource" msgstr "%(name)s リソースでの PATCH 要求" -#: ui/apps.py:9 ui/conf.py:22 ui/conf.py:38 ui/conf.py:53 +#: awx/ui/apps.py:9 +#: awx/ui/conf.py:22 +#: awx/ui/conf.py:38 +#: awx/ui/conf.py:53 msgid "UI" msgstr "UI" -#: ui/conf.py:16 +#: awx/ui/conf.py:16 msgid "Off" msgstr "オフ" -#: ui/conf.py:17 +#: awx/ui/conf.py:17 msgid "Anonymous" msgstr "匿名" -#: ui/conf.py:18 +#: awx/ui/conf.py:18 msgid "Detailed" msgstr "詳細" -#: ui/conf.py:20 +#: awx/ui/conf.py:20 msgid "Analytics Tracking State" msgstr "アナリティクストラッキングの状態" -#: ui/conf.py:21 +#: awx/ui/conf.py:21 msgid "Enable or Disable Analytics Tracking." msgstr "アナリティクストラッキングの有効化/無効化。" -#: ui/conf.py:31 +#: awx/ui/conf.py:31 msgid "Custom Login Info" msgstr "カスタムログイン情報" -#: ui/conf.py:32 +#: awx/ui/conf.py:32 msgid "" "If needed, you can add specific information (such as a legal notice or a " -"disclaimer) to a text box in the login modal using this setting. Any content" -" added must be in plain text, as custom HTML or other markup languages are " +"disclaimer) to a text box in the login modal using this setting. Any content " +"added must be in plain text, as custom HTML or other markup languages are " "not supported. If multiple paragraphs of text are needed, new lines " "(paragraphs) must be escaped as `\\n` within the block of text." msgstr "" @@ -3693,116 +4013,114 @@ msgstr "" "や他のマークアップ言語がサポートされないため、プレーンテキストでなければなりません。テキストの複数のパラグラフが必要な場合、改行 (パラグラフ) " "をテキストのブロック内の `\\n` としてエスケープする必要があります。" -#: ui/conf.py:48 +#: awx/ui/conf.py:48 msgid "Custom Logo" msgstr "カスタムロゴ" -#: ui/conf.py:49 +#: awx/ui/conf.py:49 msgid "" -"To set up a custom logo, provide a file that you create. For the custom logo" -" to look its best, use a `.png` file with a transparent background. GIF, PNG" -" and JPEG formats are supported." +"To set up a custom logo, provide a file that you create. For the custom logo " +"to look its best, use a `.png` file with a transparent background. GIF, PNG " +"and JPEG formats are supported." msgstr "" -"カスタムロゴをセットアップするには、作成するファイルを指定します。カスタムロゴを最適化するには、背景が透明の「.png」ファイルを使用します。GIF、PNG" -" および JPEG 形式がサポートされます。" +"カスタムロゴをセットアップするには、作成するファイルを指定します。カスタムロゴを最適化するには、背景が透明の「." +"png」ファイルを使用します。GIF、PNG および JPEG 形式がサポートされます。" -#: ui/fields.py:29 +#: awx/ui/fields.py:29 msgid "" "Invalid format for custom logo. Must be a data URL with a base64-encoded " "GIF, PNG or JPEG image." msgstr "" "カスタムロゴの無効な形式です。base64 エンコードされた GIF、PNG または JPEG イメージと共にデータ URL を指定する必要があります。" -#: ui/fields.py:30 +#: awx/ui/fields.py:30 msgid "Invalid base64-encoded data in data URL." msgstr "データ URL の無効な base64 エンコードされたデータ。" -#: ui/templates/ui/index.html:49 +#: awx/ui/templates/ui/index.html:49 msgid "" -"Your session will expire in 60 seconds, would you like to " -"continue?" +"Your session will expire in 60 seconds, would you like to continue?" msgstr "" "セッションは 60 秒後に期限切れになります。続行しますか?" -#: ui/templates/ui/index.html:64 +#: awx/ui/templates/ui/index.html:64 msgid "CANCEL" msgstr "取り消し" -#: ui/templates/ui/index.html:116 +#: awx/ui/templates/ui/index.html:116 msgid "Set how many days of data should be retained." msgstr "データの保持日数を設定します。" -#: ui/templates/ui/index.html:122 +#: awx/ui/templates/ui/index.html:122 msgid "" -"Please enter an integer that is not " +"Please enter an integer that is not " "negative that is lower than " -"9999." +"prompt_for_days_form.days_to_keep.$error.max\"> that is lower than 9999." msgstr "" "負でない 9999 " -"より値の小さい整数を入力してください。" +"prompt_for_days_form.days_to_keep.$error.min\">負でない 9999 より値の小さい整数を入力してください。" -#: ui/templates/ui/index.html:127 +#: awx/ui/templates/ui/index.html:127 msgid "" -"For facts collected older than the time period specified, save one fact scan (snapshot) per time window (frequency). For example, facts older than 30 days are purged, while one weekly fact scan is kept.\n" +"For facts collected older than the time period specified, save one fact scan " +"(snapshot) per time window (frequency). For example, facts older than 30 " +"days are purged, while one weekly fact scan is kept.\n" "
\n" -"
CAUTION: Setting both numerical variables to \"0\" will delete all facts.\n" +"
CAUTION: Setting both numerical variables to \"0\" " +"will delete all facts.\n" "
\n" "
" msgstr "" -"指定された期間の前に収集されたファクトについては、時間枠 (頻度) ごとに 1 つのファクトスキャン (スナップショット) を保存します。たとえば、30 日間の前のファクトは削除され、1 つの週次ファクトは保持されます。\n" +"指定された期間の前に収集されたファクトについては、時間枠 (頻度) ごとに 1 つのファクトスキャン (スナップショット) を保存します。たとえば、30 " +"日間の前のファクトは削除され、1 つの週次ファクトは保持されます。\n" "
\n" "
注意: どちらの数値変数も「0」に設定すると、すべてのファクトが削除されます。\n" "
\n" "
" -#: ui/templates/ui/index.html:136 +#: awx/ui/templates/ui/index.html:136 msgid "Select a time period after which to remove old facts" msgstr "古いファクトを削除するまでの期間を選択" -#: ui/templates/ui/index.html:150 +#: awx/ui/templates/ui/index.html:150 msgid "" -"Please enter an integer that is not " -"negative that is lower than " -"9999." +"Please enter an integer " +"that is not negative " +"that is lower than 9999." msgstr "" "負でない 9999 " -"より値の小さい整数を入力してください。" +"prompt_for_days_facts_form.keep_amount.$error.min\">負でない
9999 より値の小さい整数を入力してください。" -#: ui/templates/ui/index.html:155 +#: awx/ui/templates/ui/index.html:155 msgid "Select a frequency for snapshot retention" msgstr "スナップショットの保持頻度を選択" -#: ui/templates/ui/index.html:169 +#: awx/ui/templates/ui/index.html:169 msgid "" -"Please enter an integer that is not" -" negative that is not negative that is " "lower than 9999." msgstr "" -"負でない 9999 " -"よりも値の小さい整数を入力してください。" +"負でない " +"9999 よりも値の小さい整数を入力してください。" -#: ui/templates/ui/index.html:175 +#: awx/ui/templates/ui/index.html:175 msgid "working..." msgstr "実行中..." diff --git a/awx/main/access.py b/awx/main/access.py index 9417563f75..c18b4cfd6f 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -8,7 +8,7 @@ import logging # Django from django.conf import settings -from django.db.models import Q +from django.db.models import Q, Prefetch from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.utils.translation import ugettext_lazy as _ @@ -25,7 +25,7 @@ from awx.main.task_engine import TaskEnhancer from awx.conf.license import LicenseForbids __all__ = ['get_user_queryset', 'check_user_access', 'check_user_access_with_errors', - 'user_accessible_objects', + 'user_accessible_objects', 'consumer_access', 'user_admin_role', 'StateConflict',] PERMISSION_TYPES = [ @@ -164,6 +164,17 @@ def check_superuser(func): return wrapper +def consumer_access(group_name): + ''' + consumer_access returns the proper Access class based on group_name + for a channels consumer. + ''' + class_map = {'job_events': JobAccess, + 'workflow_events': WorkflowJobAccess, + 'ad_hoc_command_events': AdHocCommandAccess} + return class_map.get(group_name) + + class BaseAccess(object): ''' Base class for checking user access to a given model. Subclasses should @@ -625,7 +636,7 @@ class HostAccess(BaseAccess): raise PermissionDenied(_('Unable to change inventory on a host.')) # Prevent renaming a host that might exceed license count - if 'name' in data: + if data and 'name' in data: self.check_license(add_host_name=data['name']) # Checks for admin or change permission on inventory, controls whether @@ -744,7 +755,10 @@ class InventorySourceAccess(BaseAccess): def can_change(self, obj, data): # Checks for admin or change permission on group. if obj and obj.group: - return self.user.can_access(Group, 'change', obj.group, None) + return ( + self.user.can_access(Group, 'change', obj.group, None) and + self.check_related('credential', Credential, data, obj=obj, role_field='use_role') + ) # Can't change inventory sources attached to only the inventory, since # these are created automatically from the management command. else: @@ -817,7 +831,11 @@ class CredentialAccess(BaseAccess): permitted to see. """ qs = self.model.accessible_objects(self.user, 'read_role') - return qs.select_related('created_by', 'modified_by').all() + qs = qs.select_related('created_by', 'modified_by') + qs = qs.prefetch_related( + 'admin_role', 'use_role', 'read_role', + 'admin_role__parents', 'admin_role__members') + return qs @check_superuser def can_read(self, obj): @@ -1033,10 +1051,6 @@ class JobTemplateAccess(BaseAccess): return qs.select_related('created_by', 'modified_by', 'inventory', 'project', 'credential', 'cloud_credential', 'next_schedule').all() - @check_superuser - def can_read(self, obj): - return self.user in obj.read_role - def can_add(self, data): ''' a user can create a job template if they are a superuser, an org admin @@ -1357,7 +1371,7 @@ class SystemJobTemplateAccess(BaseAccess): model = SystemJobTemplate @check_superuser - def can_start(self, obj): + def can_start(self, obj, validate_license=True): '''Only a superuser can start a job from a SystemJobTemplate''' return False @@ -1549,7 +1563,7 @@ class WorkflowJobTemplateAccess(BaseAccess): missing_credentials = [] missing_inventories = [] qs = obj.workflow_job_template_nodes - qs.select_related('unified_job_template', 'inventory', 'credential') + qs = qs.prefetch_related('unified_job_template', 'inventory__use_role', 'credential__use_role') for node in qs.all(): node_errors = {} if node.inventory and self.user not in node.inventory.use_role: @@ -1853,6 +1867,7 @@ class UnifiedJobTemplateAccess(BaseAccess): qs = qs.prefetch_related( 'last_job', 'current_job', + Prefetch('labels', queryset=Label.objects.all().order_by('name')) ) # WISH - sure would be nice if the following worked, but it does not. @@ -1900,6 +1915,7 @@ class UnifiedJobAccess(BaseAccess): 'modified_by', 'unified_job_node__workflow_job', 'unified_job_template', + Prefetch('labels', queryset=Label.objects.all().order_by('name')) ) # WISH - sure would be nice if the following worked, but it does not. @@ -2109,7 +2125,7 @@ class ActivityStreamAccess(BaseAccess): 'job_template', 'job', 'ad_hoc_command', 'notification_template', 'notification', 'label', 'role', 'actor', 'schedule', 'custom_inventory_script', 'unified_job_template', - 'workflow_job_template', 'workflow_job') + 'workflow_job_template', 'workflow_job', 'workflow_job_template_node') if self.user.is_superuser or self.user.is_system_auditor: return qs.all() diff --git a/awx/main/conf.py b/awx/main/conf.py index 2361a54e3e..d82e766607 100644 --- a/awx/main/conf.py +++ b/awx/main/conf.py @@ -263,6 +263,7 @@ register( help_text=_('Username for external log aggregator (if required).'), category=_('Logging'), category_slug='logging', + required=False, ) register( 'LOG_AGGREGATOR_PASSWORD', @@ -273,6 +274,7 @@ register( help_text=_('Password or authentication token for external log aggregator (if required).'), category=_('Logging'), category_slug='logging', + required=False, ) register( 'LOG_AGGREGATOR_LOGGERS', diff --git a/awx/main/consumers.py b/awx/main/consumers.py index 2cb1f450f2..6b7edcfecb 100644 --- a/awx/main/consumers.py +++ b/awx/main/consumers.py @@ -1,12 +1,14 @@ import json -import urlparse import logging +import urllib from channels import Group from channels.sessions import channel_session +from channels.handler import AsgiRequest + +from django.core.serializers.json import DjangoJSONEncoder from django.contrib.auth.models import User -from django.core.serializers.json import DjangoJSONEncoder from awx.main.models.organization import AuthToken @@ -19,31 +21,24 @@ def discard_groups(message): Group(group).discard(message.reply_channel) -def validate_token(token): - try: - auth_token = AuthToken.objects.get(key=token) - if not auth_token.in_valid_tokens: - return None - except AuthToken.DoesNotExist: - return None - return auth_token - - -def user_from_token(auth_token): - try: - return User.objects.get(pk=auth_token.user_id) - except User.DoesNotExist: - return None - - @channel_session def ws_connect(message): - token = None - qs = urlparse.parse_qs(message['query_string']) - if 'token' in qs: - if len(qs['token']) > 0: - token = qs['token'].pop() - message.channel_session['token'] = token + connect_text = {'accept':False, 'user':None} + + message.content['method'] = 'FAKE' + request = AsgiRequest(message) + token = request.COOKIES.get('token', None) + if token is not None: + token = urllib.unquote(token).strip('"') + try: + auth_token = AuthToken.objects.get(key=token) + if auth_token.in_valid_tokens: + message.channel_session['user_id'] = auth_token.user_id + connect_text['accept'] = True + connect_text['user'] = auth_token.user_id + except AuthToken.DoesNotExist: + logger.error("auth_token provided was invalid.") + message.reply_channel.send({"text": json.dumps(connect_text)}) @channel_session @@ -53,20 +48,15 @@ def ws_disconnect(message): @channel_session def ws_receive(message): - token = message.channel_session.get('token') + from awx.main.access import consumer_access - auth_token = validate_token(token) - if auth_token is None: - logger.error("Authentication Failure validating user") - message.reply_channel.send({"text": json.dumps({"error": "invalid auth token"})}) - return None - - user = user_from_token(auth_token) - if user is None: - logger.error("No valid user corresponding to submitted auth_token") + user_id = message.channel_session.get('user_id', None) + if user_id is None: + logger.error("No valid user found for websocket.") message.reply_channel.send({"text": json.dumps({"error": "no valid user"})}) return None + user = User.objects.get(pk=user_id) raw_data = message.content['text'] data = json.loads(raw_data) @@ -78,6 +68,12 @@ def ws_receive(message): if type(v) is list: for oid in v: name = '{}-{}'.format(group_name, oid) + access_cls = consumer_access(group_name) + if access_cls is not None: + user_access = access_cls(user) + if not user_access.get_queryset().filter(pk=oid).exists(): + message.reply_channel.send({"text": json.dumps({"error": "access denied to channel {0} for resource id {1}".format(group_name, oid)})}) + continue current_groups.append(name) Group(name).add(message.reply_channel) else: @@ -87,4 +83,7 @@ def ws_receive(message): def emit_channel_notification(group, payload): - Group(group).send({"text": json.dumps(payload, cls=DjangoJSONEncoder)}) + try: + Group(group).send({"text": json.dumps(payload, cls=DjangoJSONEncoder)}) + except ValueError: + logger.error("Invalid payload emitting channel {} on topic: {}".format(group, payload)) diff --git a/awx/main/management/commands/cleanup_jobs.py b/awx/main/management/commands/cleanup_jobs.py index ead5ef50d9..3b26767bc0 100644 --- a/awx/main/management/commands/cleanup_jobs.py +++ b/awx/main/management/commands/cleanup_jobs.py @@ -56,8 +56,8 @@ class Command(NoArgsCommand): #jobs_qs = jobs_qs.filter(created__lte=self.cutoff) skipped, deleted = 0, 0 for job in Job.objects.all(): - job_display = '"%s" (started %s, %d host summaries, %d events)' % \ - (unicode(job), unicode(job.created), + job_display = '"%s" (%d host summaries, %d events)' % \ + (unicode(job), job.job_host_summaries.count(), job.job_events.count()) if job.status in ('pending', 'waiting', 'running'): action_text = 'would skip' if self.dry_run else 'skipping' @@ -78,8 +78,8 @@ class Command(NoArgsCommand): def cleanup_ad_hoc_commands(self): skipped, deleted = 0, 0 for ad_hoc_command in AdHocCommand.objects.all(): - ad_hoc_command_display = '"%s" (started %s, %d events)' % \ - (unicode(ad_hoc_command), unicode(ad_hoc_command.created), + ad_hoc_command_display = '"%s" (%d events)' % \ + (unicode(ad_hoc_command), ad_hoc_command.ad_hoc_command_events.count()) if ad_hoc_command.status in ('pending', 'waiting', 'running'): action_text = 'would skip' if self.dry_run else 'skipping' @@ -100,7 +100,7 @@ class Command(NoArgsCommand): def cleanup_project_updates(self): skipped, deleted = 0, 0 for pu in ProjectUpdate.objects.all(): - pu_display = '"%s" (started %s)' % (unicode(pu), unicode(pu.created)) + pu_display = '"%s" (type %s)' % (unicode(pu), unicode(pu.launch_type)) if pu.status in ('pending', 'waiting', 'running'): action_text = 'would skip' if self.dry_run else 'skipping' self.logger.debug('%s %s project update %s', action_text, pu.status, pu_display) @@ -124,7 +124,7 @@ class Command(NoArgsCommand): def cleanup_inventory_updates(self): skipped, deleted = 0, 0 for iu in InventoryUpdate.objects.all(): - iu_display = '"%s" (started %s)' % (unicode(iu), unicode(iu.created)) + iu_display = '"%s" (source %s)' % (unicode(iu), unicode(iu.source)) if iu.status in ('pending', 'waiting', 'running'): action_text = 'would skip' if self.dry_run else 'skipping' self.logger.debug('%s %s inventory update %s', action_text, iu.status, iu_display) @@ -148,7 +148,7 @@ class Command(NoArgsCommand): def cleanup_management_jobs(self): skipped, deleted = 0, 0 for sj in SystemJob.objects.all(): - sj_display = '"%s" (started %s)' % (unicode(sj), unicode(sj.created)) + sj_display = '"%s" (type %s)' % (unicode(sj), unicode(sj.job_type)) if sj.status in ('pending', 'waiting', 'running'): action_text = 'would skip' if self.dry_run else 'skipping' self.logger.debug('%s %s system_job %s', action_text, sj.status, sj_display) @@ -178,8 +178,8 @@ class Command(NoArgsCommand): def cleanup_workflow_jobs(self): skipped, deleted = 0, 0 for workflow_job in WorkflowJob.objects.all(): - workflow_job_display = '"{}" (started {}, {} nodes)'.format( - unicode(workflow_job), unicode(workflow_job.created), + workflow_job_display = '"{}" ({} nodes)'.format( + unicode(workflow_job), workflow_job.workflow_nodes.count()) if workflow_job.status in ('pending', 'waiting', 'running'): action_text = 'would skip' if self.dry_run else 'skipping' diff --git a/awx/main/management/commands/run_callback_receiver.py b/awx/main/management/commands/run_callback_receiver.py index 9da8ac9bd0..e984e41bf4 100644 --- a/awx/main/management/commands/run_callback_receiver.py +++ b/awx/main/management/commands/run_callback_receiver.py @@ -8,6 +8,7 @@ from uuid import UUID from multiprocessing import Process from multiprocessing import Queue as MPQueue from Queue import Empty as QueueEmpty +from Queue import Full as QueueFull from kombu import Connection, Exchange, Queue from kombu.mixins import ConsumerMixin @@ -79,18 +80,22 @@ class CallbackBrokerWorker(ConsumerMixin): def write_queue_worker(self, preferred_queue, body): queue_order = sorted(range(settings.JOB_EVENT_WORKERS), cmp=lambda x, y: -1 if x==preferred_queue else 0) + write_attempt_order = [] for queue_actual in queue_order: try: worker_actual = self.worker_queues[queue_actual] worker_actual[1].put(body, block=True, timeout=5) worker_actual[0] += 1 return queue_actual + except QueueFull: + pass except Exception: import traceback tb = traceback.format_exc() logger.warn("Could not write to queue %s" % preferred_queue) logger.warn("Detail: {}".format(tb)) - continue + write_attempt_order.append(preferred_queue) + logger.warn("Could not write payload to any queue, attempted order: {}".format(write_attempt_order)) return None def callback_worker(self, queue_actual, idx): diff --git a/awx/main/models/__init__.py b/awx/main/models/__init__.py index 3f7e309940..d7b65d8107 100644 --- a/awx/main/models/__init__.py +++ b/awx/main/models/__init__.py @@ -126,4 +126,5 @@ activity_stream_registrar.connect(Notification) activity_stream_registrar.connect(Label) activity_stream_registrar.connect(User) activity_stream_registrar.connect(WorkflowJobTemplate) +activity_stream_registrar.connect(WorkflowJobTemplateNode) activity_stream_registrar.connect(WorkflowJob) diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 64ad7f7791..19a853a45f 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -31,7 +31,6 @@ from awx.main.utils import ( ignore_inventory_computed_fields, parse_yaml_or_json, ) -from awx.main.redact import PlainTextCleaner from awx.main.fields import ImplicitRoleField from awx.main.models.mixins import ResourceMixin, SurveyJobTemplateMixin, SurveyJobMixin from awx.main.models.base import PERM_INVENTORY_SCAN @@ -296,18 +295,27 @@ class JobTemplate(UnifiedJobTemplate, JobOptions, SurveyJobTemplateMixin, Resour def get_absolute_url(self): return reverse('api:job_template_detail', args=(self.pk,)) - def can_start_without_user_input(self): + def can_start_without_user_input(self, callback_extra_vars=None): ''' Return whether job template can be used to start a new job without requiring any user input. ''' + variables_needed = False + if callback_extra_vars: + extra_vars_dict = parse_yaml_or_json(callback_extra_vars) + for var in self.variables_needed_to_start: + if var not in extra_vars_dict: + variables_needed = True + break + elif self.variables_needed_to_start: + variables_needed = True prompting_needed = False for value in self._ask_for_vars_dict().values(): if value: prompting_needed = True return (not prompting_needed and not self.passwords_needed_to_start and - not self.variables_needed_to_start) + not variables_needed) def _ask_for_vars_dict(self): return dict( @@ -601,25 +609,6 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin): return "$hidden due to Ansible no_log flag$" return artifacts - def _survey_search_and_replace(self, content): - # Use job template survey spec to identify password fields. - # Then lookup password fields in extra_vars and save the values - jt = self.job_template - if jt and jt.survey_enabled and 'spec' in jt.survey_spec: - # Use password vars to find in extra_vars - for key in jt.survey_password_variables(): - if key in self.extra_vars_dict: - content = PlainTextCleaner.remove_sensitive(content, self.extra_vars_dict[key]) - return content - - def _result_stdout_raw_limited(self, *args, **kwargs): - buff, start, end, abs_end = super(Job, self)._result_stdout_raw_limited(*args, **kwargs) - return self._survey_search_and_replace(buff), start, end, abs_end - - def _result_stdout_raw(self, *args, **kwargs): - content = super(Job, self)._result_stdout_raw(*args, **kwargs) - return self._survey_search_and_replace(content) - # Job Credential required @property def can_start(self): diff --git a/awx/main/models/mixins.py b/awx/main/models/mixins.py index 80eabf3495..c755de9f0a 100644 --- a/awx/main/models/mixins.py +++ b/awx/main/models/mixins.py @@ -127,14 +127,15 @@ class SurveyJobTemplateMixin(models.Model): # Overwrite with job template extra vars with survey default vars if self.survey_enabled and 'spec' in self.survey_spec: for survey_element in self.survey_spec.get("spec", []): - default = survey_element['default'] - variable_key = survey_element['variable'] + default = survey_element.get('default') + variable_key = survey_element.get('variable') if survey_element.get('type') == 'password': - if variable_key in kwargs_extra_vars: + if variable_key in kwargs_extra_vars and default: kw_value = kwargs_extra_vars[variable_key] if kw_value.startswith('$encrypted$') and kw_value != default: kwargs_extra_vars[variable_key] = default - extra_vars[variable_key] = default + if default is not None: + extra_vars[variable_key] = default # Overwrite job template extra vars with explicit job extra vars # and add on job extra vars diff --git a/awx/main/models/projects.py b/awx/main/models/projects.py index 6c76143f40..9897067843 100644 --- a/awx/main/models/projects.py +++ b/awx/main/models/projects.py @@ -473,7 +473,7 @@ class ProjectUpdate(UnifiedJob, ProjectOptions, JobNotificationMixin): def _update_parent_instance(self): parent_instance = self._get_parent_instance() - if parent_instance: + if parent_instance and self.job_type == 'check': update_fields = self._update_parent_instance_no_save(parent_instance) if self.status in ('successful', 'failed', 'error', 'canceled'): if not self.failed and parent_instance.scm_delete_on_next_update: diff --git a/awx/main/models/rbac.py b/awx/main/models/rbac.py index 9e40846b42..39b57b96c5 100644 --- a/awx/main/models/rbac.py +++ b/awx/main/models/rbac.py @@ -10,9 +10,9 @@ import re # Django from django.db import models, transaction, connection from django.core.urlresolvers import reverse -from django.utils.translation import ugettext_lazy as _ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey +from django.utils.translation import ugettext_lazy as _ # AWX @@ -25,6 +25,7 @@ __all__ = [ 'get_roles_on_resource', 'ROLE_SINGLETON_SYSTEM_ADMINISTRATOR', 'ROLE_SINGLETON_SYSTEM_AUDITOR', + 'role_summary_fields_generator' ] logger = logging.getLogger('awx.main.models.rbac') @@ -33,29 +34,29 @@ ROLE_SINGLETON_SYSTEM_ADMINISTRATOR='system_administrator' ROLE_SINGLETON_SYSTEM_AUDITOR='system_auditor' role_names = { - 'system_administrator' : 'System Administrator', - 'system_auditor' : 'System Auditor', - 'adhoc_role' : 'Ad Hoc', - 'admin_role' : 'Admin', - 'auditor_role' : 'Auditor', - 'execute_role' : 'Execute', - 'member_role' : 'Member', - 'read_role' : 'Read', - 'update_role' : 'Update', - 'use_role' : 'Use', + 'system_administrator' : _('System Administrator'), + 'system_auditor' : _('System Auditor'), + 'adhoc_role' : _('Ad Hoc'), + 'admin_role' : _('Admin'), + 'auditor_role' : _('Auditor'), + 'execute_role' : _('Execute'), + 'member_role' : _('Member'), + 'read_role' : _('Read'), + 'update_role' : _('Update'), + 'use_role' : _('Use'), } role_descriptions = { - 'system_administrator' : 'Can manage all aspects of the system', - 'system_auditor' : 'Can view all settings on the system', - 'adhoc_role' : 'May run ad hoc commands on an inventory', - 'admin_role' : 'Can manage all aspects of the %s', - 'auditor_role' : 'Can view all settings for the %s', - 'execute_role' : 'May run the %s', - 'member_role' : 'User is a member of the %s', - 'read_role' : 'May view settings for the %s', - 'update_role' : 'May update project or inventory or group using the configured source update system', - 'use_role' : 'Can use the %s in a job template', + 'system_administrator' : _('Can manage all aspects of the system'), + 'system_auditor' : _('Can view all settings on the system'), + 'adhoc_role' : _('May run ad hoc commands on an inventory'), + 'admin_role' : _('Can manage all aspects of the %s'), + 'auditor_role' : _('Can view all settings for the %s'), + 'execute_role' : _('May run the %s'), + 'member_role' : _('User is a member of the %s'), + 'read_role' : _('May view settings for the %s'), + 'update_role' : _('May update project or inventory or group using the configured source update system'), + 'use_role' : _('Can use the %s in a job template'), } @@ -165,13 +166,11 @@ class Role(models.Model): global role_names return role_names[self.role_field] - def get_description(self, reference_content_object=None): + @property + def description(self): global role_descriptions description = role_descriptions[self.role_field] - if reference_content_object: - content_type = ContentType.objects.get_for_model(reference_content_object) - else: - content_type = self.content_type + content_type = self.content_type if '%s' in description and content_type: model = content_type.model_class() model_name = re.sub(r'([a-z])([A-Z])', r'\1 \2', model.__name__).lower() @@ -179,8 +178,6 @@ class Role(models.Model): return description - description = property(get_description) - @staticmethod def rebuild_role_ancestor_list(additions, removals): ''' @@ -474,3 +471,20 @@ def get_roles_on_resource(resource, accessor): object_id=resource.id ).values_list('role_field', flat=True).distinct() ] + + +def role_summary_fields_generator(content_object, role_field): + global role_descriptions + global role_names + summary = {} + description = role_descriptions[role_field] + content_type = ContentType.objects.get_for_model(content_object) + if '%s' in description and content_type: + model = content_object.__class__ + model_name = re.sub(r'([a-z])([A-Z])', r'\1 \2', model.__name__).lower() + description = description % model_name + + summary['description'] = description + summary['name'] = role_names[role_field] + summary['id'] = getattr(content_object, '{}_id'.format(role_field)) + return summary diff --git a/awx/main/models/unified_jobs.py b/awx/main/models/unified_jobs.py index fdbe566fc2..7da004eb7e 100644 --- a/awx/main/models/unified_jobs.py +++ b/awx/main/models/unified_jobs.py @@ -168,6 +168,12 @@ class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique, Notificatio else: return super(UnifiedJobTemplate, self).unique_error_message(model_class, unique_check) + @classmethod + def invalid_user_capabilities_prefetch_models(cls): + if cls != UnifiedJobTemplate: + return [] + return ['project', 'inventorysource', 'systemjobtemplate'] + @classmethod def accessible_pk_qs(cls, accessor, role_field): ''' @@ -175,6 +181,9 @@ class UnifiedJobTemplate(PolymorphicModel, CommonModelNameNotUnique, Notificatio Does not return inventory sources or system JTs, these should be handled inside of get_queryset where it is utilized. ''' + # do not use this if in a subclass + if cls != UnifiedJobTemplate: + return super(UnifiedJobTemplate, cls).accessible_pk_qs(accessor, role_field) ujt_names = [c.__name__.lower() for c in cls.__subclasses__() if c.__name__.lower() not in ['inventorysource', 'systemjobtemplate']] subclass_content_types = list(ContentType.objects.filter( diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index 7e6f73f085..a6a1ccfe81 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -6,6 +6,7 @@ # Django from django.db import models +from django.conf import settings from django.core.urlresolvers import reverse #from django import settings as tower_settings @@ -27,6 +28,7 @@ from awx.main.utils import parse_yaml_or_json from awx.main.fields import JSONField from copy import copy +from urlparse import urljoin __all__ = ['WorkflowJobTemplate', 'WorkflowJob', 'WorkflowJobOptions', 'WorkflowJobNode', 'WorkflowJobTemplateNode',] @@ -468,6 +470,9 @@ class WorkflowJob(UnifiedJob, WorkflowJobOptions, SurveyJobMixin, JobNotificatio def get_absolute_url(self): return reverse('api:workflow_job_detail', args=(self.pk,)) + def get_ui_url(self): + return urljoin(settings.TOWER_URL_BASE, '/#/workflows/{}'.format(self.pk)) + def notification_data(self): result = super(WorkflowJob, self).notification_data() str_arr = ['Workflow job summary:', ''] diff --git a/awx/main/queue.py b/awx/main/queue.py index eb050d5fa0..03a7b2a2cf 100644 --- a/awx/main/queue.py +++ b/awx/main/queue.py @@ -43,6 +43,7 @@ class CallbackQueueDispatcher(object): compression='bzip2', exchange=self.exchange, declare=[self.exchange], + delivery_mode="persistent" if settings.PERSISTENT_CALLBACK_MESSAGES else "transient", routing_key=self.connection_queue) return except Exception, e: diff --git a/awx/main/redact.py b/awx/main/redact.py index a4776601ac..5f945ae9b7 100644 --- a/awx/main/redact.py +++ b/awx/main/redact.py @@ -58,4 +58,6 @@ class PlainTextCleaner(object): @staticmethod def remove_sensitive(cleartext, sensitive): + if sensitive == '': + return cleartext return re.sub(r'%s' % re.escape(sensitive), '$encrypted$', cleartext) diff --git a/awx/main/scheduler/__init__.py b/awx/main/scheduler/__init__.py index bb98cec776..7446785a7b 100644 --- a/awx/main/scheduler/__init__.py +++ b/awx/main/scheduler/__init__.py @@ -123,12 +123,15 @@ class TaskManager(): spawn_node.save() if job._resources_sufficient_for_launch(): can_start = job.signal_start(**kv) + if not can_start: + job.job_explanation = _("Job spawned from workflow could not start because it " + "was not in the right state or required manual credentials") else: can_start = False + job.job_explanation = _("Job spawned from workflow could not start because it " + "was missing a related resource such as project or inventory") if not can_start: job.status = 'failed' - job.job_explanation = _("Job spawned from workflow could not start because it " - "was not in the right state or required manual credentials") job.save(update_fields=['status', 'job_explanation']) connection.on_commit(lambda: job.websocket_emit_status('failed')) diff --git a/awx/main/scheduler/partial.py b/awx/main/scheduler/partial.py index c28992d7f3..6cb87add15 100644 --- a/awx/main/scheduler/partial.py +++ b/awx/main/scheduler/partial.py @@ -230,7 +230,7 @@ class InventorySourceDict(PartialModelDict): class SystemJobDict(PartialModelDict): FIELDS = ( - 'id', 'created', 'status', + 'id', 'created', 'status', 'celery_task_id', ) model = SystemJob @@ -271,5 +271,5 @@ class WorkflowJobDict(PartialModelDict): return 'workflow_job' def task_impact(self): - return 10 + return 0 diff --git a/awx/main/tasks.py b/awx/main/tasks.py index 216a4f4534..194cc3c837 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -53,13 +53,13 @@ from awx.main.queue import CallbackQueueDispatcher from awx.main.task_engine import TaskEnhancer from awx.main.utils import (get_ansible_version, get_ssh_version, decrypt_field, update_scm_url, check_proot_installed, build_proot_temp_dir, wrap_args_with_proot, - get_system_task_capacity, OutputEventFilter) + get_system_task_capacity, OutputEventFilter, parse_yaml_or_json) from awx.main.consumers import emit_channel_notification __all__ = ['RunJob', 'RunSystemJob', 'RunProjectUpdate', 'RunInventoryUpdate', 'RunAdHocCommand', 'handle_work_error', 'handle_work_success', 'update_inventory_computed_fields', - 'send_notifications', 'run_administrative_checks'] + 'send_notifications', 'run_administrative_checks', 'purge_old_stdout_files'] HIDDEN_PASSWORD = '**********' @@ -193,6 +193,15 @@ def cleanup_authtokens(self): AuthToken.objects.filter(expires__lt=now()).delete() +@task(bind=True) +def purge_old_stdout_files(self): + nowtime = time.time() + for f in os.listdir(settings.JOBOUTPUT_ROOT): + if os.path.getctime(os.path.join(settings.JOBOUTPUT_ROOT,f)) < nowtime - settings.LOCAL_STDOUT_EXPIRE_TIME: + os.unlink(os.path.join(settings.JOBOUTPUT_ROOT,f)) + logger.info("Removing {}".format(os.path.join(settings.JOBOUTPUT_ROOT,f))) + + @task(bind=True) def cluster_node_heartbeat(self): logger.debug("Cluster node heartbeat task.") @@ -225,7 +234,7 @@ def tower_periodic_scheduler(self): logger.warn("Cache timeout is in the future, bypassing schedule for template %s" % str(template.id)) continue new_unified_job = template.create_unified_job(launch_type='scheduled', schedule=schedule) - can_start = new_unified_job.signal_start(extra_vars=schedule.extra_data) + can_start = new_unified_job.signal_start(extra_vars=parse_yaml_or_json(schedule.extra_data)) if not can_start: new_unified_job.status = 'failed' new_unified_job.job_explanation = "Scheduled job could not start because it was not in the right state or required manual credentials" @@ -721,7 +730,7 @@ class BaseTask(Task): stdout_handle = self.get_stdout_handle(instance) if self.should_use_proot(instance, **kwargs): if not check_proot_installed(): - raise RuntimeError('proot is not installed') + raise RuntimeError('bubblewrap is not installed') kwargs['proot_temp_dir'] = build_proot_temp_dir() args = wrap_args_with_proot(args, cwd, **kwargs) safe_args = wrap_args_with_proot(safe_args, cwd, **kwargs) @@ -874,7 +883,7 @@ class RunJob(BaseTask): cp_dir = os.path.join(kwargs['private_data_dir'], 'cp') if not os.path.exists(cp_dir): os.mkdir(cp_dir, 0700) - env['ANSIBLE_SSH_CONTROL_PATH'] = os.path.join(cp_dir, 'ansible-ssh-%%h-%%p-%%r') + env['ANSIBLE_SSH_CONTROL_PATH'] = os.path.join(cp_dir, '%%h%%p%%r') # Allow the inventory script to include host variables inline via ['_meta']['hostvars']. env['INVENTORY_HOSTVARS'] = str(True) @@ -1314,6 +1323,15 @@ class RunProjectUpdate(BaseTask): ''' return kwargs.get('private_data_files', {}).get('scm_credential', '') + def get_stdout_handle(self, instance): + stdout_handle = super(RunProjectUpdate, self).get_stdout_handle(instance) + + def raw_callback(data): + instance_actual = ProjectUpdate.objects.get(pk=instance.pk) + instance_actual.result_stdout_text += data + instance_actual.save() + return OutputEventFilter(stdout_handle, raw_callback=raw_callback) + def post_run_hook(self, instance, status, **kwargs): if instance.job_type == 'check' and status not in ('failed', 'canceled',): p = instance.project @@ -1349,7 +1367,7 @@ class RunInventoryUpdate(BaseTask): project_name=credential.project) if credential.domain not in (None, ''): openstack_auth['domain_name'] = credential.domain - private_state = str(inventory_update.source_vars_dict.get('private', 'true')) + private_state = inventory_update.source_vars_dict.get('private', True) # Retrieve cache path from inventory update vars if available, # otherwise create a temporary cache path only for this update. cache = inventory_update.source_vars_dict.get('cache', {}) @@ -1600,7 +1618,6 @@ class RunInventoryUpdate(BaseTask): if inventory_update.overwrite_vars: args.append('--overwrite-vars') args.append('--source') - # If this is a cloud-based inventory (e.g. from AWS, Rackspace, etc.) # then we need to set some extra flags based on settings in # Tower. @@ -1656,22 +1673,41 @@ class RunInventoryUpdate(BaseTask): os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) args.append(runpath) args.append("--custom") - # try: - # shutil.rmtree(runpath, True) - # except OSError: - # pass + self.custom_dir_path.append(runpath) verbosity = getattr(settings, 'INVENTORY_UPDATE_VERBOSITY', 1) args.append('-v%d' % verbosity) if settings.DEBUG: args.append('--traceback') return args + def get_stdout_handle(self, instance): + stdout_handle = super(RunInventoryUpdate, self).get_stdout_handle(instance) + + def raw_callback(data): + instance_actual = InventoryUpdate.objects.get(pk=instance.pk) + instance_actual.result_stdout_text += data + instance_actual.save() + return OutputEventFilter(stdout_handle, raw_callback=raw_callback) + def build_cwd(self, inventory_update, **kwargs): return self.get_path_to('..', 'plugins', 'inventory') def get_idle_timeout(self): return getattr(settings, 'INVENTORY_UPDATE_IDLE_TIMEOUT', None) + def pre_run_hook(self, instance, **kwargs): + self.custom_dir_path = [] + + def post_run_hook(self, instance, status, **kwargs): + print("In post run hook") + if self.custom_dir_path: + for p in self.custom_dir_path: + try: + shutil.rmtree(p, True) + except OSError: + pass + + class RunAdHocCommand(BaseTask): ''' @@ -1878,6 +1914,8 @@ class RunSystemJob(BaseTask): json_vars = json.loads(system_job.extra_vars) if 'days' in json_vars and system_job.job_type != 'cleanup_facts': args.extend(['--days', str(json_vars.get('days', 60))]) + if 'dry_run' in json_vars and json_vars['dry_run'] and system_job.job_type != 'cleanup_facts': + args.extend(['--dry-run']) if system_job.job_type == 'cleanup_jobs': args.extend(['--jobs', '--project-updates', '--inventory-updates', '--management-jobs', '--ad-hoc-commands', '--workflow-jobs', @@ -1891,6 +1929,15 @@ class RunSystemJob(BaseTask): logger.error("Failed to parse system job: " + str(e)) return args + def get_stdout_handle(self, instance): + stdout_handle = super(RunSystemJob, self).get_stdout_handle(instance) + + def raw_callback(data): + instance_actual = SystemJob.objects.get(pk=instance.pk) + instance_actual.result_stdout_text += data + instance_actual.save() + return OutputEventFilter(stdout_handle, raw_callback=raw_callback) + def build_env(self, instance, **kwargs): env = super(RunSystemJob, self).build_env(instance, **kwargs) diff --git a/awx/main/tests/functional/api/test_job_runtime_params.py b/awx/main/tests/functional/api/test_job_runtime_params.py index 37753bf113..af8bd659fd 100644 --- a/awx/main/tests/functional/api/test_job_runtime_params.py +++ b/awx/main/tests/functional/api/test_job_runtime_params.py @@ -83,17 +83,19 @@ def test_job_ignore_unprompted_vars(runtime_data, job_template_prompts, post, ad mock_job = mocker.MagicMock(spec=Job, id=968, **runtime_data) - with mocker.patch('awx.main.models.unified_jobs.UnifiedJobTemplate.create_unified_job', return_value=mock_job): + with mocker.patch.object(JobTemplate, 'create_unified_job', return_value=mock_job): with mocker.patch('awx.api.serializers.JobSerializer.to_representation'): response = post(reverse('api:job_template_launch', args=[job_template.pk]), runtime_data, admin_user, expect=201) + assert JobTemplate.create_unified_job.called + assert JobTemplate.create_unified_job.call_args == ({'extra_vars':{}},) # Check that job is serialized correctly job_id = response.data['job'] assert job_id == 968 # If job is created with no arguments, it will inherit JT attributes - mock_job.signal_start.assert_called_once_with(extra_vars={}) + mock_job.signal_start.assert_called_once() # Check that response tells us what things were ignored assert 'job_launch_var' in response.data['ignored_fields']['extra_vars'] @@ -112,15 +114,17 @@ def test_job_accept_prompted_vars(runtime_data, job_template_prompts, post, admi mock_job = mocker.MagicMock(spec=Job, id=968, **runtime_data) - with mocker.patch('awx.main.models.unified_jobs.UnifiedJobTemplate.create_unified_job', return_value=mock_job): + with mocker.patch.object(JobTemplate, 'create_unified_job', return_value=mock_job): with mocker.patch('awx.api.serializers.JobSerializer.to_representation'): response = post(reverse('api:job_template_launch', args=[job_template.pk]), runtime_data, admin_user, expect=201) + assert JobTemplate.create_unified_job.called + assert JobTemplate.create_unified_job.call_args == (runtime_data,) job_id = response.data['job'] assert job_id == 968 - mock_job.signal_start.assert_called_once_with(**runtime_data) + mock_job.signal_start.assert_called_once() @pytest.mark.django_db @@ -130,12 +134,14 @@ def test_job_accept_null_tags(job_template_prompts, post, admin_user, mocker): mock_job = mocker.MagicMock(spec=Job, id=968) - with mocker.patch('awx.main.models.unified_jobs.UnifiedJobTemplate.create_unified_job', return_value=mock_job): + with mocker.patch.object(JobTemplate, 'create_unified_job', return_value=mock_job): with mocker.patch('awx.api.serializers.JobSerializer.to_representation'): post(reverse('api:job_template_launch', args=[job_template.pk]), {'job_tags': '', 'skip_tags': ''}, admin_user, expect=201) + assert JobTemplate.create_unified_job.called + assert JobTemplate.create_unified_job.call_args == ({'job_tags':'', 'skip_tags':''},) - mock_job.signal_start.assert_called_once_with(job_tags='', skip_tags='') + mock_job.signal_start.assert_called_once() @pytest.mark.django_db @@ -154,14 +160,16 @@ def test_job_accept_prompted_vars_null(runtime_data, job_template_prompts_null, mock_job = mocker.MagicMock(spec=Job, id=968, **runtime_data) - with mocker.patch('awx.main.models.unified_jobs.UnifiedJobTemplate.create_unified_job', return_value=mock_job): + with mocker.patch.object(JobTemplate, 'create_unified_job', return_value=mock_job): with mocker.patch('awx.api.serializers.JobSerializer.to_representation'): response = post(reverse('api:job_template_launch', args=[job_template.pk]), runtime_data, rando, expect=201) + assert JobTemplate.create_unified_job.called + assert JobTemplate.create_unified_job.call_args == (runtime_data,) job_id = response.data['job'] assert job_id == 968 - mock_job.signal_start.assert_called_once_with(**runtime_data) + mock_job.signal_start.assert_called_once() @pytest.mark.django_db @@ -321,15 +329,18 @@ def test_job_launch_unprompted_vars_with_survey(mocker, survey_spec_factory, job with mocker.patch('awx.main.access.BaseAccess.check_license'): mock_job = mocker.MagicMock(spec=Job, id=968, extra_vars={"job_launch_var": 3, "survey_var": 4}) - with mocker.patch('awx.main.models.unified_jobs.UnifiedJobTemplate.create_unified_job', return_value=mock_job): + with mocker.patch.object(JobTemplate, 'create_unified_job', return_value=mock_job): with mocker.patch('awx.api.serializers.JobSerializer.to_representation', return_value={}): response = post( reverse('api:job_template_launch', args=[job_template.pk]), dict(extra_vars={"job_launch_var": 3, "survey_var": 4}), admin_user, expect=201) + assert JobTemplate.create_unified_job.called + assert JobTemplate.create_unified_job.call_args == ({'extra_vars':{'survey_var': 4}},) + job_id = response.data['job'] assert job_id == 968 # Check that the survey variable is accepted and the job variable isn't - mock_job.signal_start.assert_called_once_with(extra_vars={"survey_var": 4}) + mock_job.signal_start.assert_called_once() diff --git a/awx/main/tests/functional/api/test_rbac_displays.py b/awx/main/tests/functional/api/test_rbac_displays.py index e1255ffea9..c0a3e463cf 100644 --- a/awx/main/tests/functional/api/test_rbac_displays.py +++ b/awx/main/tests/functional/api/test_rbac_displays.py @@ -3,8 +3,7 @@ import pytest from django.core.urlresolvers import reverse from django.test.client import RequestFactory -from awx.main.models.jobs import JobTemplate -from awx.main.models import Role, Group +from awx.main.models import Role, Group, UnifiedJobTemplate, JobTemplate from awx.main.access import ( access_registry, get_user_capabilities @@ -283,6 +282,25 @@ def test_prefetch_jt_capabilities(job_template, rando): assert qs[0].capabilities_cache == {'edit': False, 'start': True} +@pytest.mark.django_db +def test_prefetch_ujt_job_template_capabilities(alice, bob, job_template): + job_template.execute_role.members.add(alice) + qs = UnifiedJobTemplate.objects.all() + cache_list_capabilities(qs, ['admin', 'execute'], UnifiedJobTemplate, alice) + assert qs[0].capabilities_cache == {'edit': False, 'start': True} + qs = UnifiedJobTemplate.objects.all() + cache_list_capabilities(qs, ['admin', 'execute'], UnifiedJobTemplate, bob) + assert qs[0].capabilities_cache == {'edit': False, 'start': False} + + +@pytest.mark.django_db +def test_prefetch_ujt_project_capabilities(alice, project): + project.update_role.members.add(alice) + qs = UnifiedJobTemplate.objects.all() + cache_list_capabilities(qs, ['admin', 'execute'], UnifiedJobTemplate, alice) + assert qs[0].capabilities_cache == {} + + @pytest.mark.django_db def test_prefetch_group_capabilities(group, rando): group.inventory.adhoc_role.members.add(rando) diff --git a/awx/main/tests/functional/test_rbac_inventory.py b/awx/main/tests/functional/test_rbac_inventory.py index 46f3adaae7..b68003f049 100644 --- a/awx/main/tests/functional/test_rbac_inventory.py +++ b/awx/main/tests/functional/test_rbac_inventory.py @@ -8,6 +8,7 @@ from awx.main.models import ( ) from awx.main.access import ( InventoryAccess, + InventorySourceAccess, HostAccess, InventoryUpdateAccess, CustomInventoryScriptAccess @@ -271,4 +272,8 @@ def test_host_access(organization, inventory, group, user, group_factory): assert inventory_admin_access.can_read(host) is False - +@pytest.mark.django_db +def test_inventory_source_credential_check(rando, inventory_source, credential): + inventory_source.group.inventory.admin_role.members.add(rando) + access = InventorySourceAccess(rando) + assert not access.can_change(inventory_source, {'credential': credential}) diff --git a/awx/main/tests/functional/test_rbac_job_templates.py b/awx/main/tests/functional/test_rbac_job_templates.py index 13e0da8e8c..f3868daeb7 100644 --- a/awx/main/tests/functional/test_rbac_job_templates.py +++ b/awx/main/tests/functional/test_rbac_job_templates.py @@ -226,6 +226,14 @@ def test_job_template_access_org_admin(jt_objects, rando): assert access.can_delete(jt_objects.job_template) +@pytest.mark.django_db +def test_orphan_JT_readable_by_system_auditor(job_template, system_auditor): + assert system_auditor.is_system_auditor + assert job_template.project is None + access = JobTemplateAccess(system_auditor) + assert access.can_read(job_template) + + @pytest.mark.django_db @pytest.mark.job_permissions def test_job_template_creator_access(project, rando, post): diff --git a/awx/main/tests/unit/api/serializers/test_job_template_serializers.py b/awx/main/tests/unit/api/serializers/test_job_template_serializers.py index c48633573c..50d190693a 100644 --- a/awx/main/tests/unit/api/serializers/test_job_template_serializers.py +++ b/awx/main/tests/unit/api/serializers/test_job_template_serializers.py @@ -110,7 +110,7 @@ class TestJobTemplateSerializerGetSummaryFields(): view.request = request serializer.context['view'] = view - with mocker.patch("awx.main.models.rbac.Role.get_description", return_value='Can eat pie'): + with mocker.patch("awx.api.serializers.role_summary_fields_generator", return_value='Can eat pie'): with mocker.patch("awx.main.access.JobTemplateAccess.can_change", return_value='foobar'): with mocker.patch("awx.main.access.JobTemplateAccess.can_add", return_value='foo'): response = serializer.get_summary_fields(jt_obj) diff --git a/awx/main/tests/unit/api/test_views.py b/awx/main/tests/unit/api/test_views.py index 37b9177db7..3bea19cedd 100644 --- a/awx/main/tests/unit/api/test_views.py +++ b/awx/main/tests/unit/api/test_views.py @@ -1,9 +1,12 @@ import mock import pytest +from collections import namedtuple + from awx.api.views import ( ApiV1RootView, JobTemplateLabelList, + JobTemplateSurveySpec, ) @@ -65,3 +68,16 @@ class TestJobTemplateLabelList: super(JobTemplateLabelList, view).unattach(mock_request, None, None) assert mixin_unattach.called_with(mock_request, None, None) + + +class TestJobTemplateSurveySpec(object): + @mock.patch('awx.api.views.feature_enabled', lambda feature: True) + def test_get_password_type(self, mocker, mock_response_new): + JobTemplate = namedtuple('JobTemplate', 'survey_spec') + obj = JobTemplate(survey_spec={'spec':[{'type': 'password', 'default': 'my_default'}]}) + with mocker.patch.object(JobTemplateSurveySpec, 'get_object', return_value=obj): + view = JobTemplateSurveySpec() + response = view.get(mocker.MagicMock()) + assert response == mock_response_new + # which there was a better way to do this! + assert response.call_args[0][1]['spec'][0]['default'] == '$encrypted$' diff --git a/awx/main/tests/unit/common/test_common.py b/awx/main/tests/unit/common/test_common.py new file mode 100644 index 0000000000..a152d69c12 --- /dev/null +++ b/awx/main/tests/unit/common/test_common.py @@ -0,0 +1,33 @@ +from awx.conf.models import Setting +from awx.main.utils import common + + +def test_encrypt_field(): + field = Setting(pk=123, value='ANSIBLE') + encrypted = common.encrypt_field(field, 'value') + assert encrypted == '$encrypted$AES$Ey83gcmMuBBT1OEq2lepnw==' + assert common.decrypt_field(field, 'value') == 'ANSIBLE' + + +def test_encrypt_field_without_pk(): + field = Setting(value='ANSIBLE') + encrypted = common.encrypt_field(field, 'value') + assert encrypted == '$encrypted$AES$8uIzEoGyY6QJwoTWbMFGhw==' + assert common.decrypt_field(field, 'value') == 'ANSIBLE' + + +def test_encrypt_subfield(): + field = Setting(value={'name': 'ANSIBLE'}) + encrypted = common.encrypt_field(field, 'value', subfield='name') + assert encrypted == '$encrypted$AES$8uIzEoGyY6QJwoTWbMFGhw==' + assert common.decrypt_field(field, 'value', subfield='name') == 'ANSIBLE' + + +def test_encrypt_field_with_ask(): + encrypted = common.encrypt_field(Setting(value='ASK'), 'value', ask=True) + assert encrypted == 'ASK' + + +def test_encrypt_field_with_empty_value(): + encrypted = common.encrypt_field(Setting(value=None), 'value') + assert encrypted is None diff --git a/awx/main/tests/unit/models/test_job_template_unit.py b/awx/main/tests/unit/models/test_job_template_unit.py index 28f2dc2993..194ce68cef 100644 --- a/awx/main/tests/unit/models/test_job_template_unit.py +++ b/awx/main/tests/unit/models/test_job_template_unit.py @@ -84,3 +84,34 @@ def test_job_template_survey_variable_validation(job_template_factory): } obj.survey_enabled = True assert obj.survey_variable_validation({"a": 5}) == ["Value 5 for 'a' expected to be a string."] + + +def test_job_template_survey_mixin(job_template_factory): + objects = job_template_factory( + 'survey_mixin_test', + organization='org1', + inventory='inventory1', + credential='cred1', + persisted=False, + ) + obj = objects.job_template + obj.survey_enabled = True + obj.survey_spec = {'spec': [{'default':'my_default', 'type':'password', 'variable':'my_variable'}]} + kwargs = obj._update_unified_job_kwargs(extra_vars={'my_variable':'$encrypted$'}) + assert kwargs['extra_vars'] == '{"my_variable": "my_default"}' + + +def test_job_template_survey_mixin_length(job_template_factory): + objects = job_template_factory( + 'survey_mixin_test', + organization='org1', + inventory='inventory1', + credential='cred1', + persisted=False, + ) + obj = objects.job_template + obj.survey_enabled = True + obj.survey_spec = {'spec': [{'default':'my_default', 'type':'password', 'variable':'my_variable'}, + {'type':'password', 'variable':'my_other_variable'}]} + kwargs = obj._update_unified_job_kwargs(extra_vars={'my_variable':'$encrypted$'}) + assert kwargs['extra_vars'] == '{"my_variable": "my_default"}' diff --git a/awx/main/tests/unit/models/test_label.py b/awx/main/tests/unit/models/test_label.py index 5c35803403..ecbdcb94fb 100644 --- a/awx/main/tests/unit/models/test_label.py +++ b/awx/main/tests/unit/models/test_label.py @@ -46,13 +46,13 @@ class TestLabelFilterMocked: def test_is_candidate_for_detach(self, mocker, jt_count, j_count, expected): mock_job_qs = mocker.MagicMock() mock_job_qs.count = mocker.MagicMock(return_value=j_count) - UnifiedJob.objects = mocker.MagicMock() - UnifiedJob.objects.filter = mocker.MagicMock(return_value=mock_job_qs) + mocker.patch.object(UnifiedJob, 'objects', mocker.MagicMock( + filter=mocker.MagicMock(return_value=mock_job_qs))) mock_jt_qs = mocker.MagicMock() mock_jt_qs.count = mocker.MagicMock(return_value=jt_count) - UnifiedJobTemplate.objects = mocker.MagicMock() - UnifiedJobTemplate.objects.filter = mocker.MagicMock(return_value=mock_jt_qs) + mocker.patch.object(UnifiedJobTemplate, 'objects', mocker.MagicMock( + filter=mocker.MagicMock(return_value=mock_jt_qs))) label = Label(id=37) ret = label.is_candidate_for_detach() diff --git a/awx/main/tests/unit/models/test_survey_models.py b/awx/main/tests/unit/models/test_survey_models.py index d58f7bd1c7..584a4cc7f0 100644 --- a/awx/main/tests/unit/models/test_survey_models.py +++ b/awx/main/tests/unit/models/test_survey_models.py @@ -20,11 +20,9 @@ def job(mocker): return ret -@pytest.mark.survey -def test_job_survey_password_redaction(): - """Tests the Job model's funciton to redact passwords from - extra_vars - used when displaying job information""" - job = Job( +@pytest.fixture +def job_with_survey(): + return Job( name="test-job-with-passwords", extra_vars=json.dumps({ 'submitter_email': 'foobar@redhat.com', @@ -33,7 +31,13 @@ def test_job_survey_password_redaction(): survey_passwords={ 'secret_key': '$encrypted$', 'SSN': '$encrypted$'}) - assert json.loads(job.display_extra_vars()) == { + + +@pytest.mark.survey +def test_job_survey_password_redaction(job_with_survey): + """Tests the Job model's funciton to redact passwords from + extra_vars - used when displaying job information""" + assert json.loads(job_with_survey.display_extra_vars()) == { 'submitter_email': 'foobar@redhat.com', 'secret_key': '$encrypted$', 'SSN': '$encrypted$'} diff --git a/awx/main/tests/unit/test_tasks.py b/awx/main/tests/unit/test_tasks.py index 2cefe0007b..d8b6469f93 100644 --- a/awx/main/tests/unit/test_tasks.py +++ b/awx/main/tests/unit/test_tasks.py @@ -1,15 +1,14 @@ -import pytest from contextlib import contextmanager +import pytest +import yaml + from awx.main.models import ( UnifiedJob, Notification, ) -from awx.main.tasks import ( - send_notifications, - run_administrative_checks, -) +from awx.main import tasks from awx.main.task_engine import TaskEnhancer @@ -22,12 +21,12 @@ def apply_patches(_patches): def test_send_notifications_not_list(): with pytest.raises(TypeError): - send_notifications(None) + tasks.send_notifications(None) def test_send_notifications_job_id(mocker): with mocker.patch('awx.main.models.UnifiedJob.objects.get'): - send_notifications([], job_id=1) + tasks.send_notifications([], job_id=1) assert UnifiedJob.objects.get.called assert UnifiedJob.objects.get.called_with(id=1) @@ -42,7 +41,7 @@ def test_send_notifications_list(mocker): patches.append(mocker.patch('awx.main.models.Notification.objects.filter', return_value=mock_notifications)) with apply_patches(patches): - send_notifications([1,2], job_id=1) + tasks.send_notifications([1,2], job_id=1) assert Notification.objects.filter.call_count == 1 assert mock_notifications[0].status == "successful" assert mock_notifications[0].save.called @@ -64,9 +63,64 @@ def test_run_admin_checks_usage(mocker, current_instances, call_count): patches.append(mocker.patch('awx.main.tasks.send_mail', wraps=mock_sm)) with apply_patches(patches): - run_administrative_checks() + tasks.run_administrative_checks() assert mock_sm.called if call_count == 2: assert '90%' in mock_sm.call_args_list[0][0][0] else: assert 'expire' in mock_sm.call_args_list[0][0][0] + + +def test_openstack_client_config_generation(mocker): + update = tasks.RunInventoryUpdate() + inventory_update = mocker.Mock(**{ + 'source': 'openstack', + 'credential.host': 'https://keystone.openstack.example.org', + 'credential.username': 'demo', + 'credential.password': 'secrete', + 'credential.project': 'demo-project', + 'credential.domain': None, + 'source_vars_dict': {} + }) + cloud_config = update.build_private_data(inventory_update) + cloud_credential = yaml.load(cloud_config['cloud_credential']) + assert cloud_credential['clouds'] == { + 'devstack': { + 'auth': { + 'auth_url': 'https://keystone.openstack.example.org', + 'password': 'secrete', + 'project_name': 'demo-project', + 'username': 'demo' + }, + 'private': True + } + } + + +@pytest.mark.parametrize("source,expected", [ + (False, False), (True, True) +]) +def test_openstack_client_config_generation_with_private_source_vars(mocker, source, expected): + update = tasks.RunInventoryUpdate() + inventory_update = mocker.Mock(**{ + 'source': 'openstack', + 'credential.host': 'https://keystone.openstack.example.org', + 'credential.username': 'demo', + 'credential.password': 'secrete', + 'credential.project': 'demo-project', + 'credential.domain': None, + 'source_vars_dict': {'private': source} + }) + cloud_config = update.build_private_data(inventory_update) + cloud_credential = yaml.load(cloud_config['cloud_credential']) + assert cloud_credential['clouds'] == { + 'devstack': { + 'auth': { + 'auth_url': 'https://keystone.openstack.example.org', + 'password': 'secrete', + 'project_name': 'demo-project', + 'username': 'demo' + }, + 'private': expected + } + } diff --git a/awx/main/utils/common.py b/awx/main/utils/common.py index bed0588287..5842b78db9 100644 --- a/awx/main/utils/common.py +++ b/awx/main/utils/common.py @@ -163,22 +163,24 @@ def get_awx_version(): return __version__ -def get_encryption_key_for_pk(pk, field_name): +def get_encryption_key(field_name, pk=None): ''' - Generate key for encrypted password based on instance pk and field name. + Generate key for encrypted password based on field name, + ``settings.SECRET_KEY``, and instance pk (if available). + + :param pk: (optional) the primary key of the ``awx.conf.model.Setting``; + can be omitted in situations where you're encrypting a setting + that is not database-persistent (like a read-only setting) ''' from django.conf import settings h = hashlib.sha1() h.update(settings.SECRET_KEY) - h.update(str(pk)) + if pk is not None: + h.update(str(pk)) h.update(field_name) return h.digest()[:16] -def get_encryption_key(instance, field_name): - return get_encryption_key_for_pk(instance.pk, field_name) - - def encrypt_field(instance, field_name, ask=False, subfield=None): ''' Return content of the given instance and field name encrypted. @@ -189,7 +191,7 @@ def encrypt_field(instance, field_name, ask=False, subfield=None): if not value or value.startswith('$encrypted$') or (ask and value == 'ASK'): return value value = smart_str(value) - key = get_encryption_key(instance, field_name) + key = get_encryption_key(field_name, getattr(instance, 'pk', None)) cipher = AES.new(key, AES.MODE_ECB) while len(value) % cipher.block_size != 0: value += '\x00' @@ -217,13 +219,13 @@ def decrypt_field(instance, field_name, subfield=None): value = value[subfield] if not value or not value.startswith('$encrypted$'): return value - key = get_encryption_key(instance, field_name) + key = get_encryption_key(field_name, getattr(instance, 'pk', None)) return decrypt_value(key, value) def decrypt_field_value(pk, field_name, value): - key = get_encryption_key_for_pk(pk, field_name) + key = get_encryption_key(field_name, pk) return decrypt_value(key, value) @@ -517,6 +519,10 @@ def cache_list_capabilities(page, prefetch_list, model, user): for obj in page: obj.capabilities_cache = {} + skip_models = [] + if hasattr(model, 'invalid_user_capabilities_prefetch_models'): + skip_models = model.invalid_user_capabilities_prefetch_models() + for prefetch_entry in prefetch_list: display_method = None @@ -530,19 +536,20 @@ def cache_list_capabilities(page, prefetch_list, model, user): paths = [paths] # Build the query for accessible_objects according the user & role(s) - qs_obj = None + filter_args = [] for role_path in paths: if '.' in role_path: res_path = '__'.join(role_path.split('.')[:-1]) role_type = role_path.split('.')[-1] - if qs_obj is None: - qs_obj = model.objects - parent_model = model._meta.get_field(res_path).related_model - kwargs = {'%s__in' % res_path: parent_model.accessible_objects(user, '%s_role' % role_type)} - qs_obj = qs_obj.filter(Q(**kwargs) | Q(**{'%s__isnull' % res_path: True})) + parent_model = model + for subpath in role_path.split('.')[:-1]: + parent_model = parent_model._meta.get_field(subpath).related_model + filter_args.append(Q( + Q(**{'%s__pk__in' % res_path: parent_model.accessible_pk_qs(user, '%s_role' % role_type)}) | + Q(**{'%s__isnull' % res_path: True}))) else: role_type = role_path - qs_obj = model.accessible_objects(user, '%s_role' % role_type) + filter_args.append(Q(**{'pk__in': model.accessible_pk_qs(user, '%s_role' % role_type)})) if display_method is None: # Role name translation to UI names for methods @@ -553,10 +560,13 @@ def cache_list_capabilities(page, prefetch_list, model, user): display_method = 'start' # Union that query with the list of items on page - ids_with_role = set(qs_obj.filter(pk__in=page_ids).values_list('pk', flat=True)) + filter_args.append(Q(pk__in=page_ids)) + ids_with_role = set(model.objects.filter(*filter_args).values_list('pk', flat=True)) # Save data item-by-item for obj in page: + if skip_models and obj.__class__.__name__.lower() in skip_models: + continue obj.capabilities_cache[display_method] = False if obj.pk in ids_with_role: obj.capabilities_cache[display_method] = True @@ -766,9 +776,10 @@ class OutputEventFilter(object): EVENT_DATA_RE = re.compile(r'\x1b\[K((?:[A-Za-z0-9+/=]+\x1b\[\d+D)+)\x1b\[K') - def __init__(self, fileobj=None, event_callback=None): + def __init__(self, fileobj=None, event_callback=None, raw_callback=None): self._fileobj = fileobj self._event_callback = event_callback + self._raw_callback = raw_callback self._counter = 1 self._start_line = 0 self._buffer = '' @@ -781,6 +792,8 @@ class OutputEventFilter(object): if self._fileobj: self._fileobj.write(data) self._buffer += data + if self._raw_callback: + self._raw_callback(data) while True: match = self.EVENT_DATA_RE.search(self._buffer) if not match: @@ -813,7 +826,7 @@ class OutputEventFilter(object): for stdout_chunk in stdout_chunks: event_data['counter'] = self._counter self._counter += 1 - event_data['stdout'] = stdout_chunk + event_data['stdout'] = stdout_chunk[:-2] if len(stdout_chunk) > 2 else "" n_lines = stdout_chunk.count('\n') event_data['start_line'] = self._start_line event_data['end_line'] = self._start_line + n_lines diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 9f1585c072..cbe05ae83b 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -163,8 +163,15 @@ MAX_EVENT_RES_DATA = 700000 # Note: This setting may be overridden by database settings. EVENT_STDOUT_MAX_BYTES_DISPLAY = 1024 +# The amount of time before a stdout file is expired and removed locally +# Note that this can be recreated if the stdout is downloaded +LOCAL_STDOUT_EXPIRE_TIME = 2592000 + +# The number of processes spawned by the callback receiver to process job +# events into the database JOB_EVENT_WORKERS = 4 +# The maximum size of the job event worker queue before requests are blocked JOB_EVENT_MAX_QUEUE_SIZE = 10000 # Disallow sending session cookies over insecure connections @@ -297,6 +304,7 @@ AUTH_LDAP_SERVER_URI = None # Note: This setting may be overridden by database settings. AUTH_LDAP_CONNECTION_OPTIONS = { ldap.OPT_REFERRALS: 0, + ldap.OPT_NETWORK_TIMEOUT: 30 } # Radius server settings (default to empty string to skip using Radius auth). @@ -416,6 +424,8 @@ CELERY_ROUTES = {'awx.main.tasks.run_job': {'queue': 'jobs', 'awx.main.scheduler.tasks.run_job_complete': {'queue': 'scheduler', 'routing_key': 'scheduler.job.complete'}, 'awx.main.tasks.cluster_node_heartbeat': {'queue': 'default', + 'routing_key': 'cluster.heartbeat'}, + 'awx.main.tasks.purge_old_stdout_files': {'queue': 'default', 'routing_key': 'cluster.heartbeat'}} CELERYBEAT_SCHEDULE = { @@ -435,6 +445,10 @@ CELERYBEAT_SCHEDULE = { 'task': 'awx.main.tasks.cluster_node_heartbeat', 'schedule': timedelta(seconds=60) }, + 'purge_stdout_files': { + 'task': 'awx.main.tasks.purge_old_stdout_files', + 'schedule': timedelta(days=7) + }, 'task_manager': { 'task': 'awx.main.scheduler.tasks.run_task_manager', 'schedule': timedelta(seconds=20) @@ -821,6 +835,7 @@ ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC = False # Internal API URL for use by inventory scripts and callback plugin. INTERNAL_API_URL = 'http://127.0.0.1:%s' % DEVSERVER_DEFAULT_PORT +PERSISTENT_CALLBACK_MESSAGES = True USE_CALLBACK_QUEUE = True CALLBACK_QUEUE = "callback_tasks" FACT_QUEUE = "facts" diff --git a/awx/sso/backends.py b/awx/sso/backends.py index 591b3ab988..9a37ea8bf1 100644 --- a/awx/sso/backends.py +++ b/awx/sso/backends.py @@ -5,11 +5,14 @@ import logging import uuid +import ldap + # Django from django.dispatch import receiver from django.contrib.auth.models import User from django.conf import settings as django_settings from django.core.signals import setting_changed +from django.core.exceptions import ImproperlyConfigured # django-auth-ldap from django_auth_ldap.backend import LDAPSettings as BaseLDAPSettings @@ -37,6 +40,16 @@ class LDAPSettings(BaseLDAPSettings): 'TEAM_MAP': {}, }.items()) + def __init__(self, prefix='AUTH_LDAP_', defaults={}): + super(LDAPSettings, self).__init__(prefix, defaults) + + # If a DB-backed setting is specified that wipes out the + # OPT_NETWORK_TIMEOUT, fall back to a sane default + if ldap.OPT_NETWORK_TIMEOUT not in getattr(self, 'CONNECTION_OPTIONS', {}): + options = getattr(self, 'CONNECTION_OPTIONS', {}) + options[ldap.OPT_NETWORK_TIMEOUT] = 30 + self.CONNECTION_OPTIONS = options + class LDAPBackend(BaseLDAPBackend): ''' @@ -75,7 +88,11 @@ class LDAPBackend(BaseLDAPBackend): if not feature_enabled('ldap'): logger.error("Unable to authenticate, license does not support LDAP authentication") return None - return super(LDAPBackend, self).authenticate(username, password) + try: + return super(LDAPBackend, self).authenticate(username, password) + except ImproperlyConfigured: + logger.error("Unable to authenticate, LDAP is improperly configured") + return None def get_user(self, user_id): if not self.settings.SERVER_URI: diff --git a/awx/sso/conf.py b/awx/sso/conf.py index 355e4d6af2..fa4d70f3f8 100644 --- a/awx/sso/conf.py +++ b/awx/sso/conf.py @@ -228,7 +228,7 @@ register( register( 'AUTH_LDAP_CONNECTION_OPTIONS', field_class=fields.LDAPConnectionOptionsField, - default={'OPT_REFERRALS': 0}, + default={'OPT_REFERRALS': 0, 'OPT_NETWORK_TIMEOUT': 30}, label=_('LDAP Connection Options'), help_text=_('Additional options to set for the LDAP connection. LDAP ' 'referrals are disabled by default (to prevent certain LDAP ' @@ -240,6 +240,7 @@ register( category_slug='ldap', placeholder=collections.OrderedDict([ ('OPT_REFERRALS', 0), + ('OPT_NETWORK_TIMEOUT', 30) ]), feature_required='ldap', ) @@ -270,7 +271,7 @@ register( field_class=fields.LDAPDNWithUserField, allow_blank=True, allow_null=True, - default='', + default=None, label=_('LDAP User DN Template'), help_text=_('Alternative to user search, if user DNs are all of the same ' 'format. This approach will be more efficient for user lookups than ' @@ -340,7 +341,7 @@ register( field_class=fields.LDAPDNField, allow_blank=True, allow_null=True, - default='', + default=None, label=_('LDAP Require Group'), help_text=_('Group DN required to login. If specified, user must be a member ' 'of this group to login via LDAP. If not set, everyone in LDAP ' @@ -357,7 +358,7 @@ register( field_class=fields.LDAPDNField, allow_blank=True, allow_null=True, - default='', + default=None, label=_('LDAP Deny Group'), help_text=_('Group DN denied from login. If specified, user will not be ' 'allowed to login if a member of this group. Only one deny group ' diff --git a/awx/sso/tests/__init__.py b/awx/sso/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/awx/sso/tests/functional/__init__.py b/awx/sso/tests/functional/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/awx/sso/tests/functional/test_ldap.py b/awx/sso/tests/functional/test_ldap.py new file mode 100644 index 0000000000..fcb2a8bc4b --- /dev/null +++ b/awx/sso/tests/functional/test_ldap.py @@ -0,0 +1,24 @@ +from django.test.utils import override_settings +import ldap +import pytest + +from awx.sso.backends import LDAPSettings + + +@override_settings(AUTH_LDAP_CONNECTION_OPTIONS = {ldap.OPT_NETWORK_TIMEOUT: 60}) +@pytest.mark.django_db +def test_ldap_with_custom_timeout(): + settings = LDAPSettings() + assert settings.CONNECTION_OPTIONS == { + ldap.OPT_NETWORK_TIMEOUT: 60 + } + + +@override_settings(AUTH_LDAP_CONNECTION_OPTIONS = {ldap.OPT_REFERRALS: 0}) +@pytest.mark.django_db +def test_ldap_with_missing_timeout(): + settings = LDAPSettings() + assert settings.CONNECTION_OPTIONS == { + ldap.OPT_REFERRALS: 0, + ldap.OPT_NETWORK_TIMEOUT: 30 + } diff --git a/awx/sso/tests/unit/test_ldap.py b/awx/sso/tests/unit/test_ldap.py new file mode 100644 index 0000000000..48dd3e30e2 --- /dev/null +++ b/awx/sso/tests/unit/test_ldap.py @@ -0,0 +1,21 @@ +import ldap + +from awx.sso.backends import LDAPSettings + + +def test_ldap_default_settings(mocker): + from_db = mocker.Mock(**{'order_by.return_value': []}) + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=from_db): + settings = LDAPSettings() + assert settings.ORGANIZATION_MAP == {} + assert settings.TEAM_MAP == {} + + +def test_ldap_default_network_timeout(mocker): + from_db = mocker.Mock(**{'order_by.return_value': []}) + with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=from_db): + settings = LDAPSettings() + assert settings.CONNECTION_OPTIONS == { + ldap.OPT_REFERRALS: 0, + ldap.OPT_NETWORK_TIMEOUT: 30 + } diff --git a/awx/ui/client/legacy-styles/ansible-ui.less b/awx/ui/client/legacy-styles/ansible-ui.less index a511ffa33f..c5f2e91933 100644 --- a/awx/ui/client/legacy-styles/ansible-ui.less +++ b/awx/ui/client/legacy-styles/ansible-ui.less @@ -1675,6 +1675,7 @@ tr td button i { .alert { padding: 10px; margin: 0; + word-wrap: break-word; } .alert-danger { background-color: @default-bg; @@ -2239,3 +2240,22 @@ button[disabled], html input[disabled] { cursor: not-allowed; } + +.CodeMirror--disabled .CodeMirror.cm-s-default, +.CodeMirror--disabled .CodeMirror-line { + background-color: #f6f6f6; +} + +.CodeMirror--disabled .CodeMirror-gutter.CodeMirror-lint-markers, +.CodeMirror--disabled .CodeMirror-gutter.CodeMirror-linenumbers { + background-color: #ebebeb; + color: @b7grey; +} + +.CodeMirror--disabled .CodeMirror-lines { + cursor: default; +} + +.CodeMirror--disabled .CodeMirror-cursors { + display: none; +} diff --git a/awx/ui/client/legacy-styles/lists.less b/awx/ui/client/legacy-styles/lists.less index 351bf3988b..eb0a50529b 100644 --- a/awx/ui/client/legacy-styles/lists.less +++ b/awx/ui/client/legacy-styles/lists.less @@ -167,7 +167,7 @@ table, tbody { } .List-auxActionStream { - width: 175px; + width: 200px; } .List-action:not(.ng-hide) ~ .List-action:not(.ng-hide) { diff --git a/awx/ui/client/src/about/about.route.js b/awx/ui/client/src/about/about.route.js index 475cf1aea0..639c5ee975 100644 --- a/awx/ui/client/src/about/about.route.js +++ b/awx/ui/client/src/about/about.route.js @@ -1,12 +1,13 @@ import {templateUrl} from '../shared/template-url/template-url.factory'; import controller from './about.controller'; +import { N_ } from '../i18n'; export default { name: 'setup.about', route: '/about', controller: controller, ncyBreadcrumb: { - label: "ABOUT" + label: N_("ABOUT") }, onExit: function(){ // hacky way to handle user browsing away via URL bar diff --git a/awx/ui/client/src/access/add-rbac-resource/rbac-resource.partial.html b/awx/ui/client/src/access/add-rbac-resource/rbac-resource.partial.html index 5cd8e19b1e..c9ca9c5e51 100644 --- a/awx/ui/client/src/access/add-rbac-resource/rbac-resource.partial.html +++ b/awx/ui/client/src/access/add-rbac-resource/rbac-resource.partial.html @@ -23,10 +23,10 @@ 1 -
+
Please select Users / Teams from the lists below.
-
+
Please select Users from the list below.
@@ -34,12 +34,12 @@
+ ng-class="{'is-selected': usersSelected }" translate> Users
+ ng-class="{'is-selected': teamsSelected }" translate> Teams
@@ -59,7 +59,7 @@ 2 - Please assign roles to the selected users/teams + Please assign roles to the selected users/teams
diff --git a/awx/ui/client/src/access/add-rbac-user-team/rbac-user-team.partial.html b/awx/ui/client/src/access/add-rbac-user-team/rbac-user-team.partial.html index bc30eff1b7..f162e28c58 100644 --- a/awx/ui/client/src/access/add-rbac-user-team/rbac-user-team.partial.html +++ b/awx/ui/client/src/access/add-rbac-user-team/rbac-user-team.partial.html @@ -26,7 +26,7 @@ 1 -
+
Please select resources from the lists below.
@@ -34,30 +34,30 @@
+ ng-class="{'is-selected': tab.job_templates }" translate> Job Templates
+ translate> Workflow Templates
+ ng-class="{'is-selected': tab.projects }" translate> Projects
+ translate> Inventories
+ translate> Credentials
@@ -86,10 +86,10 @@ 2 - Please assign roles to the selected resources + Please assign roles to the selected resources
+ ng-click="toggleKeyPane()" translate> Key
@@ -97,34 +97,34 @@
+ ng-show="showSection2Tab('job_templates')" translate> Job Templates
+ ng-show="showSection2Tab('workflow_templates')" translate> Workflow Templates
+ translate> Projects
+ translate> Inventories
+ translate> Credentials
@@ -170,13 +170,13 @@
diff --git a/awx/ui/client/src/access/main.js b/awx/ui/client/src/access/main.js index eedfe0db8c..1da571b524 100644 --- a/awx/ui/client/src/access/main.js +++ b/awx/ui/client/src/access/main.js @@ -7,10 +7,12 @@ import roleList from './rbac-role-column/roleList.directive'; import addRbacResource from './add-rbac-resource/main'; import addRbacUserTeam from './add-rbac-user-team/main'; +import permissionsList from './permissions-list.controller'; export default angular.module('RbacModule', [ addRbacResource.name, addRbacUserTeam.name ]) + .controller('PermissionsList', permissionsList) .directive('roleList', roleList); diff --git a/awx/ui/client/src/access/permissions-list.controller.js b/awx/ui/client/src/access/permissions-list.controller.js new file mode 100644 index 0000000000..2bd40eb59f --- /dev/null +++ b/awx/ui/client/src/access/permissions-list.controller.js @@ -0,0 +1,82 @@ +/************************************************* + * Copyright (c) 2016 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +export default ['$scope', 'ListDefinition', 'Dataset', 'Wait', 'Rest', 'ProcessErrors', 'Prompt', '$state', + function($scope, list, Dataset, Wait, Rest, ProcessErrors, Prompt, $state) { + + init(); + + function init() { + $scope.list = list; + $scope[`${list.iterator}_dataset`] = Dataset.data; + $scope[`${list.iterator}s`] = $scope[`${list.iterator}_dataset`].results; + } + + $scope.deletePermissionFromUser = function(userId, userName, roleName, roleType, url) { + var action = function() { + $('#prompt-modal').modal('hide'); + Wait('start'); + Rest.setUrl(url); + Rest.post({ "disassociate": true, "id": userId }) + .success(function() { + Wait('stop'); + $state.go('.', null, {reload: true}); + }) + .error(function(data, status) { + ProcessErrors($scope, data, status, null, { + hdr: 'Error!', + msg: 'Could not disassociate user from role. Call to ' + url + ' failed. DELETE returned status: ' + status + }); + }); + }; + + Prompt({ + hdr: `Remove role`, + body: ` +
+ Confirm the removal of the ${roleType} + ${roleName} + role associated with ${userName}. +
+ `, + action: action, + actionText: 'REMOVE' + }); + }; + + $scope.deletePermissionFromTeam = function(teamId, teamName, roleName, roleType, url) { + var action = function() { + $('#prompt-modal').modal('hide'); + Wait('start'); + Rest.setUrl(url); + Rest.post({ "disassociate": true, "id": teamId }) + .success(function() { + Wait('stop'); + $state.go('.', null, {reload: true}); + }) + .error(function(data, status) { + ProcessErrors($scope, data, status, null, { + hdr: 'Error!', + msg: 'Could not disassociate team from role. Call to ' + url + ' failed. DELETE returned status: ' + status + }); + }); + }; + + Prompt({ + hdr: `Remove role`, + body: ` +
+ Confirm the removal of the ${roleType} + ${roleName} + role associated with the ${teamName} team. +
+ `, + action: action, + actionText: 'REMOVE' + }); + }; + } +]; diff --git a/awx/ui/client/src/access/rbac-multiselect/permissionsTeams.list.js b/awx/ui/client/src/access/rbac-multiselect/permissionsTeams.list.js index 8986478e85..dd05b4b0cc 100644 --- a/awx/ui/client/src/access/rbac-multiselect/permissionsTeams.list.js +++ b/awx/ui/client/src/access/rbac-multiselect/permissionsTeams.list.js @@ -5,7 +5,7 @@ *************************************************/ - export default function() { + export default ['i18n', function(i18n) { return { searchSize: 'col-lg-12 col-md-12 col-sm-12 col-xs-12', name: 'teams', @@ -15,19 +15,20 @@ multiSelectExtended: true, index: false, hover: true, - emptyListText : 'No Teams exist', + emptyListText : i18n._('No Teams exist'), fields: { name: { key: true, - label: 'name' + label: i18n._('name') }, organization: { - label: 'organization', + label: i18n._('organization'), ngBind: 'team.summary_fields.organization.name', sourceModel: 'organization', - sourceField: 'name' + sourceField: 'name', + searchable: true } } }; -} +}]; diff --git a/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js b/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js index 58a5605281..9769df3506 100644 --- a/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js +++ b/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js @@ -5,7 +5,7 @@ *************************************************/ - export default function() { + export default ['i18n', function(i18n) { return { name: 'users', iterator: 'user', @@ -21,22 +21,22 @@ multiSelectExtended: true, index: false, hover: true, - emptyListText : 'No Users exist', + emptyListText : i18n._('No Users exist'), fields: { first_name: { - label: 'First Name', + label: i18n._('First Name'), columnClass: 'col-md-3 col-sm-3 hidden-xs' }, last_name: { - label: 'Last Name', + label: i18n._('Last Name'), columnClass: 'col-md-3 col-sm-3 hidden-xs' }, username: { key: true, - label: 'Username', + label: i18n._('Username'), columnClass: 'col-md-5 col-sm-5 col-xs-11' }, }, }; -} +}]; diff --git a/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js b/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js index 2f0d790317..b775dedaca 100644 --- a/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js +++ b/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js @@ -59,6 +59,7 @@ export default ['addPermissionsTeamsList', 'addPermissionsUsersList', 'TemplateL case 'JobTemplates': list.name = 'job_templates'; list.iterator = 'job_template'; + list.basePath = 'job_templates'; list.fields = { name: list.fields.name, description: list.fields.description diff --git a/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js b/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js index 99e3a1d8ed..f5276dbc12 100644 --- a/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js +++ b/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js @@ -8,7 +8,8 @@ export default [ 'CreateSelect2', - function(CreateSelect2) { + 'i18n', + function(CreateSelect2, i18n) { return { restrict: 'E', scope: { @@ -21,7 +22,7 @@ export default CreateSelect2({ element: '.roleSelect2', multiple: true, - placeholder: 'Select roles' + placeholder: i18n._('Select roles') }); } }; diff --git a/awx/ui/client/src/access/rbac-role-column/roleList.partial.html b/awx/ui/client/src/access/rbac-role-column/roleList.partial.html index 799edbb408..a4b93d930f 100644 --- a/awx/ui/client/src/access/rbac-role-column/roleList.partial.html +++ b/awx/ui/client/src/access/rbac-role-column/roleList.partial.html @@ -9,8 +9,16 @@
+ aw-tool-tip='
Organization: {{ entry.team_organization_name | sanitize }}
Team: {{entry.team_name | sanitize}}
' aw-tip-placement='bottom' + ng-if="entry.team_id"> {{ entry.name }}
+ +
+ {{ entry.name }} +
diff --git a/awx/ui/client/src/activity-stream/activitystream.route.js b/awx/ui/client/src/activity-stream/activitystream.route.js index 73877d5f1b..5b99ce55bd 100644 --- a/awx/ui/client/src/activity-stream/activitystream.route.js +++ b/awx/ui/client/src/activity-stream/activitystream.route.js @@ -4,6 +4,8 @@ * All Rights Reserved *************************************************/ + import { N_ } from '../i18n'; + export default { name: 'activityStream', route: '/activity_stream?target&id', @@ -22,7 +24,7 @@ export default { } }, ncyBreadcrumb: { - label: "ACTIVITY STREAM" + label: N_("ACTIVITY STREAM") }, onExit: function() { $('#stream-detail-modal').modal('hide'); diff --git a/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html b/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html index 67e4452ebc..9735fd6e17 100644 --- a/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html +++ b/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html @@ -9,15 +9,15 @@ diff --git a/awx/ui/client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js b/awx/ui/client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js index dc6c4a819d..fb90dccafe 100644 --- a/awx/ui/client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js +++ b/awx/ui/client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js @@ -4,7 +4,7 @@ * All Rights Reserved *************************************************/ -export default ['templateUrl', function(templateUrl) { +export default ['templateUrl', 'i18n', function(templateUrl, i18n) { return { restrict: 'E', scope: true, @@ -12,21 +12,27 @@ export default ['templateUrl', function(templateUrl) { templateUrl: templateUrl('activity-stream/streamDropdownNav/stream-dropdown-nav'), controller: ['$scope', '$state', '$stateParams','CreateSelect2', function($scope, $state, $stateParams, CreateSelect2) { - $scope.streamTarget = ($state.params && $state.params.target) ? $state.params.target : 'dashboard'; + if($state.params && $state.params.target) { + $scope.streamTarget = ($state.params.target === 'job_template' || $state.params.target === 'workflow_job_template') ? 'template' : $state.params.target; + } + else { + $scope.streamTarget = 'dashboard'; + } $scope.options = [ - {label: 'All Activity', value: 'dashboard'}, - {label: 'Credentials', value: 'credential'}, - {label: 'Hosts', value: 'host'}, - {label: 'Inventories', value: 'inventory'}, - {label: 'Inventory Scripts', value: 'inventory_script'}, - {label: 'Jobs', value: 'job'}, - {label: 'Organizations', value: 'organization'}, - {label: 'Projects', value: 'project'}, - {label: 'Schedules', value: 'schedule'}, - {label: 'Teams', value: 'team'}, - {label: 'Templates', value: 'template'}, - {label: 'Users', value: 'user'} + {label: i18n._('All Activity'), value: 'dashboard'}, + {label: i18n._('Credentials'), value: 'credential'}, + {label: i18n._('Hosts'), value: 'host'}, + {label: i18n._('Inventories'), value: 'inventory'}, + {label: i18n._('Inventory Scripts'), value: 'custom_inventory_script'}, + {label: i18n._('Jobs'), value: 'job'}, + {label: i18n._('Notification Templates'), value: 'notification_template'}, + {label: i18n._('Organizations'), value: 'organization'}, + {label: i18n._('Projects'), value: 'project'}, + {label: i18n._('Schedules'), value: 'schedule'}, + {label: i18n._('Teams'), value: 'team'}, + {label: i18n._('Templates'), value: 'template'}, + {label: i18n._('Users'), value: 'user'} ]; CreateSelect2({ @@ -40,12 +46,14 @@ export default ['templateUrl', function(templateUrl) { $state.go('activityStream', {target: null, activity_search: {page_size:"20", order_by: '-timestamp'}}); } else { - let search = _.merge($stateParams.activity_search, { + let search = { or__object1__in: $scope.streamTarget && $scope.streamTarget === 'template' ? 'job_template,workflow_job_template' : $scope.streamTarget, - or__object2__in: $scope.streamTarget && $scope.streamTarget === 'template' ? 'job_template,workflow_job_template' : $scope.streamTarget - }); + or__object2__in: $scope.streamTarget && $scope.streamTarget === 'template' ? 'job_template,workflow_job_template' : $scope.streamTarget, + page_size: '20', + order_by: '-timestamp' + }; // Attach the taget to the query parameters - $state.go('activityStream', {target: $scope.streamTarget, activity_search: search}); + $state.go('activityStream', {target: $scope.streamTarget, id: null, activity_search: search}); } }; diff --git a/awx/ui/client/src/app.js b/awx/ui/client/src/app.js index 577ce739b8..70efcfa1c8 100644 --- a/awx/ui/client/src/app.js +++ b/awx/ui/client/src/app.js @@ -44,7 +44,6 @@ import './filters'; import { Home } from './controllers/Home'; import { SocketsController } from './controllers/Sockets'; import { CredentialsAdd, CredentialsEdit, CredentialsList } from './controllers/Credentials'; -import { JobsListController } from './controllers/Jobs'; import portalMode from './portal-mode/main'; import systemTracking from './system-tracking/main'; import inventories from './inventories/main'; @@ -70,6 +69,7 @@ import activityStream from './activity-stream/main'; import standardOut from './standard-out/main'; import Templates from './templates/main'; import credentials from './credentials/main'; +import jobs from './jobs/main'; import { ProjectsList, ProjectsAdd, ProjectsEdit } from './controllers/Projects'; import { UsersList, UsersAdd, UsersEdit } from './controllers/Users'; import { TeamsList, TeamsAdd, TeamsEdit } from './controllers/Teams'; @@ -99,6 +99,8 @@ var tower = angular.module('Tower', [ require('angular-tz-extensions'), require('lr-infinite-scroll'), require('ng-toast'), + 'gettext', + 'I18N', uiRouter, 'ui.router.state.events', @@ -132,6 +134,7 @@ var tower = angular.module('Tower', [ portalMode.name, config.name, credentials.name, + jobs.name, //'templates', 'Utilities', 'OrganizationFormDefinition', @@ -201,8 +204,6 @@ var tower = angular.module('Tower', [ scheduler.name, 'ApiModelHelper', 'ActivityStreamHelper', - 'gettext', - 'I18N', 'WorkflowFormDefinition', 'InventorySourcesListDefinition', 'WorkflowMakerFormDefinition' @@ -290,6 +291,9 @@ var tower = angular.module('Tower', [ "jobs": ["status_changed"] } } + }, + ncyBreadcrumb: { + label: N_('PROJECTS') } }) }); @@ -371,12 +375,12 @@ var tower = angular.module('Tower', [ 'CheckLicense', '$location', 'Authorization', 'LoadBasePaths', 'Timer', 'ClearScope', 'LoadConfig', 'Store', 'pendoService', 'Prompt', 'Rest', 'Wait', 'ProcessErrors', '$state', 'GetBasePath', 'ConfigService', - 'FeaturesService', '$filter', 'SocketService', 'I18NInit', + 'FeaturesService', '$filter', 'SocketService', function($stateExtender, $q, $compile, $cookieStore, $rootScope, $log, $stateParams, CheckLicense, $location, Authorization, LoadBasePaths, Timer, ClearScope, LoadConfig, Store, pendoService, Prompt, Rest, Wait, ProcessErrors, $state, GetBasePath, ConfigService, FeaturesService, - $filter, SocketService, I18NInit) { + $filter, SocketService) { $rootScope.$state = $state; $rootScope.$state.matches = function(stateName) { @@ -388,7 +392,6 @@ var tower = angular.module('Tower', [ $log.debug(`$state.defaultErrorHandler: ${error}`); }); - I18NInit(); $stateExtender.addState({ name: 'dashboard', url: '/home', @@ -420,53 +423,6 @@ var tower = angular.module('Tower', [ } }); - $stateExtender.addState({ - searchPrefix: 'job', - name: 'jobs', - url: '/jobs', - ncyBreadcrumb: { - label: N_("JOBS") - }, - params: { - job_search: { - value: { - not__launch_type: 'sync', - order_by: '-finished' - }, - squash: '' - } - }, - data: { - socket: { - "groups": { - "jobs": ["status_changed"], - "schedules": ["changed"] - } - } - }, - resolve: { - Dataset: ['AllJobsList', 'QuerySet', '$stateParams', 'GetBasePath', (list, qs, $stateParams, GetBasePath) => { - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - return qs.search(path, $stateParams[`${list.iterator}_search`]); - }] - }, - views: { - '@': { - templateUrl: urlPrefix + 'partials/jobs.html', - }, - 'list@jobs': { - templateProvider: function(AllJobsList, generateList) { - let html = generateList.build({ - list: AllJobsList, - mode: 'edit' - }); - return html; - }, - controller: JobsListController - } - } - }); - $stateExtender.addState({ name: 'userCredentials', url: '/users/:user_id/credentials', @@ -498,70 +454,6 @@ var tower = angular.module('Tower', [ } }); - $rootScope.deletePermissionFromUser = function(userId, userName, roleName, roleType, url) { - var action = function() { - $('#prompt-modal').modal('hide'); - Wait('start'); - Rest.setUrl(url); - Rest.post({ "disassociate": true, "id": userId }) - .success(function() { - Wait('stop'); - $rootScope.$broadcast("refreshList", "permission"); - }) - .error(function(data, status) { - ProcessErrors($rootScope, data, status, null, { - hdr: 'Error!', - msg: 'Could not disassociate user from role. Call to ' + url + ' failed. DELETE returned status: ' + status - }); - }); - }; - - Prompt({ - hdr: `Remove role`, - body: ` -
- Confirm the removal of the ${roleType} - ${roleName} - role associated with ${userName}. -
- `, - action: action, - actionText: 'REMOVE' - }); - }; - - $rootScope.deletePermissionFromTeam = function(teamId, teamName, roleName, roleType, url) { - var action = function() { - $('#prompt-modal').modal('hide'); - Wait('start'); - Rest.setUrl(url); - Rest.post({ "disassociate": true, "id": teamId }) - .success(function() { - Wait('stop'); - $rootScope.$broadcast("refreshList", "role"); - }) - .error(function(data, status) { - ProcessErrors($rootScope, data, status, null, { - hdr: 'Error!', - msg: 'Could not disassociate team from role. Call to ' + url + ' failed. DELETE returned status: ' + status - }); - }); - }; - - Prompt({ - hdr: `Remove role`, - body: ` -
- Confirm the removal of the ${roleType} - ${roleName} - role associated with the ${teamName} team. -
- `, - action: action, - actionText: 'REMOVE' - }); - }; - function activateTab() { // Make the correct tab active var base = $location.path().replace(/^\//, '').split('/')[0]; diff --git a/awx/ui/client/src/bread-crumb/bread-crumb.block.less b/awx/ui/client/src/bread-crumb/bread-crumb.block.less index e0abee7832..e2254f6fa2 100644 --- a/awx/ui/client/src/bread-crumb/bread-crumb.block.less +++ b/awx/ui/client/src/bread-crumb/bread-crumb.block.less @@ -73,6 +73,10 @@ vertical-align: bottom; } +.BreadCrumb-invItem { + max-width: 400px; +} + .BreadCrumb-item + .BreadCrumb-item:before { content: "/"; padding: 0 5px; diff --git a/awx/ui/client/src/bread-crumb/bread-crumb.directive.js b/awx/ui/client/src/bread-crumb/bread-crumb.directive.js index 3c64a0b701..0bbe13ccd3 100644 --- a/awx/ui/client/src/bread-crumb/bread-crumb.directive.js +++ b/awx/ui/client/src/bread-crumb/bread-crumb.directive.js @@ -1,6 +1,6 @@ export default - ['templateUrl', '$state', 'FeaturesService', 'ProcessErrors','$rootScope', 'Store', 'Empty', '$window', 'BreadCrumbService', - function(templateUrl, $state, FeaturesService, ProcessErrors, $rootScope, Store, Empty, $window, BreadCrumbService) { + ['templateUrl', '$state', 'FeaturesService', 'ProcessErrors','$rootScope', 'Store', 'Empty', '$window', 'BreadCrumbService', 'i18n', + function(templateUrl, $state, FeaturesService, ProcessErrors, $rootScope, Store, Empty, $window, BreadCrumbService, i18n) { return { restrict: 'E', templateUrl: templateUrl('bread-crumb/bread-crumb'), @@ -41,9 +41,10 @@ export default if(streamConfig && streamConfig.activityStream) { if(streamConfig.activityStreamTarget) { stateGoParams.target = streamConfig.activityStreamTarget; + let isTemplateTarget = _.contains(['template', 'job_template', 'workflow_job_template'], streamConfig.activityStreamTarget); stateGoParams.activity_search = { - or__object1__in: streamConfig.activityStreamTarget === 'template' ? 'job_template,workflow_job_template' : streamConfig.activityStreamTarget, - or__object2__in: streamConfig.activityStreamTarget === 'template' ? 'job_template,workflow_job_template' : streamConfig.activityStreamTarget, + or__object1__in: isTemplateTarget ? 'job_template,workflow_job_template' : streamConfig.activityStreamTarget, + or__object2__in: isTemplateTarget ? 'job_template,workflow_job_template' : streamConfig.activityStreamTarget, order_by: '-timestamp', page_size: '20', }; @@ -60,6 +61,10 @@ export default if(streamConfig.activityStreamId) { stateGoParams.id = $state.params[streamConfig.activityStreamId]; } + if(stateGoParams.target === "custom_inventory_script"){ + stateGoParams.activity_search[streamConfig.activityStreamTarget] = $state.params.inventory_script_id; + stateGoParams.id = $state.params.inventory_script_id; + } } originalRoute = $state.current; @@ -103,7 +108,7 @@ export default if(features){ scope.loadingLicense = false; scope.activityStreamActive = (toState.name === 'activityStream') ? true : false; - scope.activityStreamTooltip = (toState.name === 'activityStream') ? 'Hide Activity Stream' : 'View Activity Stream'; + scope.activityStreamTooltip = (toState.name === 'activityStream') ? i18n._('Hide Activity Stream') : i18n._('View Activity Stream'); scope.showActivityStreamButton = (FeaturesService.featureEnabled('activity_streams') || toState.name ==='activityStream') ? true : false; } } diff --git a/awx/ui/client/src/configuration/auth-form/configuration-auth.controller.js b/awx/ui/client/src/configuration/auth-form/configuration-auth.controller.js index 8098172162..07c5cc8a0b 100644 --- a/awx/ui/client/src/configuration/auth-form/configuration-auth.controller.js +++ b/awx/ui/client/src/configuration/auth-form/configuration-auth.controller.js @@ -174,6 +174,7 @@ export default [ ngDisabled: $rootScope.user_is_system_auditor, disabled: $scope.$parent.configDataResolve[key].disabled || null, readonly: $scope.$parent.configDataResolve[key].readonly || null, + definedInFile: $scope.$parent.configDataResolve[key].defined_in_file || null }); } diff --git a/awx/ui/client/src/configuration/auth-form/configuration-auth.partial.html b/awx/ui/client/src/configuration/auth-form/configuration-auth.partial.html index 71192e17c6..8004975a34 100644 --- a/awx/ui/client/src/configuration/auth-form/configuration-auth.partial.html +++ b/awx/ui/client/src/configuration/auth-form/configuration-auth.partial.html @@ -1,6 +1,6 @@
-
Sub Category
+
Sub Category
@@ -173,10 +173,10 @@ @@ -194,8 +194,8 @@
- - + +
@@ -205,9 +205,9 @@ - - - + + +
PlaysStartedElapsedPlaysStartedElapsed
@@ -242,7 +242,7 @@
-
2 Please select a task below to view its associated hosts
+
2 Please select a task below to view its associated hosts
@@ -253,8 +253,8 @@
- - + +
@@ -263,10 +263,10 @@ - - - - + + + +
TasksStartedElapsedTasksStartedElapsed
@@ -304,19 +304,19 @@ {{ task.missingCount }}
- No matching hosts. + No matching hosts.
- Waiting... + Waiting... - Loading... + Loading... - No matching tasks + No matching tasks @@ -337,8 +337,8 @@
- - + +
@@ -346,9 +346,9 @@ - - - + + +
HostsItemMessageHostsItemMessage
@@ -365,13 +365,13 @@ {{ result.msg }} - Waiting... + Waiting... - Loading... + Loading... - No matching host events + No matching host events @@ -388,10 +388,10 @@ @@ -411,13 +411,13 @@
-
STANDARD OUT
+
STANDARD OUT
- - diff --git a/awx/ui/client/src/job-results/host-status-bar/host-status-bar.directive.js b/awx/ui/client/src/job-results/host-status-bar/host-status-bar.directive.js index 778d238e47..5a8b5b3206 100644 --- a/awx/ui/client/src/job-results/host-status-bar/host-status-bar.directive.js +++ b/awx/ui/client/src/job-results/host-status-bar/host-status-bar.directive.js @@ -33,7 +33,7 @@ export default [ 'templateUrl', // if there are any hosts that have finished, don't // show default grey bar - scope.hostsFinished = (Object + scope.hasCount = (Object .keys(val) .filter(key => (val[key] > 0)).length > 0); } diff --git a/awx/ui/client/src/job-results/host-status-bar/host-status-bar.partial.html b/awx/ui/client/src/job-results/host-status-bar/host-status-bar.partial.html index 2d860cc2e6..a8854b6d09 100644 --- a/awx/ui/client/src/job-results/host-status-bar/host-status-bar.partial.html +++ b/awx/ui/client/src/job-results/host-status-bar/host-status-bar.partial.html @@ -21,6 +21,10 @@ data-tip-watch="skippedCountTip">
+
diff --git a/awx/ui/client/src/job-results/job-results-stdout/job-results-stdout.partial.html b/awx/ui/client/src/job-results/job-results-stdout/job-results-stdout.partial.html index b0b3d85f10..c283d578f7 100644 --- a/awx/ui/client/src/job-results/job-results-stdout/job-results-stdout.partial.html +++ b/awx/ui/client/src/job-results/job-results-stdout/job-results-stdout.partial.html @@ -44,6 +44,9 @@
Too much previous output to display. Showing running standard output.
+ +
-1) { - // put non-duplicate lines into the standard - // out pane where they should go (within the - // right header section, before the next line - // as indicated by start_line) - window.$ = $; - var putIn; - var classList = $("div", - "
"+mungedEvent.stdout+"
") - .attr("class").split(" "); - if (classList - .filter(v => v.indexOf("task_") > -1) - .length) { - putIn = classList - .filter(v => v.indexOf("task_") > -1)[0]; - } else if(classList - .filter(v => v.indexOf("play_") > -1) - .length) { - putIn = classList - .filter(v => v.indexOf("play_") > -1)[0]; + // let's see if we have a specific place to put it in + // the pane + let $prevElem = $(`.next_is_${mungedEvent.start_line}`); + if ($prevElem && $prevElem.length) { + // if so, put it there + $(`.next_is_${mungedEvent.start_line}`) + .after($compile(mungedEvent + .stdout)($scope.events[mungedEvent + .counter])); + } else if (mungedEvent.stdout.indexOf("not_skeleton") > -1) { + var putIn; + var classList = $("div", + "
"+mungedEvent.stdout+"
") + .attr("class").split(" "); + if (classList + .filter(v => v.indexOf("task_") > -1) + .length) { + putIn = classList + .filter(v => v.indexOf("task_") > -1)[0]; + } else if(classList + .filter(v => v.indexOf("play_") > -1) + .length) { + putIn = classList + .filter(v => v.indexOf("play_") > -1)[0]; + } + + var putAfter; + var isDup = false; + $(".header_" + putIn + ",." + putIn) + .each((i, v) => { + if (angular.element(v).scope() + .event.start_line < mungedEvent + .start_line) { + putAfter = v; + } else if (angular.element(v).scope() + .event.start_line === mungedEvent + .start_line) { + isDup = true; + return false; + } else if (angular.element(v).scope() + .event.start_line > mungedEvent + .start_line) { + return false; + } else { + appendToBottom(mungedEvent); + } + }); + + if (!isDup) { + $(putAfter).after($compile(mungedEvent + .stdout)($scope.events[mungedEvent + .counter])); + } + + + classList = null; + putIn = null; } else { appendToBottom(mungedEvent); } - var putAfter; - var isDup = false; - $(".header_" + putIn + ",." + putIn) - .each((i, v) => { - if (angular.element(v).scope() - .event.start_line < mungedEvent - .start_line) { - putAfter = v; - } else if (angular.element(v).scope() - .event.start_line === mungedEvent - .start_line) { - isDup = true; - return false; - } else if (angular.element(v).scope() - .event.start_line > mungedEvent - .start_line) { - return false; - } - }); - - if (!isDup) { - $(putAfter).after($compile(mungedEvent - .stdout)($scope.events[mungedEvent - .counter])); - } - - - classList = null; - putIn = null; - } else { - appendToBottom(mungedEvent); + // delete ref to the elem because it might leak scope + // if you don't + $prevElem = null; } // move the followAnchor to the bottom of the @@ -453,7 +469,7 @@ function(jobData, jobDataOptions, jobLabels, jobFinished, count, $scope, ParseTy }; $scope.stdoutContainerAvailable.promise.then(() => { - getSkeleton(jobData.related.job_events + "?order_by=id&or__event__in=playbook_on_start,playbook_on_play_start,playbook_on_task_start,playbook_on_stats"); + getSkeleton(jobData.related.job_events + "?order_by=start_line&or__event__in=playbook_on_start,playbook_on_play_start,playbook_on_task_start,playbook_on_stats"); }); var getEvents; @@ -567,10 +583,24 @@ function(jobData, jobDataOptions, jobLabels, jobFinished, count, $scope, ParseTy } })); + var buffer = []; + var processBuffer = function() { + buffer.forEach((event, i) => { + processEvent(event); + buffer.splice(i, 1); + }); + }; + + var bufferInterval; // Processing of job_events messages from the websocket toDestroy.push($scope.$on(`ws-job_events-${$scope.job.id}`, function(e, data) { + if (!bufferInterval) { + bufferInterval = setInterval(function(){ + processBuffer(); + }, 500); + } // use the lowest counter coming over the socket to retrigger pull data // to only be for stuff lower than that id @@ -597,6 +627,7 @@ function(jobData, jobDataOptions, jobLabels, jobFinished, count, $scope, ParseTy } else if (data.event_name === "playbook_on_task_start") { $scope.taskCount++; } + buffer.push(data); processEvent(data); }); })); @@ -607,15 +638,21 @@ function(jobData, jobDataOptions, jobLabels, jobFinished, count, $scope, ParseTy parseInt($scope.job.id,10)) { // controller is defined, so set the job_status $scope.job_status = data.status; - if (data.status === "successful" || + if (data.status === "running") { + runTimeElapsedTimer = workflowResultsService.createOneSecondTimer(moment(), updateJobElapsedTimer); + } else if (data.status === "successful" || data.status === "failed" || data.status === "error" || data.status === "canceled") { - clearInterval(elapsedInterval); + workflowResultsService.destroyTimer(runTimeElapsedTimer); + if (bufferInterval) { + clearInterval(bufferInterval); + } // When the fob is finished retrieve the job data to // correct anything that was out of sync from the job run jobResultsService.getJobData($scope.job.id).then(function(data){ $scope.job = data; + $scope.jobFinished = true; }); } } else if (parseInt(data.project_id, 10) === @@ -642,7 +679,10 @@ function(jobData, jobDataOptions, jobLabels, jobFinished, count, $scope, ParseTy $scope.events[v] = null; }); $scope.events = {}; - clearInterval(elapsedInterval); + workflowResultsService.destroyTimer(runTimeElapsedTimer); + if (bufferInterval) { + clearInterval(bufferInterval); + } toDestroy.forEach(closureFunc => closureFunc()); }); }]; diff --git a/awx/ui/client/src/job-results/job-results.partial.html b/awx/ui/client/src/job-results/job-results.partial.html index 016f3e745b..e48174311d 100644 --- a/awx/ui/client/src/job-results/job-results.partial.html +++ b/awx/ui/client/src/job-results/job-results.partial.html @@ -226,7 +226,7 @@
{ - if (!hosts[host]) { - // host has not been added to hosts object - // add now - hosts[host] = {}; - } - - hosts[host][key] = event_data[key][host]; - }); - } else { + if (key === "changed" || + key === "dark" || + key === "failures" || + key === "ok" || + key === "skipped") { // array of hosts from each type ("changed", "dark", etc.) hostsArr = Object.keys(event_data[key]); hostsArr.forEach(host => { @@ -61,7 +53,7 @@ function ($q, Prompt, $filter, Wait, Rest, $state, ProcessErrors, InitiatePlaybo return o.dark > 0; }), failures : _.filter(hosts, function(o){ - return o.failed === true; + return o.failures > 0; }), changed : _.filter(hosts, function(o){ return o.changed > 0; diff --git a/awx/ui/client/src/job-results/parse-stdout.service.js b/awx/ui/client/src/job-results/parse-stdout.service.js index 20cb46f3c0..b8830d07a9 100644 --- a/awx/ui/client/src/job-results/parse-stdout.service.js +++ b/awx/ui/client/src/job-results/parse-stdout.service.js @@ -78,6 +78,12 @@ export default ['$log', 'moment', function($log, moment){ // .JobResultsStdOut-aLineOfStdOut element getLineClasses: function(event, line, lineNum) { var string = ""; + + if (lineNum === event.end_line) { + // used to tell you where to put stuff in the pane + string += ` next_is_${event.end_line + 1}`; + } + if (event.event_name === "playbook_on_play_start") { // play header classes string += " header_play"; @@ -196,6 +202,11 @@ export default ['$log', 'moment', function($log, moment){ let lineNums = _.range(event.start_line + 1, event.end_line + 1); + // hack around no-carriage return issues + if (!lineNums.length) { + lineNums = [event.start_line + 1]; + } + let lines = event.stdout .replace("\t", " ") .split("\r\n"); @@ -204,10 +215,15 @@ export default ['$log', 'moment', function($log, moment){ let padBy = lineNums.length - lines.length; for (let i = 0; i <= padBy; i++) { - lines.push("[1;imLine capped.[0m"); + lines.push(""); } } + // hack around no-carriage return issues + if (lineNums.length === lines.length) { + return _.zip(lineNums, lines); + } + return _.zip(lineNums, lines).slice(0, -1); }, // public function that provides the parsed stdout line, given a diff --git a/awx/ui/client/src/job-submission/job-submission-factories/launchjob.factory.js b/awx/ui/client/src/job-submission/job-submission-factories/launchjob.factory.js index 64c9344b19..d49b4e521d 100644 --- a/awx/ui/client/src/job-submission/job-submission-factories/launchjob.factory.js +++ b/awx/ui/client/src/job-submission/job-submission-factories/launchjob.factory.js @@ -1,6 +1,6 @@ export default - function LaunchJob(Rest, Wait, ProcessErrors, ToJSON, Empty, GetBasePath, $state, $location, $rootScope) { + function LaunchJob(Rest, Wait, ProcessErrors, ToJSON, Empty, GetBasePath, $state, $location, $rootScope, i18n) { // This factory gathers up all the job launch data and POST's it. @@ -163,8 +163,10 @@ export default } }) .error(function(data, status) { - ProcessErrors(scope, data, status, null, { hdr: 'Error!', - msg: 'Failed updating job ' + scope.job_template_id + ' with variables. POST returned: ' + status }); + let template_id = scope.job_template_id; + template_id = (template_id === undefined) ? "undefined" : i18n.sprintf("%d", template_id); + ProcessErrors(scope, data, status, null, { hdr: i18n._('Error!'), + msg: i18n.sprintf(i18n._('Failed updating job %s with variables. POST returned: %d'), template_id, status) }); }); }; @@ -182,8 +184,8 @@ export default buildData(); }) .error(function (data, status) { - ProcessErrors(scope, data, status, { hdr: 'Error!', - msg: 'Failed to retrieve job template extra variables.' }); + ProcessErrors(scope, data, status, { hdr: i18n._('Error!'), + msg: i18n._('Failed to retrieve job template extra variables.') }); }); }; @@ -209,5 +211,6 @@ LaunchJob.$inject = 'GetBasePath', '$state', '$location', - '$rootScope' + '$rootScope', + 'i18n' ]; diff --git a/awx/ui/client/src/controllers/Jobs.js b/awx/ui/client/src/jobs/jobs-list.controller.js similarity index 51% rename from awx/ui/client/src/controllers/Jobs.js rename to awx/ui/client/src/jobs/jobs-list.controller.js index 0015216389..d590cf7e17 100644 --- a/awx/ui/client/src/controllers/Jobs.js +++ b/awx/ui/client/src/jobs/jobs-list.controller.js @@ -10,14 +10,16 @@ * @description This controller's for the jobs page */ - - -export function JobsListController($state, $rootScope, $log, $scope, $compile, $stateParams, - ClearScope, Find, DeleteJob, RelaunchJob, AllJobsList, ScheduledJobsList, GetBasePath, Dataset) { + export default ['$state', '$rootScope', '$log', '$scope', '$compile', '$stateParams', + 'ClearScope', 'Find', 'DeleteJob', 'RelaunchJob', 'AllJobsList', 'ScheduledJobsList', + 'GetBasePath', 'Dataset', 'QuerySet', 'ListDefinition', '$interpolate', + function($state, $rootScope, $log, $scope, $compile, $stateParams, + ClearScope, Find, DeleteJob, RelaunchJob, AllJobsList, ScheduledJobsList, + GetBasePath, Dataset, qs, ListDefinition, $interpolate) { ClearScope(); - var list = AllJobsList; + var list = ListDefinition; init(); @@ -44,27 +46,29 @@ export function JobsListController($state, $rootScope, $log, $scope, $compile, $ // OPTIONS request returns, or the list is sorted/paginated/searched function optionsRequestDataProcessing(){ - $scope[list.name].forEach(function(item, item_idx) { - var itm = $scope[list.name][item_idx]; + if($scope[list.name] && $scope[list.name].length > 0) { + $scope[list.name].forEach(function(item, item_idx) { + var itm = $scope[list.name][item_idx]; - if(item.summary_fields && item.summary_fields.source_workflow_job && - item.summary_fields.source_workflow_job.id){ - item.workflow_result_link = `/#/workflows/${item.summary_fields.source_workflow_job.id}`; - } - - // Set the item type label - if (list.fields.type && $scope.options && - $scope.options.hasOwnProperty('type')) { - $scope.options.type.choices.every(function(choice) { - if (choice[0] === item.type) { - itm.type_label = choice[1]; - return false; - } - return true; - }); + if(item.summary_fields && item.summary_fields.source_workflow_job && + item.summary_fields.source_workflow_job.id){ + item.workflow_result_link = `/#/workflows/${item.summary_fields.source_workflow_job.id}`; } - buildTooltips(itm); - }); + + // Set the item type label + if (list.fields.type && $scope.options && + $scope.options.hasOwnProperty('type')) { + $scope.options.type.choices.every(function(choice) { + if (choice[0] === item.type) { + itm.type_label = choice[1]; + return false; + } + return true; + }); + } + buildTooltips(itm); + }); + } } function buildTooltips(job) { job.status_tip = 'Job ' + job.status + ". Click for details."; @@ -75,14 +79,31 @@ export function JobsListController($state, $rootScope, $log, $scope, $compile, $ }; $scope.relaunchJob = function(event, id) { - var job, typeId; + let job, typeId, jobs; try { $(event.target).tooltip('hide'); } catch (e) { //ignore } - job = Find({ list: $scope.jobs, key: 'id', val: id }); + if ($scope.completed_jobs) { + jobs = $scope.completed_jobs; + } + else if ($scope.running_jobs) { + jobs = $scope.running_jobs; + } + else if ($scope.queued_jobs) { + jobs = $scope.queued_jobs; + } + else if ($scope.all_jobs) { + jobs = $scope.all_jobs; + } + else if ($scope.jobs) { + jobs = $scope.jobs; + } + + job = Find({list: jobs, key: 'id', val: id }); + if (job.type === 'inventory_update') { typeId = job.inventory_source; } else if (job.type === 'project_update') { @@ -93,10 +114,6 @@ export function JobsListController($state, $rootScope, $log, $scope, $compile, $ RelaunchJob({ scope: $scope, id: typeId, type: job.type, name: job.name }); }; - $scope.refreshJobs = function() { - $state.go('.', null, { reload: true }); - }; - $scope.viewJobDetails = function(job) { var goToJobDetails = function(state) { @@ -126,14 +143,22 @@ export function JobsListController($state, $rootScope, $log, $scope, $compile, $ }; $scope.$on('ws-jobs', function(){ - $scope.refreshJobs(); + let path; + if (GetBasePath(list.basePath) || GetBasePath(list.name)) { + path = GetBasePath(list.basePath) || GetBasePath(list.name); + } else { + // completed jobs base path involves $stateParams + let interpolator = $interpolate(list.basePath); + path = interpolator({ $rootScope: $rootScope, $stateParams: $stateParams }); + } + qs.search(path, $state.params[`${list.iterator}_search`]) + .then(function(searchResponse) { + $scope[`${list.iterator}_dataset`] = searchResponse.data; + $scope[list.name] = $scope[`${list.iterator}_dataset`].results; + }); }); $scope.$on('ws-schedules', function(){ $state.reload(); }); -} - -JobsListController.$inject = ['$state', '$rootScope', '$log', '$scope', '$compile', '$stateParams', - 'ClearScope', 'Find', 'DeleteJob', 'RelaunchJob', 'AllJobsList', 'ScheduledJobsList', 'GetBasePath', 'Dataset' -]; +}]; diff --git a/awx/ui/client/src/partials/jobs.html b/awx/ui/client/src/jobs/jobs.partial.html similarity index 100% rename from awx/ui/client/src/partials/jobs.html rename to awx/ui/client/src/jobs/jobs.partial.html diff --git a/awx/ui/client/src/jobs/jobs.route.js b/awx/ui/client/src/jobs/jobs.route.js new file mode 100644 index 0000000000..aeba88e427 --- /dev/null +++ b/awx/ui/client/src/jobs/jobs.route.js @@ -0,0 +1,58 @@ +/************************************************* + * Copyright (c) 2016 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + + import { N_ } from '../i18n'; + import {templateUrl} from '../shared/template-url/template-url.factory'; + +export default { + searchPrefix: 'job', + name: 'jobs', + url: '/jobs', + ncyBreadcrumb: { + label: N_("JOBS") + }, + params: { + job_search: { + value: { + not__launch_type: 'sync', + order_by: '-finished' + }, + squash: '' + } + }, + data: { + socket: { + "groups": { + "jobs": ["status_changed"], + "schedules": ["changed"] + } + } + }, + resolve: { + Dataset: ['AllJobsList', 'QuerySet', '$stateParams', 'GetBasePath', (list, qs, $stateParams, GetBasePath) => { + let path = GetBasePath(list.basePath) || GetBasePath(list.name); + return qs.search(path, $stateParams[`${list.iterator}_search`]); + }], + ListDefinition: ['AllJobsList', (list) => { + return list; + }] + }, + views: { + '@': { + templateUrl: templateUrl('jobs/jobs') + }, + 'list@jobs': { + templateProvider: function(AllJobsList, generateList) { + let html = generateList.build({ + list: AllJobsList, + mode: 'edit' + }); + return html; + }, + controller: 'JobsList' + } + } +}; diff --git a/awx/ui/client/src/jobs/main.js b/awx/ui/client/src/jobs/main.js new file mode 100644 index 0000000000..b1782cead6 --- /dev/null +++ b/awx/ui/client/src/jobs/main.js @@ -0,0 +1,15 @@ +/************************************************* + * Copyright (c) 2017 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import jobsList from './jobs-list.controller'; +import jobsRoute from './jobs.route'; + +export default + angular.module('JobsModule', []) + .run(['$stateExtender', function($stateExtender) { + $stateExtender.addState(jobsRoute); + }]) + .controller('JobsList', jobsList); diff --git a/awx/ui/client/src/license/license.partial.html b/awx/ui/client/src/license/license.partial.html index 5adaa8ebde..a4ad990fa2 100644 --- a/awx/ui/client/src/license/license.partial.html +++ b/awx/ui/client/src/license/license.partial.html @@ -8,7 +8,7 @@
License
Valid License - Invalid License + Invalid License
diff --git a/awx/ui/client/src/license/license.route.js b/awx/ui/client/src/license/license.route.js index 947820a6e1..78ab6e4348 100644 --- a/awx/ui/client/src/license/license.route.js +++ b/awx/ui/client/src/license/license.route.js @@ -5,6 +5,7 @@ *************************************************/ import {templateUrl} from '../shared/template-url/template-url.factory'; +import { N_ } from '../i18n'; export default { name: 'license', @@ -14,7 +15,7 @@ export default { data: {}, ncyBreadcrumb: { parent: 'setup', - label: 'LICENSE' + label: N_('LICENSE') }, resolve: { features: ['CheckLicense', '$rootScope', diff --git a/awx/ui/client/src/lists/AllJobs.js b/awx/ui/client/src/lists/AllJobs.js index d5e73c3982..b611cb47d6 100644 --- a/awx/ui/client/src/lists/AllJobs.js +++ b/awx/ui/client/src/lists/AllJobs.js @@ -13,7 +13,7 @@ export default name: 'jobs', basePath: 'unified_jobs', iterator: 'job', - editTitle: 'All Jobs', + editTitle: i18n._('All Jobs'), index: false, hover: true, well: false, @@ -42,13 +42,13 @@ export default noLink: true }, name: { - label: 'Name', + label: i18n._('Name'), columnClass: 'col-lg-2 col-md-3 col-sm-4 col-xs-6', ngClick: "viewJobDetails(job)", badgePlacement: 'right', badgeCustom: true, badgeIcon: ` ` }, type: { - label: 'Type', + label: i18n._('Type'), ngBind: 'job.type_label', link: false, columnClass: "col-lg-2 hidden-md hidden-sm hidden-xs", columnShow: "showJobType", }, finished: { - label: 'Finished', + label: i18n._('Finished'), noLink: true, filter: "longDate", columnClass: "col-lg-2 col-md-3 col-sm-3 hidden-xs", @@ -73,7 +73,7 @@ export default desc: true }, labels: { - label: 'Labels', + label: i18n._('Labels'), type: 'labels', nosort: true, showDelete: false, @@ -91,28 +91,28 @@ export default "view": { mode: "all", ngClick: "viewJobDetails(job)", - awToolTip: "View the job", + awToolTip: i18n._("View the job"), dataPlacement: "top" }, submit: { icon: 'icon-rocket', mode: 'all', ngClick: 'relaunchJob($event, job.id)', - awToolTip: 'Relaunch using the same parameters', + awToolTip: i18n._('Relaunch using the same parameters'), dataPlacement: 'top', ngShow: "!(job.type == 'system_job') && job.summary_fields.user_capabilities.start" }, cancel: { mode: 'all', ngClick: 'deleteJob(job.id)', - awToolTip: 'Cancel the job', + awToolTip: i18n._('Cancel the job'), dataPlacement: 'top', ngShow: "(job.status === 'running'|| job.status === 'waiting' || job.status === 'pending') && job.summary_fields.user_capabilities.start" }, "delete": { mode: 'all', ngClick: 'deleteJob(job.id)', - awToolTip: 'Delete the job', + awToolTip: i18n._('Delete the job'), dataPlacement: 'top', ngShow: "(job.status !== 'running' && job.status !== 'waiting' && job.status !== 'pending') && job.summary_fields.user_capabilities.delete" } diff --git a/awx/ui/client/src/lists/InventoryGroups.js b/awx/ui/client/src/lists/InventoryGroups.js index c2fad80d1a..2445a1f3ba 100644 --- a/awx/ui/client/src/lists/InventoryGroups.js +++ b/awx/ui/client/src/lists/InventoryGroups.js @@ -50,7 +50,7 @@ export default label: 'Groups', key: true, ngClick: "groupSelect(group.id)", - columnClass: 'col-lg-3 col-md-3 col-sm-3 col-xs-3', + columnClass: 'col-lg-6 col-md-6 col-sm-6 col-xs-6', class: 'InventoryManage-breakWord', }, total_groups: { @@ -140,7 +140,7 @@ export default awToolTip: "{{ group.group_schedule_tooltip }}", ngClass: "group.scm_type_class", dataPlacement: 'top', - ngShow: "!(group.summary_fields.inventory_source.source === '') && group.summary_fields.user_capabilities.schedule" + ngShow: "!(group.summary_fields.inventory_source.source === '')" }, edit: { //label: 'Edit', diff --git a/awx/ui/client/src/lists/JobEvents.js b/awx/ui/client/src/lists/JobEvents.js index 9327ced8da..742fa354b6 100644 --- a/awx/ui/client/src/lists/JobEvents.js +++ b/awx/ui/client/src/lists/JobEvents.js @@ -7,11 +7,12 @@ export default angular.module('JobEventsListDefinition', []) - .value('JobEventList', { + .factory('JobEventList', ['i18n', function(i18n) { + return { name: 'jobevents', iterator: 'jobevent', - editTitle: 'Job Events', + editTitle: i18n._('Job Events'), index: false, hover: true, "class": "condensed", @@ -27,27 +28,27 @@ export default //}, events: { href: '/#/job_events/{{ job_id }}', - label: 'Events', + label: i18n._('Events'), active: true, icon: 'icon-list-ul' }, hosts: { href: '/#/job_host_summaries/{{ job_id }}', - label: 'Host Summary', + label: i18n._('Host Summary'), icon: 'icon-laptop' } }, fields: { created: { - label: 'Created On', + label: i18n._('Created On'), columnClass: 'col-lg-1 col-md-1 hidden-sm hidden-xs', key: true, nosort: true, noLink: true }, status: { - label: 'Status', + label: i18n._('Status'), showValue: false, columnClass: 'col-sm-1 col-xs-2 text-center', nosort: true, @@ -61,7 +62,7 @@ export default badgeNgClick: 'viewJobEvent(jobevent.id)' }, event_display: { - label: 'Event', + label: i18n._('Event'), hasChildren: true, ngClick: 'toggleChildren(jobevent.id, jobevent.related.children)', nosort: true, @@ -69,7 +70,7 @@ export default appendHTML: 'jobevent.event_detail' }, host: { - label: 'Host', + label: i18n._('Host'), ngBind: 'jobevent.summary_fields.host.name', ngHref: '{{ jobevent.hostLink }}', nosort: true, @@ -85,7 +86,7 @@ export default awToolTip: 'Refresh the page', ngClick: 'refresh()', actionClass: 'btn List-buttonDefault', - buttonContent: 'REFRESH' + buttonContent: i18n._('REFRESH') } }, @@ -94,10 +95,10 @@ export default columnClass: 'col-sm-1 col-xs-2', view: { - label: 'View', + label: i18n._('View'), ngClick: 'viewJobEvent(jobevent.id)', - awToolTip: 'View event details', + awToolTip: i18n._('View event details'), dataPlacement: 'top' } } - }); + };}]); diff --git a/awx/ui/client/src/lists/Projects.js b/awx/ui/client/src/lists/Projects.js index 26eb532f0e..4dac279846 100644 --- a/awx/ui/client/src/lists/Projects.js +++ b/awx/ui/client/src/lists/Projects.js @@ -97,7 +97,6 @@ export default awToolTip: "{{ project.scm_schedule_tooltip }}", ngClass: "project.scm_type_class", dataPlacement: 'top', - ngShow: "project.summary_fields.user_capabilities.schedule" }, edit: { ngClick: "editProject(project.id)", diff --git a/awx/ui/client/src/lists/ScheduledJobs.js b/awx/ui/client/src/lists/ScheduledJobs.js index 8afde66081..736ad61e4e 100644 --- a/awx/ui/client/src/lists/ScheduledJobs.js +++ b/awx/ui/client/src/lists/ScheduledJobs.js @@ -25,6 +25,7 @@ export default ngClick: "toggleSchedule($event, schedule.id)", nosort: true, awToolTip: "{{ schedule.play_tip }}", + ngDisabled: "!schedule.summary_fields.user_capabilities.edit", dataTipWatch: "schedule.play_tip", dataPlacement: 'top' }, diff --git a/awx/ui/client/src/lists/Schedules.js b/awx/ui/client/src/lists/Schedules.js index fbf03f5678..4d54ba8247 100644 --- a/awx/ui/client/src/lists/Schedules.js +++ b/awx/ui/client/src/lists/Schedules.js @@ -7,7 +7,8 @@ export default angular.module('SchedulesListDefinition', []) - .value('SchedulesList', { + .factory('SchedulesList', ['i18n', function(i18n) { + return { name: 'schedules', iterator: 'schedule', @@ -19,6 +20,7 @@ export default fields: { toggleSchedule: { + ngDisabled: "!schedule.summary_fields.user_capabilities.edit", label: '', columnClass: 'List-staticColumn--toggle', type: "toggle", @@ -30,22 +32,22 @@ export default }, name: { key: true, - label: 'Name', + label: i18n._('Name'), ngClick: "editSchedule(schedule)", columnClass: "col-md-3 col-sm-3 col-xs-6" }, dtstart: { - label: 'First Run', + label: i18n._('First Run'), filter: "longDate", columnClass: "List-staticColumn--schedulerTime hidden-sm hidden-xs" }, next_run: { - label: 'Next Run', + label: i18n._('Next Run'), filter: "longDate", columnClass: "List-staticColumn--schedulerTime hidden-xs" }, dtend: { - label: 'Final Run', + label: i18n._('Final Run'), filter: "longDate", columnClass: "List-staticColumn--schedulerTime hidden-xs" }, @@ -54,45 +56,45 @@ export default actions: { refresh: { mode: 'all', - awToolTip: "Refresh the page", + awToolTip: i18n._("Refresh the page"), ngClick: "refreshSchedules()", actionClass: 'btn List-buttonDefault', ngShow: "socketStatus == 'error'", - buttonContent: 'REFRESH' + buttonContent: i18n._('REFRESH') }, add: { mode: 'all', ngClick: 'addSchedule()', - awToolTip: 'Add a new schedule', + awToolTip: i18n._('Add a new schedule'), actionClass: 'btn List-buttonSubmit', - buttonContent: '+ ADD', + buttonContent: '+ ' + i18n._('ADD'), ngShow: 'canAdd' } }, fieldActions: { edit: { - label: 'Edit', + label: i18n._('Edit'), ngClick: "editSchedule(schedule)", icon: 'icon-edit', - awToolTip: 'Edit schedule', + awToolTip: i18n._('Edit schedule'), dataPlacement: 'top', ngShow: 'schedule.summary_fields.user_capabilities.edit' }, view: { - label: 'View', + label: i18n._('View'), ngClick: "editSchedule(schedule)", - awToolTip: 'View schedule', + awToolTip: i18n._('View schedule'), dataPlacement: 'top', ngShow: '!schedule.summary_fields.user_capabilities.edit' }, "delete": { - label: 'Delete', + label: i18n._('Delete'), ngClick: "deleteSchedule(schedule.id)", icon: 'icon-trash', - awToolTip: 'Delete schedule', + awToolTip: i18n._('Delete schedule'), dataPlacement: 'top', ngShow: 'schedule.summary_fields.user_capabilities.delete' } } - }); + };}]); diff --git a/awx/ui/client/src/lists/Streams.js b/awx/ui/client/src/lists/Streams.js index 34e0652885..bb2258a22e 100644 --- a/awx/ui/client/src/lists/Streams.js +++ b/awx/ui/client/src/lists/Streams.js @@ -7,15 +7,16 @@ export default angular.module('StreamListDefinition', []) - .value('StreamList', { + .factory('StreamList', ['i18n', function(i18n) { + return { name: 'activities', iterator: 'activity', basePath: 'activity_stream', - editTitle: 'Activity Stream', - listTitle: 'Activity Stream
{{streamSubTitle}}', + editTitle: i18n._('Activity Stream'), + listTitle: i18n._('Activity Stream') + '
{{streamSubTitle}}', listTitleBadge: false, - emptyListText: 'There are no events to display at this time', + emptyListText: i18n._('There are no events to display at this time'), selectInstructions: '', index: false, hover: true, @@ -24,7 +25,7 @@ export default fields: { timestamp: { - label: 'Time', + label: i18n._('Time'), key: true, desc: true, noLink: true, @@ -32,14 +33,14 @@ export default columnClass: 'col-lg-3 col-md-2 col-sm-3 col-xs-3' }, user: { - label: 'Initiated by', + label: i18n._('Initiated by'), ngBindHtml: 'activity.user', // @todo punch monkey sourceModel: 'actor', sourceField: 'username', columnClass: 'col-lg-3 col-md-3 col-sm-3 col-xs-3' }, description: { - label: 'Event', + label: i18n._('Event'), ngBindHtml: 'activity.description', // @todo punch monkey nosort: true, columnClass: 'ActivityStream-eventColumnHeader col-lg-5 col-md-6 col-sm-4 col-xs-4' @@ -50,10 +51,10 @@ export default refresh: { mode: 'all', id: 'activity-stream-refresh-btn', - awToolTip: "Refresh the page", + awToolTip: i18n._("Refresh the page"), ngClick: "refreshStream()", actionClass: 'btn List-buttonDefault ActivityStream-refreshButton', - buttonContent: 'REFRESH' + buttonContent: i18n._('REFRESH') } }, @@ -62,13 +63,13 @@ export default columnClass: 'col-lg-1 col-md-1 col-sm-2 col-xs-2', view: { - label: 'View', + label: i18n._('View'), ngClick: "showDetail(activity.id)", icon: 'fa-zoom-in', "class": 'btn-default btn-xs', - awToolTip: 'View event details', + awToolTip: i18n._('View event details'), dataPlacement: 'top' } } - }); + };}]); diff --git a/awx/ui/client/src/lists/Templates.js b/awx/ui/client/src/lists/Templates.js index 67728dada0..c19d7a7052 100644 --- a/awx/ui/client/src/lists/Templates.js +++ b/awx/ui/client/src/lists/Templates.js @@ -25,7 +25,7 @@ export default key: true, label: i18n._('Name'), columnClass: 'col-lg-2 col-md-2 col-sm-4 col-xs-9', - ngClick: "editJobTemplate(template)" + ngHref: '#/templates/{{template.type}}/{{template.id}}' }, type: { label: i18n._('Type'), @@ -94,7 +94,6 @@ export default ngClick: 'scheduleJob(template)', awToolTip: i18n._('Schedule future job template runs'), dataPlacement: 'top', - ngShow: 'template.summary_fields.user_capabilities.schedule' }, copy: { label: i18n._('Copy'), @@ -115,7 +114,7 @@ export default }, view: { label: i18n._('View'), - ngClick: "editJobTemplate(template.id)", + ngClick: "editJobTemplate(template)", awToolTip: i18n._('View template'), "class": 'btn-default btn-xs', dataPlacement: 'top', diff --git a/awx/ui/client/src/login/authenticationServices/authentication.service.js b/awx/ui/client/src/login/authenticationServices/authentication.service.js index 73d42a3e50..b6064e8211 100644 --- a/awx/ui/client/src/login/authenticationServices/authentication.service.js +++ b/awx/ui/client/src/login/authenticationServices/authentication.service.js @@ -15,9 +15,9 @@ */ export default - ['$http', '$rootScope', '$location', '$cookieStore', 'GetBasePath', 'Store', + ['$http', '$rootScope', '$location', '$cookieStore', 'GetBasePath', 'Store', '$q', '$injector', - function ($http, $rootScope, $location, $cookieStore, GetBasePath, Store, + function ($http, $rootScope, $location, $cookieStore, GetBasePath, Store, $q, $injector) { return { setToken: function (token, expires) { @@ -58,62 +58,75 @@ export default } }); }, + deleteToken: function () { + return $http({ + method: 'DELETE', + url: GetBasePath('authtoken') + }); + }, logout: function () { // the following puts our primary scope up for garbage collection, which // should prevent content flash from the prior user. var x, + deferred = $q.defer(), ConfigService = $injector.get('ConfigService'), SocketService = $injector.get('SocketService'), scope = angular.element(document.getElementById('main-view')).scope(); - if(scope){ - scope.$destroy(); - } + this.deleteToken().then(() => { + if(scope){ + scope.$destroy(); + } - if($cookieStore.get('lastPath')==='/portal'){ - $cookieStore.put( 'lastPath', '/portal'); - $rootScope.lastPath = '/portal'; - } - else if ($cookieStore.get('lastPath') !== '/home' || $cookieStore.get('lastPath') !== '/' || $cookieStore.get('lastPath') !== '/login' || $cookieStore.get('lastPath') !== '/logout'){ - // do nothing - $rootScope.lastPath = $cookieStore.get('lastPath'); - } - else { - // your last path was home - $cookieStore.remove('lastPath'); - $rootScope.lastPath = '/home'; - } - x = Store('sessionTime'); - if ($rootScope.current_user) { - x[$rootScope.current_user.id].loggedIn = false; - } - Store('sessionTime', x); + if($cookieStore.get('lastPath')==='/portal'){ + $cookieStore.put( 'lastPath', '/portal'); + $rootScope.lastPath = '/portal'; + } + else if ($cookieStore.get('lastPath') !== '/home' || $cookieStore.get('lastPath') !== '/' || $cookieStore.get('lastPath') !== '/login' || $cookieStore.get('lastPath') !== '/logout'){ + // do nothing + $rootScope.lastPath = $cookieStore.get('lastPath'); + } + else { + // your last path was home + $cookieStore.remove('lastPath'); + $rootScope.lastPath = '/home'; + } + x = Store('sessionTime'); + if ($rootScope.current_user) { + x[$rootScope.current_user.id].loggedIn = false; + } + Store('sessionTime', x); + + if ($cookieStore.get('current_user')) { + $rootScope.lastUser = $cookieStore.get('current_user').id; + } + ConfigService.delete(); + SocketService.disconnect(); + $cookieStore.remove('token_expires'); + $cookieStore.remove('current_user'); + $cookieStore.remove('token'); + $cookieStore.put('userLoggedIn', false); + $cookieStore.put('sessionExpired', false); + $cookieStore.put('current_user', {}); + $rootScope.current_user = {}; + $rootScope.license_tested = undefined; + $rootScope.userLoggedIn = false; + $rootScope.sessionExpired = false; + $rootScope.licenseMissing = true; + $rootScope.token = null; + $rootScope.token_expires = null; + $rootScope.login_username = null; + $rootScope.login_password = null; + if ($rootScope.sessionTimer) { + $rootScope.sessionTimer.clearTimers(); + } + deferred.resolve(); + }); + + return deferred.promise; - if ($cookieStore.get('current_user')) { - $rootScope.lastUser = $cookieStore.get('current_user').id; - } - ConfigService.delete(); - SocketService.disconnect(); - $cookieStore.remove('token_expires'); - $cookieStore.remove('current_user'); - $cookieStore.remove('token'); - $cookieStore.put('userLoggedIn', false); - $cookieStore.put('sessionExpired', false); - $cookieStore.put('current_user', {}); - $rootScope.current_user = {}; - $rootScope.license_tested = undefined; - $rootScope.userLoggedIn = false; - $rootScope.sessionExpired = false; - $rootScope.licenseMissing = true; - $rootScope.token = null; - $rootScope.token_expires = null; - $rootScope.login_username = null; - $rootScope.login_password = null; - if ($rootScope.sessionTimer) { - $rootScope.sessionTimer.clearTimers(); - } }, licenseTested: function () { diff --git a/awx/ui/client/src/login/authenticationServices/timer.factory.js b/awx/ui/client/src/login/authenticationServices/timer.factory.js index f68d0e412a..ebdf440baf 100644 --- a/awx/ui/client/src/login/authenticationServices/timer.factory.js +++ b/awx/ui/client/src/login/authenticationServices/timer.factory.js @@ -23,9 +23,9 @@ */ export default ['$rootScope', '$cookieStore', 'CreateDialog', 'Authorization', - 'Store', '$interval', '$state', '$q', + 'Store', '$interval', '$state', '$q', 'i18n', function ($rootScope, $cookieStore, CreateDialog, Authorization, - Store, $interval, $state, $q) { + Store, $interval, $state, $q, i18n) { return { sessionTime: null, @@ -154,7 +154,7 @@ export default }); CreateDialog({ id: 'idle-modal' , - title: "Idle Session", + title: i18n._("Idle Session"), scope: $rootScope, buttons: buttons, width: 470, diff --git a/awx/ui/client/src/login/loginModal/loginModal.controller.js b/awx/ui/client/src/login/loginModal/loginModal.controller.js index 1b064d4268..24074ac2a1 100644 --- a/awx/ui/client/src/login/loginModal/loginModal.controller.js +++ b/awx/ui/client/src/login/loginModal/loginModal.controller.js @@ -142,9 +142,10 @@ export default ['$log', '$cookieStore', '$compile', '$window', '$rootScope', }); }) .error(function (data, status) { - Authorization.logout(); - Wait('stop'); - Alert('Error', 'Failed to access user information. GET returned status: ' + status, 'alert-danger', loginAgain); + Authorization.logout().then( () => { + Wait('stop'); + Alert('Error', 'Failed to access user information. GET returned status: ' + status, 'alert-danger', loginAgain); + }); }); }); diff --git a/awx/ui/client/src/login/loginModal/loginModal.partial.html b/awx/ui/client/src/login/loginModal/loginModal.partial.html index d6e30a20a3..eb124adcf4 100644 --- a/awx/ui/client/src/login/loginModal/loginModal.partial.html +++ b/awx/ui/client/src/login/loginModal/loginModal.partial.html @@ -86,7 +86,7 @@
-
NOTICE
{{ customLoginInfo | sanitize }}
+
NOTICE
{{ customLoginInfo | sanitize }}
- CLEAR ALL + CLEAR ALL
@@ -37,7 +37,7 @@
- EXAMPLES: + EXAMPLES:
@@ -45,13 +45,13 @@
- FIELDS: {{ key }}, + FIELDS: {{ key }},
- RELATED FIELDS: {{ relation }}, + RELATED FIELDS: {{ relation }},
- ADDITIONAL INFORMATION: For additional information on advanced search search syntax please see the Ansible Tower documentation. + ADDITIONAL INFORMATION: For additional information on advanced search search syntax please see the Ansible Tower documentation.
diff --git a/awx/ui/client/src/shared/socket/socket.service.js b/awx/ui/client/src/shared/socket/socket.service.js index b636cc1db8..b03d32cacf 100644 --- a/awx/ui/client/src/shared/socket/socket.service.js +++ b/awx/ui/client/src/shared/socket/socket.service.js @@ -5,8 +5,8 @@ *************************************************/ import ReconnectingWebSocket from 'reconnectingwebsocket'; export default -['$rootScope', '$location', '$log','$state', '$q', 'i18n', 'Authorization', - function ($rootScope, $location, $log, $state, $q, i18n, Authorization) { +['$rootScope', '$location', '$log','$state', '$q', 'i18n', + function ($rootScope, $location, $log, $state, $q, i18n) { var needsResubscribing = false, socketPromise = $q.defer(); return { @@ -14,8 +14,7 @@ export default var self = this, host = window.location.host, protocol, - url, - token = Authorization.getToken(); + url; if($location.protocol() === 'http'){ protocol = 'ws'; @@ -26,8 +25,7 @@ export default url = `${protocol}://${host}/websocket/`; if (!$rootScope.sessionTimer || ($rootScope.sessionTimer && !$rootScope.sessionTimer.isExpired())) { - // We have a valid session token, so attempt socket connection - url = `${url}?token=${token}`; + $log.debug('Socket connecting to: ' + url); self.socket = new ReconnectingWebSocket(url, null, { diff --git a/awx/ui/client/src/shared/stateDefinitions.factory.js b/awx/ui/client/src/shared/stateDefinitions.factory.js index 8279173dc9..f6f0bf1950 100644 --- a/awx/ui/client/src/shared/stateDefinitions.factory.js +++ b/awx/ui/client/src/shared/stateDefinitions.factory.js @@ -9,7 +9,7 @@ * generateLookupNodes - Attaches to a form node. Builds an abstract '*.lookup' node with field-specific 'lookup.*' children e.g. {name: 'projects.add.lookup.organizations', ...} */ -export default ['$injector', '$stateExtender', '$log', function($injector, $stateExtender, $log) { +export default ['$injector', '$stateExtender', '$log', 'i18n', function($injector, $stateExtender, $log, i18n) { return { /** * @ngdoc method @@ -150,7 +150,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat url: url, ncyBreadcrumb: { [params.parent ? 'parent' : null]: `${params.parent}`, - label: `CREATE ${form.breadcrumbName || form.name}` + label: i18n.sprintf(i18n._("CREATE %s"), i18n._(`${form.breadcrumbName || form.name}`)) }, views: { 'form': { @@ -219,8 +219,8 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat }; if (params.data && params.data.activityStreamTarget) { formNodeState.data = {}; - formNodeState.data.activityStreamId = params.data.activityStreamTarget + '_id'; - + formNodeState.data.activityStreamId = params.data.activityStreamId ? params.data.activityStreamId : params.data.activityStreamTarget + '_id'; + formNodeState.data.activityStreamTarget = params.data.activityStreamTarget; } formNode = $stateExtender.buildDefinition(formNodeState); @@ -230,7 +230,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat break; } states.push(formNode); - states = states.concat(this.generateLookupNodes(form, formNode)).concat(this.generateFormListDefinitions(form, formNode)); + states = states.concat(this.generateLookupNodes(form, formNode)).concat(this.generateFormListDefinitions(form, formNode, params)); return states; }, /** @@ -241,7 +241,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat * @params {object} formStateDefinition - the parent form node * @returns {array} Array of state definitions [{...}, {...}, ...] */ - generateFormListDefinitions: function(form, formStateDefinition) { + generateFormListDefinitions: function(form, formStateDefinition, params) { function buildRbacUserTeamDirective(){ let states = []; @@ -274,7 +274,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat }, views: { [`modal@${formStateDefinition.name}`]: { - template: `` + template: `` } }, resolve: { @@ -339,7 +339,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat }, views: { [`modal@${formStateDefinition.name}`]: { - template: `` + template: `` } }, resolve: { @@ -492,7 +492,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat // } return state; } - + function buildRbacUserDirective() { let states = []; @@ -508,7 +508,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat }, views: { [`modal@${formStateDefinition.name}`]: { - template: `` + template: `` } }, resolve: { @@ -548,7 +548,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat } } else if (field.iterator === 'user' && field.actions && field.actions.add) { - if(form.name === 'team') { + if(form.name === 'team' || form.name === 'organization') { states.push(buildRbacUserDirective()); } } @@ -559,14 +559,17 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat function buildListDefinition(field) { let state, - list = field.include ? $injector.get(field.include) : field; - state = $stateExtender.buildDefinition({ + list = field.include ? $injector.get(field.include) : field, + // Added this line specifically for Completed Jobs but should be OK + // for all the rest of the related tabs + breadcrumbLabel = field.iterator.replace('_', ' '), + stateConfig = { searchPrefix: `${list.iterator}`, name: `${formStateDefinition.name}.${list.iterator}s`, url: `/${list.iterator}s`, ncyBreadcrumb: { parent: `${formStateDefinition.name}`, - label: `${field.iterator}s` + label: `${breadcrumbLabel}s` }, params: { [list.iterator + '_search']: { @@ -583,14 +586,7 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat FormDefinition() : FormDefinition }); return html; - }, - controller: ['$scope', 'ListDefinition', 'Dataset', - function($scope, list, Dataset) { - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[`${list.iterator}s`] = $scope[`${list.iterator}_dataset`].results; - } - ] + } } }, resolve: { @@ -611,7 +607,26 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat } ] } - }); + }; + + if(params.controllers && params.controllers.related && params.controllers.related[field.name]) { + stateConfig.views.related.controller = params.controllers.related[field.name]; + } + else if(field.name === 'permissions') { + stateConfig.views.related.controller = 'PermissionsList'; + } + else { + // Generic controller + stateConfig.views.related.controller = ['$scope', 'ListDefinition', 'Dataset', + function($scope, list, Dataset) { + $scope.list = list; + $scope[`${list.iterator}_dataset`] = Dataset.data; + $scope[`${list.iterator}s`] = $scope[`${list.iterator}_dataset`].results; + } + ]; + } + + state = $stateExtender.buildDefinition(stateConfig); // appy any default search parameters in form definition if (field.search) { state.params[`${field.iterator}_search`].value = _.merge(state.params[`${field.iterator}_search`].value, field.search); @@ -670,8 +685,25 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat list.iterator = field.sourceModel; return list; }], - Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', '$state', - (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope, $state) => { + OrganizationId: ['ListDefinition', 'InventoryManageService', '$stateParams', '$rootScope', + function(list, InventoryManageService, $stateParams, $rootScope){ + if(list.iterator === 'inventory_script'){ + if($rootScope.$$childTail && + $rootScope.$$childTail.$resolve && + $rootScope.$$childTail.$resolve.hasOwnProperty('inventoryData')){ + return $rootScope.$$childTail.$resolve.inventoryData.summary_fields.organization.id; + } + else { + return InventoryManageService.getInventory($stateParams.inventory_id).then(res => res.data.summary_fields.organization.id); + } + + } + else { + return; + } + }], + Dataset: ['ListDefinition', 'QuerySet', '$stateParams', 'GetBasePath', '$interpolate', '$rootScope', '$state', 'OrganizationId', + (list, qs, $stateParams, GetBasePath, $interpolate, $rootScope, $state, OrganizationId) => { // allow lookup field definitions to use interpolated $stateParams / $rootScope in basePath field // the basePath on a form's lookup field will take precedence over the general model list's basepath let path, interpolator; @@ -688,9 +720,14 @@ export default ['$injector', '$stateExtender', '$log', function($injector, $stat } // Need to change the role_level here b/c organizations and inventory scripts // don't have a "use_role", only "admin_role" and "read_role" - if(list.iterator === "organization" || list.iterator === "inventory_script"){ + if(list.iterator === "organization"){ $stateParams[`${list.iterator}_search`].role_level = "admin_role"; } + if(list.iterator === "inventory_script"){ + $stateParams[`${list.iterator}_search`].role_level = "admin_role"; + $stateParams[`${list.iterator}_search`].organization = OrganizationId; + } + return qs.search(path, $stateParams[`${list.iterator}_search`]); } ] diff --git a/awx/ui/client/src/smart-status/smart-status.block.less b/awx/ui/client/src/smart-status/smart-status.block.less index 9ce9c7dc01..633c5183ff 100644 --- a/awx/ui/client/src/smart-status/smart-status.block.less +++ b/awx/ui/client/src/smart-status/smart-status.block.less @@ -26,6 +26,10 @@ padding: 0px; } +.SmartStatus--failed:before { + content: "\f06a"; +} + .SmartStatus--running{ color: @default-icon; margin-top: 10px; diff --git a/awx/ui/client/src/standard-out/adhoc/standard-out-adhoc.partial.html b/awx/ui/client/src/standard-out/adhoc/standard-out-adhoc.partial.html index 69e3c40b66..eff50b6290 100644 --- a/awx/ui/client/src/standard-out/adhoc/standard-out-adhoc.partial.html +++ b/awx/ui/client/src/standard-out/adhoc/standard-out-adhoc.partial.html @@ -4,7 +4,7 @@
-
+
RESULTS
@@ -16,12 +16,12 @@
-
Name
+
Name
{{ job.module_name }}
-
STATUS
+
STATUS
{{ job.status }} @@ -29,54 +29,54 @@
-
STARTED
+
STARTED
{{ job.started | longDate }}
-
FINISHED
+
FINISHED
{{ job.finished | longDate }}
-
ELAPSED
+
ELAPSED
{{ job.elapsed }} seconds
-
Module Args
+
Module Args
{{ job.module_args }}
-
Inventory
+
Inventory
-
Credential
+
Credential
-
Launched By
+
Launched By
@@ -84,19 +84,19 @@
-
Forks
+
Forks
{{ forks }}
-
Limit
+
Limit
{{ limit }}
-
Verbosity
+
Verbosity
{{ verbosity }}
@@ -105,13 +105,13 @@
-
STANDARD OUT
+
STANDARD OUT
- diff --git a/awx/ui/client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html b/awx/ui/client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html index d06a66dd1b..0f398643b9 100644 --- a/awx/ui/client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html +++ b/awx/ui/client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html @@ -4,7 +4,7 @@
-
+
RESULTS
@@ -16,13 +16,13 @@
-
NAME
+
NAME
{{ inventory_source_name }}
-
STATUS
+
STATUS
{{ job.status }} @@ -42,42 +42,42 @@
-
LICENSE ERROR
+
LICENSE ERROR
{{ job.license_error }}
-
STARTED
+
STARTED
{{ job.started | longDate }}
-
FINISHED
+
FINISHED
{{ job.finished | longDate }}
-
ELAPSED
+
ELAPSED
{{ job.elapsed }} seconds
-
LAUNCH TYPE
+
LAUNCH TYPE
{{ job.launch_type }}
-
CREDENTIAL
+
CREDENTIAL
-
GROUP
+
GROUP
-
SOURCE
+
SOURCE
{{ source }}
-
REGIONS
+
REGIONS
{{ source_regions }}
-
OVERWRITE
+
OVERWRITE
{{ job.overwrite }}
-
OVERWRITE VARS
+
OVERWRITE VARS
{{ job.overwrite_vars }}
@@ -128,13 +128,13 @@
-
STANDARD OUT
+
STANDARD OUT
- diff --git a/awx/ui/client/src/standard-out/scm-update/standard-out-scm-update.partial.html b/awx/ui/client/src/standard-out/scm-update/standard-out-scm-update.partial.html index 0f24a79aec..62d7b6045d 100644 --- a/awx/ui/client/src/standard-out/scm-update/standard-out-scm-update.partial.html +++ b/awx/ui/client/src/standard-out/scm-update/standard-out-scm-update.partial.html @@ -4,25 +4,25 @@
-
+
RESULTS
- - - + + +
-
NAME
+
NAME
{{ project_name }}
-
STATUS
+
STATUS
{{ job.status }} @@ -42,35 +42,35 @@
-
STARTED
+
STARTED
{{ job.started | longDate }}
-
FINISHED
+
FINISHED
{{ job.finished | longDate }}
-
ELAPSED
+
ELAPSED
{{ job.elapsed }} seconds
-
LAUNCH TYPE
+
LAUNCH TYPE
{{ job.launch_type }}
-
PROJECT
+
PROJECT
-
CREDENTIAL
+
CREDENTIAL
{{ credential_name }} @@ -93,13 +93,13 @@
-
STANDARD OUT
+
STANDARD OUT
- diff --git a/awx/ui/client/src/system-tracking/date-picker/date-picker.partial.html b/awx/ui/client/src/system-tracking/date-picker/date-picker.partial.html index 09bc001065..74bd409a6f 100644 --- a/awx/ui/client/src/system-tracking/date-picker/date-picker.partial.html +++ b/awx/ui/client/src/system-tracking/date-picker/date-picker.partial.html @@ -1,10 +1,11 @@
- + + ng-class="inputClass()" + ng-disabled="disabled">

{{error}}

diff --git a/awx/ui/client/src/system-tracking/system-tracking.route.js b/awx/ui/client/src/system-tracking/system-tracking.route.js index 6875df68fa..da803afc91 100644 --- a/awx/ui/client/src/system-tracking/system-tracking.route.js +++ b/awx/ui/client/src/system-tracking/system-tracking.route.js @@ -5,6 +5,7 @@ *************************************************/ import {templateUrl} from '../shared/template-url/template-url.factory'; +import { N_ } from '../i18n'; export default { name: 'systemTracking', @@ -14,7 +15,7 @@ export default { params: {hosts: null, inventory: null}, reloadOnSearch: false, ncyBreadcrumb: { - label: "SYSTEM TRACKING" + label: N_("SYSTEM TRACKING") }, resolve: { moduleOptions: diff --git a/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js b/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js index 07d72a615d..d2ac02e66e 100644 --- a/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js +++ b/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js @@ -9,13 +9,13 @@ '$stateParams', 'JobTemplateForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'ClearScope', 'GetBasePath', 'md5Setup', 'ParseTypeChange', 'Wait', 'Empty', 'ToJSON', 'CallbackHelpInit', 'Prompt', 'GetChoices', '$state', - 'CreateSelect2', '$q', + 'CreateSelect2', '$q', 'i18n', function( $filter, $scope, $rootScope, $compile, $location, $log, $stateParams, JobTemplateForm, GenerateForm, Rest, Alert, ProcessErrors, ClearScope, GetBasePath, md5Setup, ParseTypeChange, Wait, Empty, ToJSON, CallbackHelpInit, Prompt, GetChoices, - $state, CreateSelect2, $q + $state, CreateSelect2, $q, i18n ) { Rest.setUrl(GetBasePath('job_templates')); @@ -23,7 +23,7 @@ .success(function(data) { if (!data.actions.POST) { $state.go("^"); - Alert('Permission Error', 'You do not have permission to add a job template.', 'alert-info'); + Alert(i18n._('Permission Error'), i18n._('You do not have permission to add a job template.'), 'alert-info'); } }); diff --git a/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js b/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js index 16904cdaf1..8da8a4c034 100644 --- a/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js +++ b/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js @@ -98,6 +98,7 @@ export default Rest.setUrl(url); Rest.get() .success(function (data) { + $scope.disablePlaybookBecausePermissionDenied = false; $scope.playbook_options = []; var playbookNotFound = true; for (var i = 0; i < data.length; i++) { @@ -118,6 +119,7 @@ export default .error(function (ret,status_code) { if (status_code === 403) { /* user doesn't have access to see the project, no big deal. */ + $scope.disablePlaybookBecausePermissionDenied = true; } else { Alert('Missing Playbooks', 'Unable to retrieve the list of playbooks for this project. Choose a different ' + ' project or make the playbooks available on the file system.', 'alert-info'); diff --git a/awx/ui/client/src/templates/list/templates-list.controller.js b/awx/ui/client/src/templates/list/templates-list.controller.js index d0b910e6b9..d3e07c6fda 100644 --- a/awx/ui/client/src/templates/list/templates-list.controller.js +++ b/awx/ui/client/src/templates/list/templates-list.controller.js @@ -72,12 +72,8 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', $scope.$on(`ws-jobs`, function () { - // @issue - this is no longer quite as ham-fisted but I'd like for someone else to take a peek - // calling $state.reload(); here was problematic when launching a job because job launch also - // attempts to transition the state and they were squashing each other. - let path = GetBasePath(list.basePath) || GetBasePath(list.name); - qs.search(path, $stateParams[`${list.iterator}_search`]) + qs.search(path, $state.params[`${list.iterator}_search`]) .then(function(searchResponse) { $scope[`${list.iterator}_dataset`] = searchResponse.data; $scope[list.name] = $scope[`${list.iterator}_dataset`].results; @@ -113,10 +109,11 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', body: '
Are you sure you want to delete the template below?
' + $filter('sanitize')(template.name) + '
', action: function() { - function handleSuccessfulDelete() { - // TODO: look at this - if (parseInt($state.params.id) === template.id) { - $state.go("^", null, {reload: true}); + function handleSuccessfulDelete(isWorkflow) { + let stateParamId = isWorkflow ? $state.params.workflow_job_template_id : $state.params.job_template_id; + if (parseInt(stateParamId) === template.id) { + // Move the user back to the templates list + $state.go("templates", null, {reload: true}); } else { $state.go(".", null, {reload: true}); } @@ -128,7 +125,7 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', if(template.type && (template.type === 'Workflow Job Template' || template.type === 'workflow_job_template')) { TemplatesService.deleteWorkflowJobTemplate(template.id) .then(function () { - handleSuccessfulDelete(); + handleSuccessfulDelete(true); }, function (data) { Wait('stop'); ProcessErrors($scope, data, data.status, null, { hdr: 'Error!', diff --git a/awx/ui/client/src/templates/list/templates-list.route.js b/awx/ui/client/src/templates/list/templates-list.route.js index e615e52db1..6846620d17 100644 --- a/awx/ui/client/src/templates/list/templates-list.route.js +++ b/awx/ui/client/src/templates/list/templates-list.route.js @@ -4,11 +4,13 @@ * All Rights Reserved *************************************************/ + import { N_ } from '../../i18n'; + export default { name: 'templates', route: '/templates', ncyBreadcrumb: { - label: "TEMPLATES" + label: N_("TEMPLATES") }, data: { activityStream: true, diff --git a/awx/ui/client/src/templates/main.js b/awx/ui/client/src/templates/main.js index df92821c7f..887e362e02 100644 --- a/awx/ui/client/src/templates/main.js +++ b/awx/ui/client/src/templates/main.js @@ -52,7 +52,15 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA modes: ['edit'], form: 'JobTemplateForm', controllers: { - edit: 'JobTemplateEdit' + edit: 'JobTemplateEdit', + related: { + completed_jobs: 'JobsList' + } + }, + data: { + activityStream: true, + activityStreamTarget: 'job_template', + activityStreamId: 'job_template_id' } }); @@ -73,6 +81,11 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA form: 'WorkflowForm', controllers: { edit: 'WorkflowEdit' + }, + data: { + activityStream: true, + activityStreamTarget: 'workflow_job_template', + activityStreamId: 'workflow_job_template_id' } }); @@ -89,14 +102,16 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA job_template_search: { value: { page_size: '5', - type: 'job_template' + type: 'job_template', + order_by: 'name' }, squash: true, dynamic: true }, project_search: { value: { - page_size: '5' + page_size: '5', + order_by: 'name' }, squash: true, dynamic: true @@ -104,7 +119,8 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA inventory_source_search: { value: { page_size: '5', - not__source: '' + not__source: '', + order_by: 'name' }, squash: true, dynamic: true @@ -194,18 +210,16 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA ] }, 'inventorySyncList@templates.editWorkflowJobTemplate.workflowMaker': { - templateProvider: function(InventorySourcesList, generateList) { - let list = _.cloneDeep(InventorySourcesList); - // mutate list definition here! + templateProvider: function(WorkflowInventorySourcesList, generateList) { let html = generateList.build({ - list: list, + list: WorkflowInventorySourcesList, input_type: 'radio', mode: 'lookup' }); return html; }, // encapsulated $scope in this controller will be a initialized as child of 'modal' $scope, because of element hierarchy - controller: ['$scope', 'InventorySourcesList', 'InventorySourcesDataset', + controller: ['$scope', 'WorkflowInventorySourcesList', 'InventorySourcesDataset', function($scope, list, Dataset) { init(); @@ -422,7 +436,7 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA return qs.search(path, $stateParams[`${list.iterator}_search`]); } ], - ProjectDataset: ['ProjectList', 'QuerySet', '$stateParams', 'GetBasePath', + ProjectDataset: ['WorkflowProjectList', 'QuerySet', '$stateParams', 'GetBasePath', (list, qs, $stateParams, GetBasePath) => { let path = GetBasePath(list.basePath); return qs.search(path, $stateParams[`${list.iterator}_search`]); @@ -452,6 +466,7 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA label: '', nosort: true }; + list.maxVisiblePages = 5; return list; } @@ -463,6 +478,15 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA delete list.fields.scm_type; delete list.fields.last_updated; list.fields.name.columnClass = "col-md-11"; + list.maxVisiblePages = 5; + + return list; + } + ], + WorkflowInventorySourcesList: ['InventorySourcesList', + (InventorySourcesList) => { + let list = _.cloneDeep(InventorySourcesList); + list.maxVisiblePages = 5; return list; } diff --git a/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js b/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js index 945d1398a6..642dc26971 100644 --- a/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js +++ b/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js @@ -403,22 +403,22 @@ export default [ '$state','moment', if(d.job){ switch(d.job.status) { case "pending": - statusClass = "workflowChart-nodeStatus--running"; + statusClass += "workflowChart-nodeStatus--running"; break; case "waiting": - statusClass = "workflowChart-nodeStatus--running"; + statusClass += "workflowChart-nodeStatus--running"; break; case "running": - statusClass = "workflowChart-nodeStatus--running"; + statusClass += "workflowChart-nodeStatus--running"; break; case "successful": - statusClass = "workflowChart-nodeStatus--success"; + statusClass += "workflowChart-nodeStatus--success"; break; case "failed": - statusClass = "workflowChart-nodeStatus--failed"; + statusClass += "workflowChart-nodeStatus--failed"; break; case "error": - statusClass = "workflowChart-nodeStatus--failed"; + statusClass += "workflowChart-nodeStatus--failed"; break; } } @@ -660,7 +660,7 @@ export default [ '$state','moment', statusClass += "workflowChart-nodeStatus--failed"; break; case "error": - statusClass = "workflowChart-nodeStatus--failed"; + statusClass += "workflowChart-nodeStatus--failed"; break; } } diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js index 77caaa6032..e4cbfcd134 100644 --- a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js +++ b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js @@ -762,6 +762,12 @@ export default ['$scope', 'WorkflowService', 'generateList', 'TemplateList', 'Pr nodeToBeDeleted: $scope.nodeToBeDeleted }); + if($scope.workflowMakerFormConfig.nodeMode === "add") { + if($scope.placeholderNode.isRoot) { + $scope.edgeFlags.showTypeOptions = false; + } + } + if ($scope.nodeToBeDeleted.isNew !== true) { $scope.treeData.data.deletedNodes.push($scope.nodeToBeDeleted.nodeId); } diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html index a27d28eb0e..099d03ae10 100644 --- a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html +++ b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html @@ -86,6 +86,6 @@
- +
diff --git a/awx/ui/client/src/widgets/Stream.js b/awx/ui/client/src/widgets/Stream.js index 5c2a6892ec..a41b14b462 100644 --- a/awx/ui/client/src/widgets/Stream.js +++ b/awx/ui/client/src/widgets/Stream.js @@ -76,7 +76,8 @@ angular.module('StreamWidget', ['RestServices', 'Utilities', 'StreamListDefiniti } break; case 'notification_template': - throw {name : 'NotImplementedError', message : 'activity.summary_fields to build this url not implemented yet'}; + url += `notification_templates/${obj.id}`; + break; case 'role': throw {name : 'NotImplementedError', message : 'role object management is not consolidated to a single UI view'}; default: @@ -92,8 +93,8 @@ angular.module('StreamWidget', ['RestServices', 'Utilities', 'StreamListDefiniti } ]) -.factory('BuildDescription', ['BuildAnchor', '$log', - function (BuildAnchor, $log) { +.factory('BuildDescription', ['BuildAnchor', '$log', 'i18n', + function (BuildAnchor, $log, i18n) { return function (activity) { var pastTense = function(operation){ @@ -212,7 +213,7 @@ angular.module('StreamWidget', ['RestServices', 'Utilities', 'StreamListDefiniti } catch(err){ $log.debug(err); - activity.description = 'Event summary not available'; + activity.description = i18n._('Event summary not available'); } }; } @@ -264,132 +265,10 @@ angular.module('StreamWidget', ['RestServices', 'Utilities', 'StreamListDefiniti BuildDescription, ShowDetail) { return function (params) { - var list = _.cloneDeep(StreamList), - defaultUrl = GetBasePath('activity_stream'), - scope = params.scope, - url = (params && params.url) ? params.url : null; + var scope = params.scope; $rootScope.flashMessage = null; - if (url) { - defaultUrl = url; - } else { - - if($state.params && $state.params.target) { - if($state.params.id) { - // We have a type and an ID - defaultUrl += '?' + $state.params.target + '__id=' + $state.params.id; - } - else { - // We just have a type - if ($state.params.target === 'inventory_script') { - defaultUrl += '?or__object1__in=custom_inventory_script&or__object2__in=custom_inventory_script'; - } else if ($state.params.target === 'management_job') { - defaultUrl += '?or__object1__in=job&or__object2__in=job'; - } else if ($state.params.target === 'template') { - defaultUrl += '?or__object1__in=job_template,workflow_job_template&or__object2__in=job_template,workflow_job_template'; - } else { - defaultUrl += '?or__object1__in=' + $state.params.target + '&or__object2__in=' + $state.params.target; - } - } - } - } - - if ($state.params.target === 'credential') { - list.fields.customSearchField = { - label: 'Credential', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'credential', - sourceField: 'name' - }; - } else if ($state.params.target === 'host') { - list.fields.customSearchField = { - label: 'Host', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'host', - sourceField: 'name' - }; - } else if ($state.params.target === 'inventory') { - list.fields.customSearchField = { - label: 'Inventory', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'inventory', - sourceField: 'name' - }; - } else if ($state.params.target === 'inventory_script') { - list.fields.customSearchField = { - label: 'Inventory Script', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'custom_inventory_script', - sourceField: 'name' - }; - } else if ($state.params.target === 'job_template') { - list.fields.customSearchField = { - label: 'Job Template', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'job_template', - sourceField: 'name' - }; - } else if ($state.params.target === 'job') { - list.fields.customSearchField = { - label: 'Job', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'job', - sourceField: 'name' - }; - } else if ($state.params.target === 'organization') { - list.fields.customSearchField = { - label: 'Organization', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'organization', - sourceField: 'name' - }; - } else if ($state.params.target === 'project') { - list.fields.customSearchField = { - label: 'Project', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'project', - sourceField: 'name' - }; - } else if ($state.params.target === 'schedule') { - list.fields.customSearchField = { - label: 'Schedule', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'schedule', - sourceField: 'name' - }; - } else if ($state.params.target === 'team') { - list.fields.customSearchField = { - label: 'Team', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'team', - sourceField: 'name' - }; - } else if ($state.params.target === 'user') { - list.fields.customSearchField = { - label: 'User', - searchType: 'text', - searchOnly: 'true', - sourceModel: 'user', - sourceField: 'username' - }; - } - - list.basePath = defaultUrl; - - // Generate the list - //view.inject(list, { mode: 'edit', id: 'stream-content', searchSize: 'col-lg-4 col-md-4 col-sm-12 col-xs-12', secondWidget: true, activityStream: true, scope: scope }); - // descriptive title describing what AS is showing scope.streamTitle = (params && params.title) ? params.title : null; diff --git a/awx/ui/client/src/workflow-results/main.js b/awx/ui/client/src/workflow-results/main.js index 7faf366fc9..f01c60ccaf 100644 --- a/awx/ui/client/src/workflow-results/main.js +++ b/awx/ui/client/src/workflow-results/main.js @@ -7,10 +7,12 @@ import workflowStatusBar from './workflow-status-bar/main'; import route from './workflow-results.route.js'; import workflowResultsService from './workflow-results.service'; +import controller from './workflow-results.controller'; export default angular.module('workflowResults', [workflowStatusBar.name]) .run(['$stateExtender', function($stateExtender) { $stateExtender.addState(route); }]) + .controller('workflowResultsController', controller) .service('workflowResultsService', workflowResultsService); diff --git a/awx/ui/client/src/workflow-results/workflow-results.controller.js b/awx/ui/client/src/workflow-results/workflow-results.controller.js index 43d4423a9f..be6a67c0ca 100644 --- a/awx/ui/client/src/workflow-results/workflow-results.controller.js +++ b/awx/ui/client/src/workflow-results/workflow-results.controller.js @@ -10,6 +10,7 @@ export default ['workflowData', 'count', '$state', 'i18n', + 'moment', function(workflowData, workflowResultsService, workflowDataOptions, @@ -21,22 +22,34 @@ export default ['workflowData', WorkflowService, count, $state, - i18n + i18n, + moment ) { + var runTimeElapsedTimer = null; var getTowerLinks = function() { var getTowerLink = function(key) { - if ($scope.workflow.related[key]) { - return '/#/' + $scope.workflow.related[key] - .split('api/v1/')[1]; + if(key === 'schedule') { + if($scope.workflow.related.schedule) { + return '/#/templates/workflow_job_template/' + $scope.workflow.workflow_job_template + '/schedules' + $scope.workflow.related.schedule.split('api/v1/schedules')[1]; + } + else { + return null; + } } else { - return null; + if ($scope.workflow.related[key]) { + return '/#/' + $scope.workflow.related[key] + .split('api/v1/')[1]; + } else { + return null; + } } }; $scope.workflow_template_link = '/#/templates/workflow_job_template/'+$scope.workflow.workflow_job_template; $scope.created_by_link = getTowerLink('created_by'); + $scope.scheduled_by_link = getTowerLink('schedule'); $scope.cloud_credential_link = getTowerLink('cloud_credential'); $scope.network_credential_link = getTowerLink('network_credential'); }; @@ -57,6 +70,10 @@ export default ['workflowData', $scope.verbosity_label = getTowerLabel('verbosity'); }; + var updateWorkflowJobElapsedTimer = function(time) { + $scope.workflow.elapsed = time; + }; + function init() { // put initially resolved request data on scope $scope.workflow = workflowData; @@ -66,6 +83,11 @@ export default ['workflowData', $scope.count = count.val; $scope.showManualControls = false; + // Start elapsed time updater for job known to be running + if ($scope.workflow.started !== null && $scope.workflow.status === 'running') { + runTimeElapsedTimer = workflowResultsService.createOneSecondTimer($scope.workflow.started, updateWorkflowJobElapsedTimer); + } + // stdout full screen toggle tooltip text $scope.toggleStdoutFullscreenTooltip = i18n._("Expand Output"); @@ -169,8 +191,12 @@ export default ['workflowData', // Update the workflow job's unified job: if (parseInt(data.unified_job_id, 10) === parseInt($scope.workflow.id,10)) { $scope.workflow.status = data.status; + // start internval counter for job that transitioned to running + if ($scope.workflow.status === 'running') { + runTimeElapsedTimer = workflowResultsService.createOneSecondTimer(moment(), updateWorkflowJobElapsedTimer); + } - if(data.status === "successful" || data.status === "failed"){ + if(data.status === "successful" || data.status === "failed" || data.status === "error"){ $state.go('.', null, { reload: true }); } } @@ -198,4 +224,8 @@ export default ['workflowData', $scope.$broadcast("refreshWorkflowChart"); } }); + + $scope.$on('$destroy', function() { + workflowResultsService.destroyTimer(runTimeElapsedTimer); + }); }]; diff --git a/awx/ui/client/src/workflow-results/workflow-results.partial.html b/awx/ui/client/src/workflow-results/workflow-results.partial.html index f63021037a..5d0bbf87f9 100644 --- a/awx/ui/client/src/workflow-results/workflow-results.partial.html +++ b/awx/ui/client/src/workflow-results/workflow-results.partial.html @@ -26,7 +26,7 @@ data-placement="top" mode="all" ng-click="relaunchJob()" - aw-tool-tip="Relaunch using the same parameters" + aw-tool-tip="{{'Relaunch using the same parameters'|translate}}" data-original-title="" title=""> @@ -36,10 +36,10 @@ @@ -49,9 +49,9 @@ List-actionButton--delete" data-placement="top" ng-click="deleteJob()" - ng-hide="job_status.status == 'running' || - job_status.status == 'pending' " - aw-tool-tip="Delete" + ng-hide="workflow.status == 'running' || + workflow.status == 'pending' " + aw-tool-tip="{{'Delete'|translate}}" data-original-title="" title=""> @@ -106,13 +106,28 @@
+ +
Extra Variables diff --git a/awx/ui/client/src/workflow-results/workflow-results.route.js b/awx/ui/client/src/workflow-results/workflow-results.route.js index 904584ec25..cbf8778b34 100644 --- a/awx/ui/client/src/workflow-results/workflow-results.route.js +++ b/awx/ui/client/src/workflow-results/workflow-results.route.js @@ -52,7 +52,30 @@ export default { Rest.setUrl(workflowData.related.workflow_nodes); Rest.get() .success(function(data) { - defer.resolve(data.results); + if(data.next) { + let allNodes = data.results; + let getNodes = function(nextUrl){ + // Get the workflow nodes + Rest.setUrl(nextUrl); + Rest.get() + .success(function(nextData) { + for(var i=0; i=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, + "fsevents": { + "version": "1.0.17", + "from": "fsevents@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.17.tgz", + "optional": true, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "from": "abbrev@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "optional": true + }, + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + }, + "ansi-styles": { + "version": "2.2.1", + "from": "ansi-styles@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "optional": true + }, + "aproba": { + "version": "1.0.4", + "from": "aproba@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.2", + "from": "are-we-there-yet@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", + "optional": true + }, + "asn1": { + "version": "0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "from": "assert-plus@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "from": "asynckit@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "from": "aws-sign2@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "optional": true + }, + "aws4": { + "version": "1.5.0", + "from": "aws4@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.5.0.tgz", + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "from": "balanced-match@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "bcrypt-pbkdf": { + "version": "1.0.0", + "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz", + "optional": true + }, + "block-stream": { + "version": "0.0.9", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" + }, + "boom": { + "version": "2.10.1", + "from": "boom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + }, + "brace-expansion": { + "version": "1.1.6", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" + }, + "buffer-shims": { + "version": "1.0.0", + "from": "buffer-shims@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz" + }, + "caseless": { + "version": "0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "optional": true + }, + "chalk": { + "version": "1.1.3", + "from": "chalk@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "optional": true, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "from": "code-point-at@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" + }, + "commander": { + "version": "2.9.0", + "from": "commander@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + }, + "console-control-strings": { + "version": "1.1.0", + "from": "console-control-strings@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + }, + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "optional": true + }, + "dashdash": { + "version": "1.14.1", + "from": "dashdash@>=1.12.0 <2.0.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "optional": true + } + } + }, + "debug": { + "version": "2.2.0", + "from": "debug@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "optional": true + }, + "deep-extend": { + "version": "0.4.1", + "from": "deep-extend@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + }, + "delegates": { + "version": "1.0.0", + "from": "delegates@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "from": "ecc-jsbn@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "optional": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "optional": true + }, + "extend": { + "version": "3.0.0", + "from": "extend@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "from": "extsprintf@1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + }, + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "optional": true + }, + "form-data": { + "version": "2.1.2", + "from": "form-data@>=2.1.1 <2.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", + "optional": true + }, + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + }, + "fstream": { + "version": "1.0.10", + "from": "fstream@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz" + }, + "fstream-ignore": { + "version": "1.0.5", + "from": "fstream-ignore@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "optional": true + }, + "gauge": { + "version": "2.7.2", + "from": "gauge@>=2.7.1 <2.8.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.2.tgz", + "optional": true + }, + "generate-function": { + "version": "2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "optional": true + }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "optional": true + }, + "getpass": { + "version": "0.1.6", + "from": "getpass@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "optional": true + } + } + }, + "glob": { + "version": "7.1.1", + "from": "glob@>=7.0.5 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" + }, + "graceful-fs": { + "version": "4.1.11", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + }, + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>=1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "optional": true + }, + "har-validator": { + "version": "2.0.6", + "from": "har-validator@>=2.0.6 <2.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "optional": true + }, + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "optional": true + }, + "has-unicode": { + "version": "2.0.1", + "from": "has-unicode@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "optional": true + }, + "hawk": { + "version": "3.1.3", + "from": "hawk@>=3.1.3 <3.2.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "optional": true + }, + "hoek": { + "version": "2.16.3", + "from": "hoek@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "http-signature": { + "version": "1.1.1", + "from": "http-signature@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "optional": true + }, + "inflight": { + "version": "1.0.6", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + }, + "inherits": { + "version": "2.0.3", + "from": "inherits@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + }, + "ini": { + "version": "1.3.4", + "from": "ini@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + }, + "is-my-json-valid": { + "version": "2.15.0", + "from": "is-my-json-valid@>=2.12.4 <3.0.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", + "optional": true + }, + "is-property": { + "version": "1.0.2", + "from": "is-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "from": "is-typedarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, + "isstream": { + "version": "0.1.2", + "from": "isstream@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "from": "jodid25519@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "optional": true + }, + "jsbn": { + "version": "0.1.0", + "from": "jsbn@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "from": "json-schema@0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@>=5.0.1 <5.1.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "optional": true + }, + "jsonpointer": { + "version": "4.0.1", + "from": "jsonpointer@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "optional": true + }, + "jsprim": { + "version": "1.3.1", + "from": "jsprim@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", + "optional": true + }, + "mime-db": { + "version": "1.25.0", + "from": "mime-db@>=1.25.0 <1.26.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz" + }, + "mime-types": { + "version": "2.1.13", + "from": "mime-types@>=2.1.7 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz" + }, + "minimatch": { + "version": "3.0.3", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + }, + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.32", + "from": "node-pre-gyp@>=0.6.29 <0.7.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz", + "optional": true + }, + "nopt": { + "version": "3.0.6", + "from": "nopt@>=3.0.6 <3.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "optional": true + }, + "npmlog": { + "version": "4.0.2", + "from": "npmlog@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", + "optional": true + }, + "number-is-nan": { + "version": "1.0.1", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + }, + "oauth-sign": { + "version": "0.8.2", + "from": "oauth-sign@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "optional": true + }, + "object-assign": { + "version": "4.1.0", + "from": "object-assign@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "optional": true + }, + "once": { + "version": "1.4.0", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + }, + "path-is-absolute": { + "version": "1.0.1", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + }, + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "optional": true + }, + "pinkie-promise": { + "version": "2.0.1", + "from": "pinkie-promise@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "from": "process-nextick-args@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" + }, + "punycode": { + "version": "1.4.1", + "from": "punycode@>=1.4.1 <2.0.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "optional": true + }, + "qs": { + "version": "6.3.0", + "from": "qs@>=6.3.0 <6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz", + "optional": true + }, + "rc": { + "version": "1.1.6", + "from": "rc@>=1.1.6 <1.2.0", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", + "optional": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.2", + "from": "readable-stream@>=2.0.0 <3.0.0||>=1.1.13 <2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz", + "optional": true + }, + "request": { + "version": "2.79.0", + "from": "request@>=2.79.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "optional": true + }, + "rimraf": { + "version": "2.5.4", + "from": "rimraf@>=2.5.4 <2.6.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz" + }, + "semver": { + "version": "5.3.0", + "from": "semver@>=5.3.0 <5.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "from": "set-blocking@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "from": "signal-exit@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "optional": true + }, + "sshpk": { + "version": "1.10.1", + "from": "sshpk@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz", + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "optional": true + } + } + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "string-width": { + "version": "1.0.2", + "from": "string-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + }, + "stringstream": { + "version": "0.0.5", + "from": "stringstream@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, + "strip-json-comments": { + "version": "1.0.4", + "from": "strip-json-comments@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "optional": true + }, + "supports-color": { + "version": "0.2.0", + "from": "supports-color@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "optional": true + }, + "tar": { + "version": "2.2.1", + "from": "tar@>=2.2.1 <2.3.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" + }, + "tar-pack": { + "version": "3.3.0", + "from": "tar-pack@>=3.3.0 <3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.3.0.tgz", + "optional": true, + "dependencies": { + "once": { + "version": "1.3.3", + "from": "once@>=1.3.3 <1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "optional": true + }, + "readable-stream": { + "version": "2.1.5", + "from": "readable-stream@>=2.1.4 <2.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "optional": true + } + } + }, + "tough-cookie": { + "version": "2.3.2", + "from": "tough-cookie@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "optional": true + }, + "tunnel-agent": { + "version": "0.4.3", + "from": "tunnel-agent@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "from": "tweetnacl@>=0.14.0 <0.15.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "from": "uid-number@>=0.0.6 <0.1.0", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + }, + "uuid": { + "version": "3.0.1", + "from": "uuid@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "optional": true + }, + "verror": { + "version": "1.3.6", + "from": "verror@1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "optional": true + }, + "wide-align": { + "version": "1.1.0", + "from": "wide-align@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", + "optional": true + }, + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + }, + "xtend": { + "version": "4.0.1", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "optional": true + } + } + }, "gaze": { "version": "1.1.2", "from": "gaze@>=1.0.0 <2.0.0", @@ -2915,9 +3617,9 @@ "resolved": "https://registry.npmjs.org/jstimezonedetect/-/jstimezonedetect-1.0.5.tgz" }, "karma": { - "version": "1.4.0", - "from": "karma@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.4.0.tgz", + "version": "1.4.1", + "from": "karma@1.4.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.4.1.tgz", "dev": true, "dependencies": { "after": { @@ -3100,7 +3802,7 @@ }, "karma-jasmine": { "version": "1.1.0", - "from": "karma-jasmine@>=1.0.2 <2.0.0", + "from": "karma-jasmine@1.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.0.tgz", "dev": true }, diff --git a/awx/ui/package.json b/awx/ui/package.json index ff96d33b42..7095b616a4 100644 --- a/awx/ui/package.json +++ b/awx/ui/package.json @@ -52,17 +52,17 @@ "grunt-newer": "^1.2.0", "grunt-webpack": "^1.0.11", "imports-loader": "^0.6.5", - "jasmine-core": "^2.4.1", + "jasmine-core": "^2.5.2", "jshint": "^2.9.4", "jshint-loader": "^0.8.3", "jshint-stylish": "^2.2.0", - "karma": "^1.1.2", + "karma": "^1.4.1", "karma-chrome-launcher": "^1.0.1", "karma-coverage": "^1.1.1", "karma-firefox-launcher": "^1.0.0", "karma-html2js-preprocessor": "^1.0.0", - "karma-jasmine": "^1.0.2", - "karma-junit-reporter": "^1.1.0", + "karma-jasmine": "^1.1.0", + "karma-junit-reporter": "^1.2.0", "karma-phantomjs-launcher": "^1.0.2", "karma-sauce-launcher": "^1.0.0", "karma-sourcemap-loader": "^0.3.7", diff --git a/awx/ui/po/ansible-tower-ui.pot b/awx/ui/po/ansible-tower-ui.pot index 1d0e6f72bf..fd770dd0ff 100644 --- a/awx/ui/po/ansible-tower-ui.pot +++ b/awx/ui/po/ansible-tower-ui.pot @@ -4,7 +4,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" -#: client/src/notifications/notificationTemplates.form.js:372 +#: client/src/notifications/notificationTemplates.form.js:375 msgid "%s or %s" msgstr "" @@ -26,42 +26,74 @@ msgstr "" msgid "+ ADD" msgstr "" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 +msgid "A schedule name is required." +msgstr "" + #: client/src/controllers/Users.js:185 msgid "A value is required" msgstr "" -#: client/src/forms/Credentials.js:449 -#: client/src/forms/Inventories.js:153 -#: client/src/forms/JobTemplates.js:427 -#: client/src/forms/Organizations.js:75 -#: client/src/forms/Projects.js:237 +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:167 +msgid "A value is required." +msgstr "" + +#: client/src/about/about.route.js:10 +msgid "ABOUT" +msgstr "" + +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:16 +msgid "ACTION" +msgstr "" + +#: client/src/activity-stream/activitystream.route.js:27 +msgid "ACTIVITY STREAM" +msgstr "" + +#: client/src/forms/Credentials.js:450 +#: client/src/forms/JobTemplates.js:430 +#: client/src/forms/Organizations.js:76 +#: client/src/forms/Projects.js:238 #: client/src/forms/Teams.js:85 -#: client/src/forms/Workflows.js:127 +#: client/src/forms/Workflows.js:128 #: client/src/inventory-scripts/inventory-scripts.list.js:45 #: client/src/lists/Credentials.js:60 #: client/src/lists/Inventories.js:68 #: client/src/lists/Projects.js:77 +#: client/src/lists/Schedules.js:70 #: client/src/lists/Teams.js:50 #: client/src/lists/Templates.js:62 #: client/src/lists/Users.js:58 -#: client/src/notifications/notificationTemplates.list.js:53 +#: client/src/notifications/notificationTemplates.list.js:52 msgid "ADD" msgstr "" -#: client/src/notifications/notifications.list.js:68 +#: client/src/notifications/notifications.list.js:66 msgid "ADD NOTIFICATION TEMPLATE" msgstr "" #: client/src/forms/Teams.js:157 -#: client/src/forms/Users.js:212 +#: client/src/forms/Users.js:213 msgid "ADD PERMISSIONS" msgstr "" +#: client/src/shared/smart-search/smart-search.partial.html:54 +msgid "ADDITIONAL INFORMATION:" +msgstr "" + +#: client/src/organizations/linkout/organizations-linkout.route.js:363 +msgid "ADMINS" +msgstr "" + +#: client/src/helpers/ActivityStream.js:19 +msgid "ALL ACTIVITY" +msgstr "" + #: client/src/forms/Credentials.js:199 msgid "API Key" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:248 +#: client/src/notifications/notificationTemplates.form.js:251 msgid "API Service/Integration Key" msgstr "" @@ -77,16 +109,20 @@ msgstr "" msgid "Access Key" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:226 +#: client/src/notifications/notificationTemplates.form.js:229 msgid "Account SID" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:184 +#: client/src/notifications/notificationTemplates.form.js:187 msgid "Account Token" msgstr "" +#: client/src/forms/ActivityDetail.js:38 +msgid "Action" +msgstr "" + #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:20 -#: client/src/shared/list-generator/list-generator.factory.js:542 +#: client/src/shared/list-generator/list-generator.factory.js:546 msgid "Actions" msgstr "" @@ -95,15 +131,21 @@ msgstr "" msgid "Activity" msgstr "" +#: client/src/forms/ActivityDetail.js:25 +msgid "Activity Detail" +msgstr "" + #: client/src/configuration/system-form/configuration-system.controller.js:81 +#: client/src/lists/Streams.js:16 +#: client/src/lists/Streams.js:17 msgid "Activity Stream" msgstr "" -#: client/src/forms/Inventories.js:104 -#: client/src/forms/Inventories.js:150 -#: client/src/forms/Organizations.js:72 +#: client/src/forms/Inventories.js:105 +#: client/src/forms/Organizations.js:73 #: client/src/forms/Teams.js:82 -#: client/src/forms/Workflows.js:124 +#: client/src/forms/Workflows.js:125 +#: client/src/organizations/linkout/addUsers/addUsers.partial.html:8 msgid "Add" msgstr "" @@ -119,17 +161,21 @@ msgstr "" msgid "Add Inventories" msgstr "" -#: client/src/notifications/notifications.list.js:63 +#: client/src/notifications/notifications.list.js:61 msgid "Add Notification" msgstr "" +#: client/src/shared/stateDefinitions.factory.js:277 +msgid "Add Permissions" +msgstr "" + #: client/src/lists/Projects.js:15 msgid "Add Project" msgstr "" -#: client/src/forms/JobTemplates.js:472 -#: client/src/forms/Workflows.js:172 -#: client/src/shared/form-generator.js:1708 +#: client/src/forms/JobTemplates.js:475 +#: client/src/forms/Workflows.js:173 +#: client/src/shared/form-generator.js:1719 msgid "Add Survey" msgstr "" @@ -142,16 +188,21 @@ msgid "Add User" msgstr "" #: client/src/lists/Users.js:25 +#: client/src/shared/stateDefinitions.factory.js:342 +#: client/src/shared/stateDefinitions.factory.js:511 msgid "Add Users" msgstr "" -#: client/src/forms/Credentials.js:447 -#: client/src/forms/Inventories.js:106 -#: client/src/forms/Inventories.js:151 -#: client/src/forms/JobTemplates.js:425 -#: client/src/forms/Organizations.js:73 -#: client/src/forms/Projects.js:235 -#: client/src/forms/Workflows.js:125 +#: client/src/lists/Schedules.js:68 +msgid "Add a new schedule" +msgstr "" + +#: client/src/forms/Credentials.js:448 +#: client/src/forms/Inventories.js:107 +#: client/src/forms/JobTemplates.js:428 +#: client/src/forms/Organizations.js:74 +#: client/src/forms/Projects.js:236 +#: client/src/forms/Workflows.js:126 msgid "Add a permission" msgstr "" @@ -159,7 +210,7 @@ msgstr "" msgid "Add passwords, SSH keys, etc. for Tower to use when launching jobs against machines, or when syncing inventories or projects." msgstr "" -#: client/src/shared/form-generator.js:1451 +#: client/src/shared/form-generator.js:1462 msgid "Admin" msgstr "" @@ -167,15 +218,24 @@ msgstr "" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:43 #: client/src/dashboard/graphs/dashboard-graphs.partial.html:65 #: client/src/dashboard/graphs/dashboard-graphs.partial.html:74 +#: client/src/job-detail/job-detail.partial.html:197 +#: client/src/job-detail/job-detail.partial.html:256 +#: client/src/job-detail/job-detail.partial.html:340 msgid "All" msgstr "" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 +msgid "All Activity" +msgstr "" + +#: client/src/lists/AllJobs.js:16 #: client/src/portal-mode/portal-mode-jobs.partial.html:7 +#: client/src/portal-mode/portal-mode-layout.partial.html:12 msgid "All Jobs" msgstr "" -#: client/src/forms/JobTemplates.js:301 -#: client/src/forms/JobTemplates.js:308 +#: client/src/forms/JobTemplates.js:303 +#: client/src/forms/JobTemplates.js:310 msgid "Allow Provisioning Callbacks" msgstr "" @@ -191,6 +251,22 @@ msgstr "" msgid "An SCM update does not appear to be running for project: %s. Click the %sRefresh%s button to view the latest status." msgstr "" +#: client/src/controllers/Credentials.js:105 +msgid "Are you sure you want to delete the credential below?" +msgstr "" + +#: client/src/helpers/Jobs.js:231 +msgid "Are you sure you want to delete the job below?" +msgstr "" + +#: client/src/notifications/notification-templates-list/list.controller.js:184 +msgid "Are you sure you want to delete the notification template below?" +msgstr "" + +#: client/src/organizations/list/organizations-list.controller.js:166 +msgid "Are you sure you want to delete the organization below?" +msgstr "" + #: client/src/controllers/Projects.js:202 msgid "Are you sure you want to delete the project below?" msgstr "" @@ -199,10 +275,15 @@ msgstr "" msgid "Are you sure you want to delete the user below?" msgstr "" +#: client/src/controllers/Credentials.js:579 #: client/src/controllers/Projects.js:687 msgid "Are you sure you want to remove the %s below from %s?" msgstr "" +#: client/src/forms/EventsViewer.js:57 +msgid "Arguments" +msgstr "" + #: client/src/forms/Credentials.js:233 #: client/src/forms/Credentials.js:272 #: client/src/forms/Credentials.js:312 @@ -210,10 +291,14 @@ msgstr "" msgid "Ask at runtime?" msgstr "" -#: client/src/shared/form-generator.js:1453 +#: client/src/shared/form-generator.js:1464 msgid "Auditor" msgstr "" +#: client/src/configuration/configuration.partial.html:15 +msgid "Authentication" +msgstr "" + #: client/src/forms/Credentials.js:73 msgid "Authentication for network device access. This can include SSH keys, usernames, passwords, and authorize information. Network credentials are used when submitting jobs to run playbooks against network devices." msgstr "" @@ -234,11 +319,15 @@ msgstr "" msgid "Azure AD" msgstr "" +#: client/src/shared/directives.js:133 +msgid "BROWSE" +msgstr "" + #: client/src/forms/Projects.js:80 msgid "Base path used for locating playbooks. Directories found inside this path will be listed in the playbook directory drop-down. Together the base path and selected playbook directory provide the full path used to locate playbooks." msgstr "" -#: client/src/forms/JobTemplates.js:295 +#: client/src/forms/JobTemplates.js:297 msgid "Become Privilege Escalation" msgstr "" @@ -246,7 +335,41 @@ msgstr "" msgid "Browse" msgstr "" -#: client/src/app.js:316 +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:20 +msgid "CHANGES" +msgstr "" + +#: client/src/shared/smart-search/smart-search.partial.html:31 +msgid "CLEAR ALL" +msgstr "" + +#: client/src/inventories/manage/copy-move/copy-move.route.js:29 +#: client/src/inventories/manage/copy-move/copy-move.route.js:65 +msgid "COPY OR MOVE" +msgstr "" + +#: client/src/shared/stateDefinitions.factory.js:153 +msgid "CREATE %s" +msgstr "" + +#: client/src/inventories/main.js:110 +#: client/src/scheduler/main.js:176 +#: client/src/scheduler/main.js:253 +#: client/src/scheduler/main.js:90 +msgid "CREATE SCHEDULE" +msgstr "" + +#: client/src/management-jobs/scheduler/main.js:74 +msgid "CREATE SCHEDULED JOB" +msgstr "" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:80 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:82 +msgid "CREDENTIAL" +msgstr "" + +#: client/src/app.js:319 +#: client/src/helpers/ActivityStream.js:29 msgid "CREDENTIALS" msgstr "" @@ -276,12 +399,20 @@ msgstr "" msgid "Call to %s failed. POST status:" msgstr "" +#: client/src/management-jobs/card/card.controller.js:30 +msgid "Call to %s failed. Return status: %d" +msgstr "" + #: client/src/controllers/Projects.js:266 msgid "Call to get project failed. GET status:" msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:171 #: client/src/configuration/configuration.controller.js:449 -#: client/src/shared/form-generator.js:1696 +#: client/src/helpers/Jobs.js:161 +#: client/src/shared/form-generator.js:1707 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:12 +#: client/src/workflow-results/workflow-results.partial.html:42 msgid "Cancel" msgstr "" @@ -289,22 +420,40 @@ msgstr "" msgid "Cancel Not Allowed" msgstr "" -#: client/src/lists/Projects.js:123 +#: client/src/lists/Projects.js:122 msgid "Cancel the SCM update" msgstr "" +#: client/src/lists/AllJobs.js:108 +msgid "Cancel the job" +msgstr "" + #: client/src/controllers/Projects.js:82 +#: client/src/helpers/Projects.js:79 msgid "Canceled. Click for details" msgstr "" +#: client/src/shared/smart-search/smart-search.controller.js:38 +#: client/src/shared/smart-search/smart-search.controller.js:80 +msgid "Cannot search running job" +msgstr "" + #: client/src/forms/Projects.js:82 msgid "Change %s under \"Configure Tower\" to change this location." msgstr "" -#: client/src/shared/form-generator.js:1082 +#: client/src/forms/ActivityDetail.js:43 +msgid "Changes" +msgstr "" + +#: client/src/shared/form-generator.js:1083 msgid "Choose a %s" msgstr "" +#: client/src/shared/directives.js:134 +msgid "Choose file" +msgstr "" + #: client/src/license/license.partial.html:97 msgid "Choose your license file, agree to the End User License Agreement, and click submit." msgstr "" @@ -329,7 +478,7 @@ msgstr "" msgid "Client ID" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:259 +#: client/src/notifications/notificationTemplates.form.js:262 msgid "Client Identifier" msgstr "" @@ -337,12 +486,13 @@ msgstr "" msgid "Client Secret" msgstr "" -#: client/src/shared/form-generator.js:1700 +#: client/src/shared/form-generator.js:1711 msgid "Close" msgstr "" -#: client/src/forms/JobTemplates.js:166 -#: client/src/forms/JobTemplates.js:178 +#: client/src/forms/JobTemplates.js:168 +#: client/src/forms/JobTemplates.js:180 +#: client/src/job-detail/job-detail.partial.html:124 msgid "Cloud Credential" msgstr "" @@ -351,13 +501,13 @@ msgstr "" msgid "CloudForms URL" msgstr "" -#: client/src/job-results/job-results.controller.js:193 +#: client/src/job-results/job-results.controller.js:205 #: client/src/standard-out/standard-out.controller.js:233 -#: client/src/workflow-results/workflow-results.controller.js:109 +#: client/src/workflow-results/workflow-results.controller.js:131 msgid "Collapse Output" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:295 +#: client/src/notifications/notificationTemplates.form.js:298 msgid "Color can be one of %s." msgstr "" @@ -369,6 +519,11 @@ msgstr "" msgid "Configure Notifications" msgstr "" +#: client/src/configuration/configuration.partial.html:10 +#: client/src/setup-menu/setup-menu.partial.html:53 +msgid "Configure Tower" +msgstr "" + #: client/src/forms/Users.js:82 msgid "Confirm Password" msgstr "" @@ -381,22 +536,22 @@ msgstr "" msgid "Confirm factory reset" msgstr "" -#: client/src/forms/JobTemplates.js:257 -#: client/src/forms/JobTemplates.js:275 +#: client/src/forms/JobTemplates.js:259 +#: client/src/forms/JobTemplates.js:277 #: client/src/forms/WorkflowMaker.js:141 #: client/src/forms/WorkflowMaker.js:156 msgid "Consult the Ansible documentation for further details on the usage of tags." msgstr "" -#: client/src/forms/JobTemplates.js:243 +#: client/src/forms/JobTemplates.js:245 msgid "Control the level of output ansible will produce as the playbook executes." msgstr "" -#: client/src/lists/Templates.js:100 +#: client/src/lists/Templates.js:99 msgid "Copy" msgstr "" -#: client/src/lists/Templates.js:103 +#: client/src/lists/Templates.js:102 msgid "Copy template" msgstr "" @@ -420,8 +575,8 @@ msgstr "" msgid "Create a new inventory" msgstr "" -#: client/src/notifications/notificationTemplates.list.js:51 -#: client/src/notifications/notifications.list.js:66 +#: client/src/notifications/notificationTemplates.list.js:50 +#: client/src/notifications/notifications.list.js:64 msgid "Create a new notification template" msgstr "" @@ -453,46 +608,76 @@ msgstr "" msgid "Create templates for sending notifications with Email, HipChat, Slack, and SMS." msgstr "" -#: client/src/forms/JobTemplates.js:156 +#: client/src/forms/EventsViewer.js:32 +#: client/src/lists/JobEvents.js:44 +msgid "Created On" +msgstr "" + +#: client/src/forms/JobTemplates.js:157 #: client/src/forms/WorkflowMaker.js:60 #: client/src/forms/WorkflowMaker.js:69 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:67 msgid "Credential" msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:123 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:57 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 #: client/src/lists/Credentials.js:18 #: client/src/lists/Credentials.js:19 #: client/src/setup-menu/setup-menu.partial.html:22 msgid "Credentials" msgstr "" -#: client/src/controllers/Credentials.js:345 +#: client/src/controllers/Credentials.js:349 msgid "Credentials are only shared within an organization. Assign credentials to an organization to delegate credential permissions. The organization cannot be edited after credentials are assigned." msgstr "" -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 +#: client/src/inventory-scripts/inventory-scripts.form.js:53 +#: client/src/inventory-scripts/inventory-scripts.form.js:63 msgid "Custom Script" msgstr "" -#: client/src/app.js:408 +#: client/src/shared/directives.js:135 +msgid "Custom logo has been uploaded" +msgstr "" + +#: client/src/app.js:410 msgid "DASHBOARD" msgstr "" +#: client/src/controllers/Credentials.js:107 +#: client/src/controllers/Credentials.js:581 #: client/src/controllers/Projects.js:689 #: client/src/controllers/Users.js:104 +#: client/src/notifications/notification-templates-list/list.controller.js:189 +#: client/src/organizations/list/organizations-list.controller.js:168 msgid "DELETE" msgstr "" +#: client/src/job-detail/job-detail.partial.html:176 +#: client/src/job-detail/job-detail.partial.html:179 +msgid "DETAILS" +msgstr "" + +#: client/src/controllers/Credentials.js:104 +#: client/src/controllers/Credentials.js:578 #: client/src/controllers/Projects.js:201 #: client/src/controllers/Projects.js:686 #: client/src/controllers/Users.js:101 +#: client/src/helpers/Jobs.js:165 #: client/src/inventory-scripts/inventory-scripts.list.js:74 #: client/src/lists/Credentials.js:91 #: client/src/lists/Inventories.js:92 +#: client/src/lists/Schedules.js:92 #: client/src/lists/Teams.js:77 -#: client/src/lists/Templates.js:125 +#: client/src/lists/Templates.js:124 #: client/src/lists/Users.js:87 -#: client/src/notifications/notificationTemplates.list.js:90 +#: client/src/notifications/notification-templates-list/list.controller.js:186 +#: client/src/notifications/notificationTemplates.list.js:89 +#: client/src/organizations/list/organizations-list.controller.js:165 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:13 +#: client/src/workflow-results/workflow-results.partial.html:54 msgid "Delete" msgstr "" @@ -508,7 +693,7 @@ msgstr "" msgid "Delete inventory script" msgstr "" -#: client/src/notifications/notificationTemplates.list.js:92 +#: client/src/notifications/notificationTemplates.list.js:91 msgid "Delete notification" msgstr "" @@ -516,14 +701,19 @@ msgstr "" msgid "Delete on Update" msgstr "" +#: client/src/lists/Schedules.js:95 +msgid "Delete schedule" +msgstr "" + #: client/src/lists/Teams.js:81 msgid "Delete team" msgstr "" -#: client/src/lists/Templates.js:128 +#: client/src/lists/Templates.js:127 msgid "Delete template" msgstr "" +#: client/src/lists/AllJobs.js:115 #: client/src/lists/CompletedJobs.js:82 msgid "Delete the job" msgstr "" @@ -532,11 +722,11 @@ msgstr "" msgid "Delete the local repository in its entirety prior to performing an update." msgstr "" -#: client/src/lists/Projects.js:117 +#: client/src/lists/Projects.js:116 msgid "Delete the project" msgstr "" -#: client/src/lists/ScheduledJobs.js:81 +#: client/src/lists/ScheduledJobs.js:82 msgid "Delete the schedule" msgstr "" @@ -557,35 +747,35 @@ msgstr "" #: client/src/forms/Users.js:143 #: client/src/forms/Users.js:168 #: client/src/forms/Workflows.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:32 +#: client/src/inventory-scripts/inventory-scripts.form.js:35 #: client/src/inventory-scripts/inventory-scripts.list.js:25 #: client/src/lists/Credentials.js:34 #: client/src/lists/PortalJobTemplates.js:29 #: client/src/lists/Teams.js:30 #: client/src/lists/Templates.js:36 -#: client/src/notifications/notificationTemplates.form.js:36 +#: client/src/notifications/notificationTemplates.form.js:39 msgid "Description" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:138 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/notifications/notificationTemplates.form.js:155 -#: client/src/notifications/notificationTemplates.form.js:160 -#: client/src/notifications/notificationTemplates.form.js:373 +#: client/src/notifications/notificationTemplates.form.js:141 +#: client/src/notifications/notificationTemplates.form.js:146 +#: client/src/notifications/notificationTemplates.form.js:158 +#: client/src/notifications/notificationTemplates.form.js:163 +#: client/src/notifications/notificationTemplates.form.js:376 msgid "Destination Channels" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:368 +#: client/src/notifications/notificationTemplates.form.js:371 msgid "Destination Channels or Users" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:209 -#: client/src/notifications/notificationTemplates.form.js:214 +#: client/src/notifications/notificationTemplates.form.js:212 +#: client/src/notifications/notificationTemplates.form.js:217 msgid "Destination SMS Number" msgstr "" #: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1482 +#: client/src/shared/form-generator.js:1493 msgid "Details" msgstr "" @@ -600,7 +790,7 @@ msgstr "" msgid "Dissasociate permission from team" msgstr "" -#: client/src/forms/Users.js:221 +#: client/src/forms/Users.js:222 msgid "Dissasociate permission from user" msgstr "" @@ -610,41 +800,73 @@ msgstr "" msgid "Domain Name" msgstr "" -#: client/src/job-results/job-results.controller.js:7 +#: client/src/job-detail/job-detail.partial.html:420 +#: client/src/job-results/job-results.controller.js:8 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:114 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:137 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:102 msgid "Download Output" msgstr "" -#: client/src/inventory-scripts/inventory-scripts.form.js:58 +#: client/src/inventory-scripts/inventory-scripts.form.js:61 msgid "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory." msgstr "" +#: client/src/management-jobs/scheduler/main.js:88 +msgid "EDIT SCHEDULED JOB" +msgstr "" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:46 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:66 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:59 +msgid "ELAPSED" +msgstr "" + +#: client/src/job-detail/job-detail.partial.html:391 +#: client/src/job-detail/job-detail.partial.html:394 +msgid "EVENT SUMMARY" +msgstr "" + +#: client/src/shared/smart-search/smart-search.partial.html:40 +msgid "EXAMPLES:" +msgstr "" + #: client/src/forms/Projects.js:174 msgid "Each time a job runs using this project, perform an update to the local repository prior to starting the job." msgstr "" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:63 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:62 #: client/src/inventory-scripts/inventory-scripts.list.js:57 #: client/src/lists/Credentials.js:72 #: client/src/lists/Inventories.js:78 +#: client/src/lists/Schedules.js:77 #: client/src/lists/Teams.js:60 -#: client/src/lists/Templates.js:108 +#: client/src/lists/Templates.js:107 #: client/src/lists/Users.js:68 -#: client/src/notifications/notificationTemplates.list.js:64 -#: client/src/notifications/notificationTemplates.list.js:73 +#: client/src/notifications/notificationTemplates.list.js:63 +#: client/src/notifications/notificationTemplates.list.js:72 msgid "Edit" msgstr "" -#: client/src/forms/JobTemplates.js:479 -#: client/src/forms/Workflows.js:179 -#: client/src/shared/form-generator.js:1712 +#: client/src/configuration/configuration.route.js:30 +msgid "Edit Configuration" +msgstr "" + +#: client/src/forms/JobTemplates.js:482 +#: client/src/forms/Workflows.js:180 +#: client/src/shared/form-generator.js:1723 msgid "Edit Survey" msgstr "" +#: client/src/setup-menu/setup-menu.partial.html:54 +msgid "Edit Tower's configuration." +msgstr "" + #: client/src/lists/Credentials.js:74 msgid "Edit credential" msgstr "" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:66 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:65 msgid "Edit host" msgstr "" @@ -656,23 +878,31 @@ msgstr "" msgid "Edit inventory script" msgstr "" -#: client/src/notifications/notificationTemplates.list.js:75 +#: client/src/notifications/notificationTemplates.list.js:74 msgid "Edit notification" msgstr "" +#: client/src/lists/Schedules.js:80 +msgid "Edit schedule" +msgstr "" + #: client/src/lists/Teams.js:64 msgid "Edit team" msgstr "" -#: client/src/lists/Templates.js:110 +#: client/src/lists/Templates.js:109 msgid "Edit template" msgstr "" -#: client/src/lists/Projects.js:104 +#: client/src/workflow-results/workflow-results.partial.html:109 +msgid "Edit the User" +msgstr "" + +#: client/src/lists/Projects.js:103 msgid "Edit the project" msgstr "" -#: client/src/lists/ScheduledJobs.js:67 +#: client/src/lists/ScheduledJobs.js:68 msgid "Edit the schedule" msgstr "" @@ -684,21 +914,29 @@ msgstr "" msgid "Either you do not have access or the SCM update process completed. Click the %sRefresh%s button to view the latest status." msgstr "" +#: client/src/forms/EventsViewer.js:81 +#: client/src/forms/LogViewerStatus.js:50 +#: client/src/job-detail/job-detail.partial.html:210 +#: client/src/job-detail/job-detail.partial.html:268 +#: client/src/job-detail/job-detail.partial.html:86 +msgid "Elapsed" +msgstr "" + #: client/src/forms/Credentials.js:192 #: client/src/forms/Users.js:42 msgid "Email" msgstr "" -#: client/src/forms/JobTemplates.js:314 -#: client/src/forms/JobTemplates.js:319 +#: client/src/forms/JobTemplates.js:316 +#: client/src/forms/JobTemplates.js:321 msgid "Enable Concurrent Jobs" msgstr "" -#: client/src/forms/JobTemplates.js:290 +#: client/src/forms/JobTemplates.js:292 msgid "Enable Privilege Escalation" msgstr "" -#: client/src/forms/JobTemplates.js:305 +#: client/src/forms/JobTemplates.js:307 msgid "Enables creation of a provisioning callback URL. Using the URL a host can contact Tower and request a configuration update using this job template." msgstr "" @@ -706,6 +944,10 @@ msgstr "" msgid "Encrypted credentials are not supported." msgstr "" +#: client/src/forms/EventsViewer.js:77 +msgid "End" +msgstr "" + #: client/src/license/license.partial.html:108 msgid "End User License Agreement" msgstr "" @@ -749,10 +991,38 @@ msgstr "" #: client/src/controllers/Users.js:94 #: client/src/helpers/Credentials.js:418 #: client/src/helpers/Credentials.js:434 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:168 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:187 #: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:119 +#: client/src/management-jobs/card/card.controller.js:150 +#: client/src/management-jobs/card/card.controller.js:240 +#: client/src/management-jobs/card/card.controller.js:29 msgid "Error!" msgstr "" +#: client/src/forms/EventsViewer.js:21 +#: client/src/forms/EventsViewer.js:25 +#: client/src/forms/EventsViewer.js:29 +#: client/src/forms/EventsViewer.js:33 +#: client/src/forms/EventsViewer.js:37 +#: client/src/forms/EventsViewer.js:42 +#: client/src/forms/EventsViewer.js:46 +#: client/src/forms/EventsViewer.js:50 +#: client/src/forms/EventsViewer.js:54 +#: client/src/forms/EventsViewer.js:58 +#: client/src/lists/JobEvents.js:65 +#: client/src/lists/Streams.js:43 +msgid "Event" +msgstr "" + +#: client/src/widgets/Stream.js:216 +msgid "Event summary not available" +msgstr "" + +#: client/src/lists/JobEvents.js:31 +msgid "Events" +msgstr "" + #: client/src/controllers/Projects.js:421 #: client/src/controllers/Projects.js:704 msgid "Example URLs for GIT SCM include:" @@ -768,12 +1038,12 @@ msgstr "" msgid "Example URLs for Subversion SCM include:" msgstr "" -#: client/src/job-results/job-results.controller.js:10 -#: client/src/job-results/job-results.controller.js:195 +#: client/src/job-results/job-results.controller.js:11 +#: client/src/job-results/job-results.controller.js:207 #: client/src/standard-out/standard-out.controller.js:235 #: client/src/standard-out/standard-out.controller.js:25 -#: client/src/workflow-results/workflow-results.controller.js:111 -#: client/src/workflow-results/workflow-results.controller.js:70 +#: client/src/workflow-results/workflow-results.controller.js:133 +#: client/src/workflow-results/workflow-results.controller.js:92 msgid "Expand Output" msgstr "" @@ -781,10 +1051,16 @@ msgstr "" msgid "Expires On" msgstr "" -#: client/src/forms/JobTemplates.js:365 -#: client/src/forms/JobTemplates.js:377 +#: client/src/job-detail/job-detail.partial.html:31 +msgid "Explanation" +msgstr "" + +#: client/src/forms/JobTemplates.js:367 +#: client/src/forms/JobTemplates.js:379 #: client/src/forms/Workflows.js:72 #: client/src/forms/Workflows.js:84 +#: client/src/job-detail/job-detail.partial.html:163 +#: client/src/partials/logviewer.html:8 msgid "Extra Variables" msgstr "" @@ -792,7 +1068,20 @@ msgstr "" msgid "FAILED" msgstr "" +#: client/src/shared/smart-search/smart-search.partial.html:48 +msgid "FIELDS:" +msgstr "" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:39 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:59 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:52 +msgid "FINISHED" +msgstr "" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:80 +#: client/src/job-detail/job-detail.partial.html:198 +#: client/src/job-detail/job-detail.partial.html:257 +#: client/src/job-detail/job-detail.partial.html:341 msgid "Failed" msgstr "" @@ -816,6 +1105,10 @@ msgstr "" msgid "Failed to get third-party login types. Returned status:" msgstr "" +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:188 +msgid "Failed to retrieve job template extra variables." +msgstr "" + #: client/src/controllers/Projects.js:598 msgid "Failed to retrieve project: %s. GET status:" msgstr "" @@ -841,48 +1134,84 @@ msgstr "" msgid "Failed to update project: %s. PUT status:" msgstr "" -#: client/src/notifications/notifications.list.js:49 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:169 +#: client/src/management-jobs/card/card.controller.js:151 +#: client/src/management-jobs/card/card.controller.js:241 +msgid "Failed updating job %s with variables. POST returned: %d" +msgstr "" + +#: client/src/helpers/Projects.js:73 +msgid "Failed. Click for details" +msgstr "" + +#: client/src/notifications/notifications.list.js:48 msgid "Failure" msgstr "" +#: client/src/lists/Schedules.js:50 +msgid "Final Run" +msgstr "" + +#: client/src/forms/LogViewerStatus.js:44 +#: client/src/job-detail/job-detail.partial.html:74 +#: client/src/lists/AllJobs.js:68 #: client/src/lists/CompletedJobs.js:56 #: client/src/lists/PortalJobs.js:37 msgid "Finished" msgstr "" +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 #: client/src/forms/Users.js:28 #: client/src/lists/Users.js:41 msgid "First Name" msgstr "" +#: client/src/lists/Schedules.js:40 +msgid "First Run" +msgstr "" + +#: client/src/shared/smart-search/smart-search.partial.html:54 +msgid "For additional information on advanced search search syntax please see the Ansible Tower documentation." +msgstr "" + #: client/src/helpers/Credentials.js:143 #: client/src/helpers/Credentials.js:279 msgid "For example, %s" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:142 -#: client/src/notifications/notificationTemplates.form.js:159 -#: client/src/notifications/notificationTemplates.form.js:213 -#: client/src/notifications/notificationTemplates.form.js:334 -#: client/src/notifications/notificationTemplates.form.js:372 -#: client/src/notifications/notificationTemplates.form.js:98 +#: client/src/notifications/notificationTemplates.form.js:101 +#: client/src/notifications/notificationTemplates.form.js:145 +#: client/src/notifications/notificationTemplates.form.js:162 +#: client/src/notifications/notificationTemplates.form.js:216 +#: client/src/notifications/notificationTemplates.form.js:337 +#: client/src/notifications/notificationTemplates.form.js:375 msgid "For example:" msgstr "" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:53 msgid "For hosts that are part of an external inventory, this flag cannot be changed. It will be set by the inventory sync process." msgstr "" -#: client/src/forms/JobTemplates.js:225 +#: client/src/forms/JobTemplates.js:227 #: client/src/forms/WorkflowMaker.js:125 msgid "For more information and examples see %sthe Patterns topic at docs.ansible.com%s." msgstr "" -#: client/src/forms/JobTemplates.js:201 -#: client/src/forms/JobTemplates.js:214 +#: client/src/forms/JobTemplates.js:203 +#: client/src/forms/JobTemplates.js:216 +#: client/src/job-detail/job-detail.partial.html:138 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:87 msgid "Forks" msgstr "" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:172 +msgid "Frequency Details" +msgstr "" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:89 +msgid "GROUP" +msgstr "" + #: client/src/configuration/auth-form/configuration-auth.controller.js:102 msgid "GitHub" msgstr "" @@ -900,7 +1229,7 @@ msgid "Google OAuth2" msgstr "" #: client/src/forms/Teams.js:155 -#: client/src/forms/Users.js:210 +#: client/src/forms/Users.js:211 msgid "Grant Permission" msgstr "" @@ -908,12 +1237,23 @@ msgstr "" msgid "Group all of your content to manage permissions across departments in your company." msgstr "" -#: client/src/notifications/notificationTemplates.form.js:324 +#: client/src/dashboard/hosts/main.js:55 +#: client/src/helpers/ActivityStream.js:53 +msgid "HOSTS" +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:327 msgid "HTTP Headers" msgstr "" +#: client/src/bread-crumb/bread-crumb.directive.js:111 +msgid "Hide Activity Stream" +msgstr "" + #: client/src/forms/Credentials.js:140 -#: client/src/notifications/notificationTemplates.form.js:72 +#: client/src/forms/EventsViewer.js:20 +#: client/src/lists/JobEvents.js:73 +#: client/src/notifications/notificationTemplates.form.js:75 msgid "Host" msgstr "" @@ -922,16 +1262,26 @@ msgstr "" msgid "Host (Authentication URL)" msgstr "" -#: client/src/forms/JobTemplates.js:339 -#: client/src/forms/JobTemplates.js:348 +#: client/src/forms/JobTemplates.js:341 +#: client/src/forms/JobTemplates.js:350 msgid "Host Config Key" msgstr "" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:55 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 msgid "Host Enabled" msgstr "" +#: client/src/job-detail/job-detail.partial.html:269 +msgid "Host Status" +msgstr "" + +#: client/src/lists/JobEvents.js:37 +msgid "Host Summary" +msgstr "" + +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 #: client/src/dashboard/counts/dashboard-counts.directive.js:39 +#: client/src/job-detail/job-detail.partial.html:349 msgid "Hosts" msgstr "" @@ -951,16 +1301,36 @@ msgstr "" msgid "I agree to the End User License Agreement" msgstr "" +#: client/src/forms/EventsViewer.js:28 +msgid "ID" +msgstr "" + +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:12 +msgid "INITIATED BY" +msgstr "" + +#: client/src/helpers/ActivityStream.js:26 +#: client/src/inventories/main.js:291 #: client/src/main-menu/main-menu.partial.html:104 #: client/src/main-menu/main-menu.partial.html:27 +#: client/src/organizations/linkout/organizations-linkout.route.js:178 msgid "INVENTORIES" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:357 +#: client/src/inventory-scripts/inventory-scripts.form.js:23 +msgid "INVENTORY SCRIPT" +msgstr "" + +#: client/src/helpers/ActivityStream.js:47 +#: client/src/inventory-scripts/main.js:66 +msgid "INVENTORY SCRIPTS" +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:360 msgid "IRC Nick" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:346 +#: client/src/notifications/notificationTemplates.form.js:349 msgid "IRC Server Address" msgstr "" @@ -972,11 +1342,22 @@ msgstr "" msgid "IRC Server Port" msgstr "" -#: client/src/forms/JobTemplates.js:293 +#: client/src/shared/paginate/paginate.partial.html:43 +msgid "" +"ITEMS \n" +" {{dataRange}}\n" +" of {{dataCount()}}" +msgstr "" + +#: client/src/login/authenticationServices/timer.factory.js:157 +msgid "Idle Session" +msgstr "" + +#: client/src/forms/JobTemplates.js:295 msgid "If enabled, run this playbook as an administrator. This is the equivalent of passing the %s option to the %s command." msgstr "" -#: client/src/forms/JobTemplates.js:317 +#: client/src/forms/JobTemplates.js:319 msgid "If enabled, simultaneous runs of this job template will be allowed." msgstr "" @@ -988,10 +1369,15 @@ msgstr "" msgid "If you are ready to upgrade, please contact us by clicking the button below" msgstr "" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:53 msgid "Indicates if a host is available and should be included in running jobs." msgstr "" +#: client/src/forms/ActivityDetail.js:33 +#: client/src/lists/Streams.js:36 +msgid "Initiated by" +msgstr "" + #: client/src/forms/JobTemplates.js:58 msgid "Instead, %s will check playbook syntax, test environment setup and report problems." msgstr "" @@ -1009,6 +1395,9 @@ msgstr "" msgid "Invalid username and/or password. Please try again." msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:116 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:51 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 #: client/src/dashboard/counts/dashboard-counts.directive.js:50 #: client/src/lists/Inventories.js:16 #: client/src/lists/Inventories.js:17 @@ -1020,9 +1409,12 @@ msgstr "" #: client/src/forms/JobTemplates.js:87 #: client/src/forms/WorkflowMaker.js:79 #: client/src/forms/WorkflowMaker.js:89 +#: client/src/job-detail/job-detail.partial.html:98 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:58 msgid "Inventory" msgstr "" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 #: client/src/inventory-scripts/inventory-scripts.list.js:12 #: client/src/setup-menu/setup-menu.partial.html:34 msgid "Inventory Scripts" @@ -1040,6 +1432,11 @@ msgstr "" msgid "Inventory Variables" msgstr "" +#: client/src/forms/EventsViewer.js:49 +#: client/src/job-detail/job-detail.partial.html:350 +msgid "Item" +msgstr "" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:4 msgid "JOB STATUS" msgstr "" @@ -1048,17 +1445,27 @@ msgstr "" msgid "JOB TEMPLATE" msgstr "" -#: client/src/app.js:428 +#: client/src/organizations/linkout/organizations-linkout.route.js:287 +msgid "JOB TEMPLATES" +msgstr "" + +#: client/src/app.js:430 #: client/src/dashboard/graphs/job-status/job-status-graph.directive.js:113 +#: client/src/helpers/ActivityStream.js:44 #: client/src/main-menu/main-menu.partial.html:122 #: client/src/main-menu/main-menu.partial.html:43 msgid "JOBS" msgstr "" -#: client/src/forms/JobTemplates.js:250 -#: client/src/forms/JobTemplates.js:258 +#: client/src/lists/JobEvents.js:15 +msgid "Job Events" +msgstr "" + +#: client/src/forms/JobTemplates.js:252 +#: client/src/forms/JobTemplates.js:260 #: client/src/forms/WorkflowMaker.js:134 #: client/src/forms/WorkflowMaker.js:142 +#: client/src/job-detail/job-detail.partial.html:153 msgid "Job Tags" msgstr "" @@ -1066,6 +1473,8 @@ msgstr "" msgid "Job Template" msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:35 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:97 #: client/src/lists/PortalJobTemplates.js:15 #: client/src/lists/PortalJobTemplates.js:16 msgid "Job Templates" @@ -1076,35 +1485,58 @@ msgstr "" #: client/src/forms/JobTemplates.js:62 #: client/src/forms/WorkflowMaker.js:110 #: client/src/forms/WorkflowMaker.js:99 +#: client/src/job-detail/job-detail.partial.html:69 msgid "Job Type" msgstr "" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 +#: client/src/configuration/configuration.partial.html:16 #: client/src/lists/PortalJobs.js:15 #: client/src/lists/PortalJobs.js:19 #: client/src/partials/jobs.html:7 msgid "Jobs" msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:90 +#: client/src/shared/smart-search/smart-search.partial.html:14 +msgid "Key" +msgstr "" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:73 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:66 +msgid "LAUNCH TYPE" +msgstr "" + #: client/src/configuration/auth-form/configuration-auth.controller.js:106 msgid "LDAP" msgstr "" +#: client/src/license/license.route.js:18 +msgid "LICENSE" +msgstr "" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:45 +msgid "LICENSE ERROR" +msgstr "" + #: client/src/main-menu/main-menu.partial.html:83 msgid "LOG OUT" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:270 +#: client/src/notifications/notificationTemplates.form.js:273 msgid "Label to be shown with notification" msgstr "" -#: client/src/forms/JobTemplates.js:353 -#: client/src/forms/JobTemplates.js:358 +#: client/src/forms/JobTemplates.js:355 +#: client/src/forms/JobTemplates.js:360 #: client/src/forms/Workflows.js:60 #: client/src/forms/Workflows.js:65 +#: client/src/lists/AllJobs.js:76 #: client/src/lists/Templates.js:47 msgid "Labels" msgstr "" +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 #: client/src/forms/Users.js:35 #: client/src/lists/Users.js:45 msgid "Last Name" @@ -1116,7 +1548,7 @@ msgstr "" #: client/src/lists/PortalJobTemplates.js:39 #: client/src/lists/Templates.js:84 -#: client/src/shared/form-generator.js:1704 +#: client/src/shared/form-generator.js:1715 msgid "Launch" msgstr "" @@ -1124,11 +1556,25 @@ msgstr "" msgid "Launch Management Job" msgstr "" +#: client/src/forms/LogViewerStatus.js:55 +msgid "Launch Type" +msgstr "" + +#: client/src/job-detail/job-detail.partial.html:79 +#: client/src/job-detail/job-detail.partial.html:91 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:76 +msgid "Launched By" +msgstr "" + #: client/src/license/license.controller.js:42 #: client/src/license/license.partial.html:8 msgid "License" msgstr "" +#: client/src/forms/LogViewerStatus.js:33 +msgid "License Error" +msgstr "" + #: client/src/license/license.partial.html:102 msgid "License File" msgstr "" @@ -1145,29 +1591,37 @@ msgstr "" msgid "License Type" msgstr "" -#: client/src/forms/JobTemplates.js:220 -#: client/src/forms/JobTemplates.js:227 +#: client/src/forms/JobTemplates.js:222 +#: client/src/forms/JobTemplates.js:229 #: client/src/forms/WorkflowMaker.js:120 #: client/src/forms/WorkflowMaker.js:127 +#: client/src/job-detail/job-detail.partial.html:143 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:92 msgid "Limit" msgstr "" -#: client/src/shared/socket/socket.service.js:170 +#: client/src/shared/socket/socket.service.js:168 msgid "Live events: attempting to connect to the Tower server." msgstr "" -#: client/src/shared/socket/socket.service.js:174 +#: client/src/shared/socket/socket.service.js:172 msgid "Live events: connected. Pages containing job status information will automatically update in real-time." msgstr "" -#: client/src/shared/socket/socket.service.js:178 +#: client/src/shared/socket/socket.service.js:176 msgid "Live events: error connecting to the Tower server." msgstr "" -#: client/src/shared/form-generator.js:1977 +#: client/src/job-detail/job-detail.partial.html:316 +#: client/src/job-detail/job-detail.partial.html:371 +#: client/src/shared/form-generator.js:1991 msgid "Loading..." msgstr "" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:133 +msgid "Local Time Zone" +msgstr "" + #: client/src/main-menu/main-menu.partial.html:188 msgid "Log Out" msgstr "" @@ -1180,11 +1634,16 @@ msgstr "" msgid "MANAGEMENT JOBS" msgstr "" +#: client/src/portal-mode/portal-mode.route.js:12 +msgid "MY VIEW" +msgstr "" + #: client/src/forms/Credentials.js:68 msgid "Machine" msgstr "" -#: client/src/forms/JobTemplates.js:138 +#: client/src/forms/JobTemplates.js:139 +#: client/src/job-detail/job-detail.partial.html:117 msgid "Machine Credential" msgstr "" @@ -1215,11 +1674,29 @@ msgstr "" msgid "Maximum per-user sessions reached. Please sign in." msgstr "" +#: client/src/forms/EventsViewer.js:65 +#: client/src/job-detail/job-detail.partial.html:351 +msgid "Message" +msgstr "" + #: client/src/configuration/system-form/configuration-system.controller.js:80 msgid "Misc. System" msgstr "" +#: client/src/helpers/Projects.js:76 +msgid "Missing. Click for details" +msgstr "" + +#: client/src/forms/EventsViewer.js:53 +msgid "Module" +msgstr "" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:53 +msgid "Module Args" +msgstr "" + #: client/src/portal-mode/portal-mode-jobs.partial.html:4 +#: client/src/portal-mode/portal-mode-layout.partial.html:10 msgid "My Jobs" msgstr "" @@ -1227,37 +1704,65 @@ msgstr "" msgid "My View" msgstr "" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:19 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:19 +msgid "NAME" +msgstr "" + #: client/src/dashboard/hosts/dashboard-hosts.list.js:18 msgid "NO HOSTS FOUND" msgstr "" +#: client/src/login/loginModal/loginModal.partial.html:89 +msgid "NOTICE" +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:21 +msgid "NOTIFICATION TEMPLATE" +msgstr "" + +#: client/src/helpers/ActivityStream.js:38 +msgid "NOTIFICATION TEMPLATES" +msgstr "" + +#: client/src/management-jobs/notifications/notification.route.js:46 +#: client/src/notifications/main.js:43 +#: client/src/notifications/main.js:88 +msgid "NOTIFICATIONS" +msgstr "" + #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:14 #: client/src/dashboard/lists/jobs/jobs-list.partial.html:13 #: client/src/forms/Credentials.js:34 #: client/src/forms/Inventories.js:29 #: client/src/forms/JobTemplates.js:35 +#: client/src/forms/LogViewerStatus.js:23 #: client/src/forms/Organizations.js:26 #: client/src/forms/Projects.js:31 #: client/src/forms/Teams.js:124 #: client/src/forms/Teams.js:27 #: client/src/forms/Users.js:140 #: client/src/forms/Users.js:165 -#: client/src/forms/Users.js:190 +#: client/src/forms/Users.js:191 #: client/src/forms/Workflows.js:34 -#: client/src/inventory-scripts/inventory-scripts.form.js:25 +#: client/src/inventory-scripts/inventory-scripts.form.js:28 #: client/src/inventory-scripts/inventory-scripts.list.js:20 +#: client/src/lists/AllJobs.js:45 #: client/src/lists/CompletedJobs.js:43 #: client/src/lists/Credentials.js:29 #: client/src/lists/Inventories.js:46 #: client/src/lists/PortalJobTemplates.js:24 #: client/src/lists/PortalJobs.js:32 #: client/src/lists/Projects.js:38 -#: client/src/lists/ScheduledJobs.js:32 +#: client/src/lists/ScheduledJobs.js:33 +#: client/src/lists/Schedules.js:35 #: client/src/lists/Teams.js:25 #: client/src/lists/Templates.js:26 -#: client/src/notifications/notificationTemplates.form.js:29 -#: client/src/notifications/notificationTemplates.list.js:33 +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 +#: client/src/notifications/notificationTemplates.form.js:32 +#: client/src/notifications/notificationTemplates.list.js:32 #: client/src/notifications/notifications.list.js:26 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:19 msgid "Name" msgstr "" @@ -1265,12 +1770,13 @@ msgstr "" msgid "Network" msgstr "" -#: client/src/forms/JobTemplates.js:184 -#: client/src/forms/JobTemplates.js:195 +#: client/src/forms/JobTemplates.js:186 +#: client/src/forms/JobTemplates.js:197 +#: client/src/job-detail/job-detail.partial.html:131 msgid "Network Credential" msgstr "" -#: client/src/forms/JobTemplates.js:194 +#: client/src/forms/JobTemplates.js:196 msgid "Network credentials are used by Ansible networking modules to connect to and manage networking devices." msgstr "" @@ -1314,7 +1820,8 @@ msgstr "" msgid "New user successfully created!" msgstr "" -#: client/src/lists/ScheduledJobs.js:51 +#: client/src/lists/ScheduledJobs.js:52 +#: client/src/lists/Schedules.js:45 msgid "Next Run" msgstr "" @@ -1326,10 +1833,22 @@ msgstr "" msgid "No SCM Configuration" msgstr "" +#: client/src/helpers/Projects.js:58 +msgid "No SCM updates have run for this project" +msgstr "" + +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:18 +msgid "No Teams exist" +msgstr "" + #: client/src/controllers/Projects.js:152 msgid "No Updates Available" msgstr "" +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:24 +msgid "No Users exist" +msgstr "" + #: client/src/lists/CompletedJobs.js:22 msgid "No completed jobs" msgstr "" @@ -1338,6 +1857,10 @@ msgstr "" msgid "No file selected." msgstr "" +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:56 +msgid "No job templates were recently used." +msgstr "" + #: client/src/lists/AllJobs.js:20 msgid "No jobs have yet run." msgstr "" @@ -1346,11 +1869,31 @@ msgstr "" msgid "No jobs were recently run." msgstr "" +#: client/src/job-detail/job-detail.partial.html:374 +msgid "No matching host events" +msgstr "" + +#: client/src/job-detail/job-detail.partial.html:307 +msgid "No matching hosts." +msgstr "" + +#: client/src/job-detail/job-detail.partial.html:319 +msgid "No matching tasks" +msgstr "" + #: client/src/forms/Teams.js:121 -#: client/src/forms/Users.js:187 +#: client/src/forms/Users.js:188 msgid "No permissions have been granted" msgstr "" +#: client/src/notifications/notification-templates-list/list.controller.js:88 +msgid "No recent notifications." +msgstr "" + +#: client/src/shared/form-generator.js:1885 +msgid "No records matched your search." +msgstr "" + #: client/src/lists/ScheduledJobs.js:18 msgid "No schedules exist" msgstr "" @@ -1363,24 +1906,30 @@ msgstr "" msgid "Not configured for SCM" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:293 +#: client/src/notifications/notificationTemplates.form.js:296 msgid "Notification Color" msgstr "" +#: client/src/notifications/notification-templates-list/list.controller.js:115 +msgid "Notification Failed." +msgstr "" + +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 #: client/src/notifications/notificationTemplates.list.js:14 msgid "Notification Templates" msgstr "" +#: client/src/management-jobs/notifications/notification.route.js:21 #: client/src/notifications/notifications.list.js:17 #: client/src/setup-menu/setup-menu.partial.html:41 msgid "Notifications" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:306 +#: client/src/notifications/notificationTemplates.form.js:309 msgid "Notify Channel" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:198 +#: client/src/notifications/notificationTemplates.form.js:201 msgid "Number associated with the \"Messaging Service\" in Twilio." msgstr "" @@ -1392,10 +1941,20 @@ msgstr "" msgid "ON" msgstr "" +#: client/src/helpers/ActivityStream.js:41 #: client/src/organizations/list/organizations-list.partial.html:6 +#: client/src/organizations/main.js:52 msgid "ORGANIZATIONS" msgstr "" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:112 +msgid "OVERWRITE" +msgstr "" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:119 +msgid "OVERWRITE VARS" +msgstr "" + #: client/src/forms/WorkflowMaker.js:45 msgid "On Failure" msgstr "" @@ -1408,12 +1967,14 @@ msgstr "" msgid "OpenStack domains define administrative boundaries. It is only needed for Keystone v3 authentication URLs. Common scenarios include:" msgstr "" -#: client/src/forms/JobTemplates.js:360 +#: client/src/forms/JobTemplates.js:362 #: client/src/forms/Workflows.js:67 msgid "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display." msgstr "" -#: client/src/forms/JobTemplates.js:286 +#: client/src/forms/JobTemplates.js:288 +#: client/src/notifications/notificationTemplates.form.js:395 +#: client/src/partials/logviewer.html:7 msgid "Options" msgstr "" @@ -1426,14 +1987,15 @@ msgstr "" #: client/src/forms/Users.js:59 #: client/src/forms/Workflows.js:47 #: client/src/forms/Workflows.js:53 -#: client/src/inventory-scripts/inventory-scripts.form.js:37 +#: client/src/inventory-scripts/inventory-scripts.form.js:40 #: client/src/inventory-scripts/inventory-scripts.list.js:30 #: client/src/lists/Inventories.js:52 #: client/src/lists/Teams.js:35 -#: client/src/notifications/notificationTemplates.form.js:41 +#: client/src/notifications/notificationTemplates.form.js:44 msgid "Organization" msgstr "" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 #: client/src/forms/Users.js:130 #: client/src/setup-menu/setup-menu.partial.html:4 msgid "Organizations" @@ -1452,7 +2014,7 @@ msgid "PASSWORD" msgstr "" #: client/src/organizations/list/organizations-list.partial.html:45 -#: client/src/shared/form-generator.js:1880 +#: client/src/shared/form-generator.js:1891 #: client/src/shared/list-generator/list-generator.factory.js:246 msgid "PLEASE ADD ITEMS TO THIS LIST" msgstr "" @@ -1461,16 +2023,30 @@ msgstr "" msgid "PORTAL MODE" msgstr "" +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:73 +msgid "PROJECT" +msgstr "" + +#: client/src/app.js:295 +#: client/src/helpers/ActivityStream.js:23 #: client/src/main-menu/main-menu.partial.html:19 #: client/src/main-menu/main-menu.partial.html:95 +#: client/src/organizations/linkout/organizations-linkout.route.js:229 msgid "PROJECTS" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:237 +#: client/src/shared/paginate/paginate.partial.html:33 +msgid "" +"Page\n" +" {{current()}} of\n" +" {{last()}}" +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:240 msgid "Pagerduty subdomain" msgstr "" -#: client/src/forms/JobTemplates.js:371 +#: client/src/forms/JobTemplates.js:373 #: client/src/forms/Workflows.js:78 msgid "Pass extra command line variables to the playbook. This is the %s or %s command line parameter for %s. Provide key/value pairs using either YAML or JSON." msgstr "" @@ -1535,22 +2111,28 @@ msgstr "" #: client/src/controllers/Projects.js:324 #: client/src/controllers/Users.js:141 +#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:26 msgid "Permission Error" msgstr "" -#: client/src/forms/Credentials.js:439 -#: client/src/forms/Inventories.js:142 -#: client/src/forms/JobTemplates.js:416 -#: client/src/forms/Organizations.js:64 -#: client/src/forms/Projects.js:227 +#: client/src/forms/Credentials.js:440 +#: client/src/forms/Inventories.js:96 +#: client/src/forms/JobTemplates.js:419 +#: client/src/forms/Organizations.js:65 +#: client/src/forms/Projects.js:228 #: client/src/forms/Teams.js:117 -#: client/src/forms/Users.js:183 -#: client/src/forms/Workflows.js:116 +#: client/src/forms/Users.js:184 +#: client/src/forms/Workflows.js:117 msgid "Permissions" msgstr "" -#: client/src/forms/JobTemplates.js:121 -#: client/src/forms/JobTemplates.js:132 +#: client/src/forms/EventsViewer.js:40 +msgid "Play" +msgstr "" + +#: client/src/forms/JobTemplates.js:122 +#: client/src/forms/JobTemplates.js:133 +#: client/src/job-detail/job-detail.partial.html:112 msgid "Playbook" msgstr "" @@ -1562,28 +2144,40 @@ msgstr "" msgid "Playbook Run" msgstr "" +#: client/src/job-detail/job-detail.partial.html:208 +msgid "Plays" +msgstr "" + #: client/src/forms/Users.js:124 msgid "Please add user to an Organization." msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:89 +msgid "Please assign roles to the selected resources" +msgstr "" + +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:62 +msgid "Please assign roles to the selected users/teams" +msgstr "" + #: client/src/license/license.partial.html:84 msgid "Please click the button below to visit Ansible's website to get a Tower license key." msgstr "" -#: client/src/shared/form-generator.js:835 -#: client/src/shared/form-generator.js:949 +#: client/src/shared/form-generator.js:836 +#: client/src/shared/form-generator.js:950 msgid "Please enter a URL that begins with ssh, http or https. The URL may not contain the '@' character." msgstr "" -#: client/src/shared/form-generator.js:1187 +#: client/src/shared/form-generator.js:1188 msgid "Please enter a number greater than %d and less than %d." msgstr "" -#: client/src/shared/form-generator.js:1189 +#: client/src/shared/form-generator.js:1190 msgid "Please enter a number greater than %d." msgstr "" -#: client/src/shared/form-generator.js:1181 +#: client/src/shared/form-generator.js:1182 msgid "Please enter a number." msgstr "" @@ -1595,14 +2189,14 @@ msgstr "" msgid "Please enter a username." msgstr "" -#: client/src/shared/form-generator.js:825 -#: client/src/shared/form-generator.js:939 +#: client/src/shared/form-generator.js:826 +#: client/src/shared/form-generator.js:940 msgid "Please enter a valid email address." msgstr "" -#: client/src/shared/form-generator.js:1041 -#: client/src/shared/form-generator.js:820 -#: client/src/shared/form-generator.js:934 +#: client/src/shared/form-generator.js:1042 +#: client/src/shared/form-generator.js:821 +#: client/src/shared/form-generator.js:935 msgid "Please enter a value." msgstr "" @@ -1618,18 +2212,18 @@ msgstr "" msgid "Please save before adding users" msgstr "" -#: client/src/forms/Inventories.js:138 -#: client/src/forms/Inventories.js:91 -#: client/src/forms/JobTemplates.js:409 -#: client/src/forms/Organizations.js:57 -#: client/src/forms/Projects.js:219 +#: client/src/controllers/Credentials.js:161 +#: client/src/forms/Inventories.js:92 +#: client/src/forms/JobTemplates.js:412 +#: client/src/forms/Organizations.js:58 +#: client/src/forms/Projects.js:220 #: client/src/forms/Teams.js:113 -#: client/src/forms/Workflows.js:109 +#: client/src/forms/Workflows.js:110 msgid "Please save before assigning permissions" msgstr "" #: client/src/forms/Users.js:122 -#: client/src/forms/Users.js:179 +#: client/src/forms/Users.js:180 msgid "Please save before assigning to organizations" msgstr "" @@ -1637,30 +2231,42 @@ msgstr "" msgid "Please save before assigning to teams" msgstr "" -#: client/src/forms/Workflows.js:185 +#: client/src/forms/Workflows.js:186 msgid "Please save before defining the workflow graph" msgstr "" +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 +msgid "Please select Users / Teams from the lists below." +msgstr "" + +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 +msgid "Please select Users from the list below." +msgstr "" + #: client/src/forms/WorkflowMaker.js:65 msgid "Please select a Credential." msgstr "" -#: client/src/forms/JobTemplates.js:152 +#: client/src/forms/JobTemplates.js:153 msgid "Please select a Machine Credential or check the Prompt on launch option." msgstr "" -#: client/src/shared/form-generator.js:1222 +#: client/src/shared/form-generator.js:1223 msgid "Please select a number between" msgstr "" -#: client/src/shared/form-generator.js:1218 +#: client/src/shared/form-generator.js:1219 msgid "Please select a number." msgstr "" -#: client/src/shared/form-generator.js:1109 -#: client/src/shared/form-generator.js:1178 -#: client/src/shared/form-generator.js:1297 -#: client/src/shared/form-generator.js:1404 +#: client/src/job-detail/job-detail.partial.html:245 +msgid "Please select a task below to view its associated hosts" +msgstr "" + +#: client/src/shared/form-generator.js:1110 +#: client/src/shared/form-generator.js:1179 +#: client/src/shared/form-generator.js:1299 +#: client/src/shared/form-generator.js:1406 msgid "Please select a value." msgstr "" @@ -1672,10 +2278,14 @@ msgstr "" msgid "Please select an Inventory." msgstr "" -#: client/src/shared/form-generator.js:1215 +#: client/src/shared/form-generator.js:1216 msgid "Please select at least one value." msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:29 +msgid "Please select resources from the lists below." +msgstr "" + #: client/src/notifications/shared/type-change.service.js:27 msgid "Port" msgstr "" @@ -1705,10 +2315,11 @@ msgstr "" msgid "Privilege Escalation Username" msgstr "" -#: client/src/forms/JobTemplates.js:115 -#: client/src/forms/JobTemplates.js:98 +#: client/src/forms/JobTemplates.js:116 +#: client/src/forms/JobTemplates.js:99 #: client/src/helpers/Credentials.js:104 #: client/src/helpers/Credentials.js:240 +#: client/src/job-detail/job-detail.partial.html:105 msgid "Project" msgstr "" @@ -1738,39 +2349,46 @@ msgstr "" msgid "Project lookup failed. GET returned:" msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:109 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:46 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 #: client/src/dashboard/counts/dashboard-counts.directive.js:61 #: client/src/lists/Projects.js:16 #: client/src/lists/Projects.js:17 msgid "Projects" msgstr "" -#: client/src/forms/JobTemplates.js:161 -#: client/src/forms/JobTemplates.js:232 -#: client/src/forms/JobTemplates.js:263 -#: client/src/forms/JobTemplates.js:281 -#: client/src/forms/JobTemplates.js:382 +#: client/src/forms/JobTemplates.js:162 +#: client/src/forms/JobTemplates.js:234 +#: client/src/forms/JobTemplates.js:265 +#: client/src/forms/JobTemplates.js:283 +#: client/src/forms/JobTemplates.js:384 #: client/src/forms/JobTemplates.js:68 -#: client/src/forms/JobTemplates.js:93 +#: client/src/forms/JobTemplates.js:94 msgid "Prompt on launch" msgstr "" -#: client/src/forms/JobTemplates.js:255 -#: client/src/forms/JobTemplates.js:273 +#: client/src/forms/JobTemplates.js:257 +#: client/src/forms/JobTemplates.js:275 #: client/src/forms/WorkflowMaker.js:139 #: client/src/forms/WorkflowMaker.js:154 msgid "Provide a comma separated list of tags." msgstr "" -#: client/src/forms/JobTemplates.js:223 +#: client/src/forms/JobTemplates.js:225 #: client/src/forms/WorkflowMaker.js:123 msgid "Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns can be separated by %s %s or %s" msgstr "" -#: client/src/forms/JobTemplates.js:326 -#: client/src/forms/JobTemplates.js:334 +#: client/src/forms/JobTemplates.js:328 +#: client/src/forms/JobTemplates.js:336 msgid "Provisioning Callback URL" msgstr "" +#: client/src/helpers/Projects.js:63 +msgid "Queued. Click for details" +msgstr "" + #: client/src/configuration/auth-form/configuration-auth.controller.js:107 msgid "RADIUS" msgstr "" @@ -1783,43 +2401,86 @@ msgstr "" msgid "RECENTLY RUN JOBS" msgstr "" -#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:4 #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:52 msgid "RECENTLY USED JOB TEMPLATES" msgstr "" +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:4 +msgid "RECENTLY USED TEMPLATES" +msgstr "" + +#: client/src/lists/JobEvents.js:89 #: client/src/lists/Projects.js:70 +#: client/src/lists/Schedules.js:63 +#: client/src/lists/Streams.js:57 #: client/src/partials/jobs.html:15 #: client/src/portal-mode/portal-mode-jobs.partial.html:12 msgid "REFRESH" msgstr "" -#: client/src/forms/JobTemplates.js:100 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:105 +msgid "REGIONS" +msgstr "" + +#: client/src/shared/smart-search/smart-search.partial.html:51 +msgid "RELATED FIELDS:" +msgstr "" + +#: client/src/shared/directives.js:136 +msgid "REMOVE" +msgstr "" + +#: client/src/forms/JobTemplates.js:101 msgid "RESET" msgstr "" +#: client/src/job-detail/job-detail.partial.html:11 +#: client/src/job-detail/job-detail.partial.html:14 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:7 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:7 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:7 +msgid "RESULTS" +msgstr "" + #: client/src/helpers/Credentials.js:235 #: client/src/helpers/Credentials.js:99 msgid "RSA Private Key" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:99 +#: client/src/inventories/manage/adhoc/adhoc.route.js:26 +msgid "RUN COMMAND" +msgstr "" + +#: client/src/workflow-results/workflow-results.partial.html:140 +msgid "Read only view of extra variables added to the workflow." +msgstr "" + +#: client/src/notifications/notificationTemplates.list.js:26 +msgid "Recent Notifications" +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:102 +#: client/src/notifications/notificationTemplates.form.js:97 msgid "Recipient List" msgstr "" #: client/src/bread-crumb/bread-crumb.partial.html:6 #: client/src/lists/Projects.js:66 +#: client/src/lists/Schedules.js:59 +#: client/src/lists/Streams.js:54 msgid "Refresh the page" msgstr "" +#: client/src/lists/AllJobs.js:101 #: client/src/lists/CompletedJobs.js:75 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:11 +#: client/src/workflow-results/workflow-results.partial.html:29 msgid "Relaunch using the same parameters" msgstr "" #: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:37 #: client/src/forms/Teams.js:142 -#: client/src/forms/Users.js:218 +#: client/src/forms/Users.js:219 msgid "Remove" msgstr "" @@ -1827,10 +2488,33 @@ msgstr "" msgid "Remove any local modifications prior to performing an update." msgstr "" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:149 +msgid "Repeat frequency" +msgstr "" + #: client/src/license/license.partial.html:89 msgid "Request License" msgstr "" +#: client/src/shared/form-generator.js:681 +msgid "Reset" +msgstr "" + +#: client/src/forms/EventsViewer.js:62 +#: client/src/forms/EventsViewer.js:66 +#: client/src/forms/EventsViewer.js:69 +#: client/src/forms/EventsViewer.js:70 +msgid "Results" +msgstr "" + +#: client/src/job-detail/job-detail.partial.html:52 +msgid "Results Traceback" +msgstr "" + +#: client/src/forms/EventsViewer.js:61 +msgid "Return Code" +msgstr "" + #: client/src/configuration/auth-form/sub-forms/auth-azure.form.js:46 #: client/src/configuration/auth-form/sub-forms/auth-github-org.form.js:50 #: client/src/configuration/auth-form/sub-forms/auth-github-team.form.js:50 @@ -1839,7 +2523,7 @@ msgstr "" #: client/src/configuration/auth-form/sub-forms/auth-ldap.form.js:88 #: client/src/configuration/auth-form/sub-forms/auth-radius.form.js:33 #: client/src/configuration/auth-form/sub-forms/auth-saml.form.js:82 -#: client/src/configuration/jobs-form/configuration-jobs.form.js:67 +#: client/src/configuration/jobs-form/configuration-jobs.form.js:63 #: client/src/configuration/system-form/sub-forms/system-activity-stream.form.js:25 #: client/src/configuration/system-form/sub-forms/system-logging.form.js:52 #: client/src/configuration/system-form/sub-forms/system-misc.form.js:29 @@ -1855,21 +2539,39 @@ msgstr "" msgid "Revision #" msgstr "" -#: client/src/forms/Credentials.js:461 -#: client/src/forms/Inventories.js:120 -#: client/src/forms/Inventories.js:166 -#: client/src/forms/Organizations.js:88 -#: client/src/forms/Projects.js:249 +#: client/src/forms/Credentials.js:462 +#: client/src/forms/EventsViewer.js:36 +#: client/src/forms/Inventories.js:121 +#: client/src/forms/Organizations.js:89 +#: client/src/forms/Projects.js:250 #: client/src/forms/Teams.js:135 #: client/src/forms/Teams.js:98 -#: client/src/forms/Users.js:201 +#: client/src/forms/Users.js:202 +#: client/src/forms/Workflows.js:141 msgid "Role" msgstr "" +#: client/src/helpers/Projects.js:67 +msgid "Running! Click for details" +msgstr "" + #: client/src/configuration/auth-form/configuration-auth.controller.js:108 msgid "SAML" msgstr "" +#: client/src/scheduler/main.js:293 +msgid "SCHEDULED" +msgstr "" + +#: client/src/helpers/ActivityStream.js:50 +#: client/src/inventories/main.js:59 +#: client/src/management-jobs/scheduler/main.js:26 +#: client/src/scheduler/main.js:122 +#: client/src/scheduler/main.js:205 +#: client/src/scheduler/main.js:36 +msgid "SCHEDULES" +msgstr "" + #: client/src/controllers/Projects.js:697 msgid "SCM Branch" msgstr "" @@ -1914,6 +2616,7 @@ msgid "SCM update currently running" msgstr "" #: client/src/main-menu/main-menu.partial.html:59 +#: client/src/setup-menu/setup.route.js:8 msgid "SETTINGS" msgstr "" @@ -1925,10 +2628,14 @@ msgstr "" msgid "SIGN IN WITH" msgstr "" -#: client/src/app.js:497 +#: client/src/app.js:499 msgid "SOCKETS" msgstr "" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:98 +msgid "SOURCE" +msgstr "" + #: client/src/helpers/Credentials.js:169 #: client/src/helpers/Credentials.js:305 msgid "SSH Key" @@ -1938,10 +2645,29 @@ msgstr "" msgid "SSH key description" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:385 +#: client/src/notifications/notificationTemplates.form.js:388 msgid "SSL Connection" msgstr "" +#: client/src/job-detail/job-detail.partial.html:414 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:108 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:131 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:96 +msgid "STANDARD OUT" +msgstr "" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:32 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:52 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:45 +msgid "STARTED" +msgstr "" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:24 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:37 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:37 +msgid "STATUS" +msgstr "" + #: client/src/forms/Credentials.js:120 #: client/src/forms/Credentials.js:128 msgid "STS Token" @@ -1951,12 +2677,17 @@ msgstr "" msgid "SUCCESSFUL" msgstr "" +#: client/src/system-tracking/system-tracking.route.js:18 +msgid "SYSTEM TRACKING" +msgstr "" + #: client/src/helpers/Credentials.js:150 #: client/src/helpers/Credentials.js:286 msgid "Satellite 6 URL" msgstr "" -#: client/src/shared/form-generator.js:1688 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:176 +#: client/src/shared/form-generator.js:1699 msgid "Save" msgstr "" @@ -1991,14 +2722,25 @@ msgstr "" msgid "Scheduled Jobs" msgstr "" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 +#: client/src/inventories/main.js:93 +#: client/src/management-jobs/scheduler/main.js:32 #: client/src/partials/jobs.html:10 +#: client/src/scheduler/main.js:153 +#: client/src/scheduler/main.js:236 +#: client/src/scheduler/main.js:67 msgid "Schedules" msgstr "" -#: client/src/inventory-scripts/inventory-scripts.form.js:59 +#: client/src/inventory-scripts/inventory-scripts.form.js:62 msgid "Script must begin with a hashbang sequence: i.e.... %s" msgstr "" +#: client/src/shared/smart-search/smart-search.controller.js:38 +#: client/src/shared/smart-search/smart-search.controller.js:83 +msgid "Search" +msgstr "" + #: client/src/forms/Credentials.js:105 msgid "Secret Key" msgstr "" @@ -2007,7 +2749,7 @@ msgstr "" msgid "Security Token Service (STS) is a web service that enables you to request temporary, limited-privilege credentials for AWS Identity and Access Management (IAM) users." msgstr "" -#: client/src/shared/form-generator.js:1692 +#: client/src/shared/form-generator.js:1703 msgid "Select" msgstr "" @@ -2015,8 +2757,8 @@ msgstr "" msgid "Select a role" msgstr "" -#: client/src/configuration/jobs-form/configuration-jobs.controller.js:89 -#: client/src/configuration/ui-form/configuration-ui.controller.js:84 +#: client/src/configuration/jobs-form/configuration-jobs.controller.js:90 +#: client/src/configuration/ui-form/configuration-ui.controller.js:85 msgid "Select commands" msgstr "" @@ -2024,11 +2766,15 @@ msgstr "" msgid "Select from the list of directories found in the Project Base Path. Together the base path and the playbook directory provide the full path used to locate playbooks." msgstr "" -#: client/src/configuration/auth-form/configuration-auth.controller.js:229 +#: client/src/configuration/auth-form/configuration-auth.controller.js:230 msgid "Select group types" msgstr "" -#: client/src/forms/JobTemplates.js:154 +#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:25 +msgid "Select roles" +msgstr "" + +#: client/src/forms/JobTemplates.js:155 #: client/src/forms/WorkflowMaker.js:67 msgid "Select the credential you want the job to use when accessing the remote hosts. Choose the credential containing the username and SSH key or password that Ansible will need to log into the remote hosts." msgstr "" @@ -2038,23 +2784,23 @@ msgstr "" msgid "Select the inventory containing the hosts you want this job to manage." msgstr "" -#: client/src/forms/JobTemplates.js:131 +#: client/src/forms/JobTemplates.js:132 msgid "Select the playbook to be executed by this job." msgstr "" -#: client/src/forms/JobTemplates.js:114 +#: client/src/forms/JobTemplates.js:115 msgid "Select the project containing the playbook you want this job to execute." msgstr "" -#: client/src/configuration/system-form/configuration-system.controller.js:169 +#: client/src/configuration/system-form/configuration-system.controller.js:170 msgid "Select types" msgstr "" -#: client/src/forms/JobTemplates.js:176 +#: client/src/forms/JobTemplates.js:178 msgid "Selecting an optional cloud credential in the job template will pass along the access credentials to the running playbook, allowing provisioning into the cloud without manually passing parameters to the included modules." msgstr "" -#: client/src/notifications/notificationTemplates.form.js:83 +#: client/src/notifications/notificationTemplates.form.js:86 msgid "Sender Email" msgstr "" @@ -2080,7 +2826,7 @@ msgstr "" msgid "Settings" msgstr "" -#: client/src/shared/form-generator.js:850 +#: client/src/shared/form-generator.js:851 msgid "Show" msgstr "" @@ -2099,14 +2845,15 @@ msgstr "" msgid "Sign in with %s Teams" msgstr "" -#: client/src/forms/JobTemplates.js:268 -#: client/src/forms/JobTemplates.js:276 +#: client/src/forms/JobTemplates.js:270 +#: client/src/forms/JobTemplates.js:278 #: client/src/forms/WorkflowMaker.js:149 #: client/src/forms/WorkflowMaker.js:157 +#: client/src/job-detail/job-detail.partial.html:158 msgid "Skip Tags" msgstr "" -#: client/src/forms/JobTemplates.js:274 +#: client/src/forms/JobTemplates.js:276 #: client/src/forms/WorkflowMaker.js:155 msgid "Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task." msgstr "" @@ -2119,11 +2866,15 @@ msgstr "" msgid "Source Details" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:196 +#: client/src/notifications/notificationTemplates.form.js:199 msgid "Source Phone Number" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:333 +#: client/src/partials/logviewer.html:9 +msgid "Source Vars" +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:336 msgid "Specify HTTP Headers in JSON format" msgstr "" @@ -2135,6 +2886,22 @@ msgstr "" msgid "Split up your organization to associate content and control permissions for groups." msgstr "" +#: client/src/partials/logviewer.html:5 +msgid "Standard Out" +msgstr "" + +#: client/src/forms/EventsViewer.js:73 +msgid "Start" +msgstr "" + +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:41 +msgid "Start Date" +msgstr "" + +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 +msgid "Start Time" +msgstr "" + #: client/src/lists/PortalJobTemplates.js:42 #: client/src/lists/Templates.js:87 msgid "Start a job using this template" @@ -2145,14 +2912,35 @@ msgstr "" msgid "Start an SCM update" msgstr "" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:49 +#: client/src/forms/LogViewerStatus.js:38 +#: client/src/job-detail/job-detail.partial.html:209 +#: client/src/job-detail/job-detail.partial.html:267 +#: client/src/job-detail/job-detail.partial.html:64 +msgid "Started" +msgstr "" + +#: client/src/dashboard/hosts/dashboard-hosts.list.js:48 +#: client/src/forms/EventsViewer.js:24 +#: client/src/forms/LogViewerStatus.js:28 +#: client/src/job-detail/job-detail.partial.html:26 +#: client/src/lists/JobEvents.js:51 +#: client/src/notifications/notification-templates-list/list.controller.js:73 +#: client/src/partials/logviewer.html:4 msgid "Status" msgstr "" +#: client/src/configuration/auth-form/configuration-auth.partial.html:3 +msgid "Sub Category" +msgstr "" + #: client/src/license/license.partial.html:121 msgid "Submit" msgstr "" +#: client/src/helpers/Jobs.js:230 +msgid "Submit the request to cancel?" +msgstr "" + #: client/src/license/license.partial.html:27 msgid "Subscription" msgstr "" @@ -2170,10 +2958,18 @@ msgstr "" msgid "Success" msgstr "" +#: client/src/helpers/Projects.js:70 +msgid "Success! Click for details" +msgstr "" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:77 msgid "Successful" msgstr "" +#: client/src/configuration/configuration.partial.html:17 +msgid "System" +msgstr "" + #: client/src/controllers/Users.js:18 msgid "System Administrator" msgstr "" @@ -2182,12 +2978,20 @@ msgstr "" msgid "System Auditor" msgstr "" -#: client/src/app.js:340 +#: client/src/configuration/configuration.partial.html:3 +msgid "System auditors have read-only permissions in this section." +msgstr "" + +#: client/src/app.js:343 +#: client/src/helpers/ActivityStream.js:35 +#: client/src/organizations/linkout/organizations-linkout.route.js:132 msgid "TEAMS" msgstr "" +#: client/src/helpers/ActivityStream.js:56 #: client/src/main-menu/main-menu.partial.html:113 #: client/src/main-menu/main-menu.partial.html:35 +#: client/src/templates/list/templates-list.route.js:13 msgid "TEMPLATES" msgstr "" @@ -2195,34 +2999,47 @@ msgstr "" msgid "TIME" msgstr "" -#: client/src/forms/JobTemplates.js:256 +#: client/src/forms/JobTemplates.js:258 #: client/src/forms/WorkflowMaker.js:140 msgid "Tags are useful when you have a large playbook, and you want to run a specific part of a play or task." msgstr "" -#: client/src/notifications/notificationTemplates.form.js:313 +#: client/src/notifications/notificationTemplates.form.js:316 msgid "Target URL" msgstr "" +#: client/src/forms/EventsViewer.js:45 +msgid "Task" +msgstr "" + +#: client/src/job-detail/job-detail.partial.html:266 +msgid "Tasks" +msgstr "" + #: client/src/forms/Credentials.js:468 -#: client/src/forms/Inventories.js:126 -#: client/src/forms/Inventories.js:173 +#: client/src/forms/Inventories.js:127 #: client/src/forms/Organizations.js:95 -#: client/src/forms/Projects.js:255 +#: client/src/forms/Projects.js:256 +#: client/src/forms/Workflows.js:147 msgid "Team Roles" msgstr "" +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 #: client/src/forms/Users.js:156 #: client/src/lists/Teams.js:16 #: client/src/lists/Teams.js:17 #: client/src/setup-menu/setup-menu.partial.html:16 +#: client/src/shared/stateDefinitions.factory.js:342 msgid "Teams" msgstr "" +#: client/src/job-detail/job-detail.partial.html:57 #: client/src/lists/Templates.js:16 msgid "Template" msgstr "" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 #: client/src/lists/Templates.js:17 #: client/src/lists/Templates.js:18 msgid "Templates" @@ -2232,11 +3049,12 @@ msgstr "" msgid "Tenant ID" msgstr "" -#: client/src/notifications/notificationTemplates.list.js:66 +#: client/src/notifications/notificationTemplates.list.js:65 msgid "Test notification" msgstr "" -#: client/src/shared/form-generator.js:1410 +#: client/src/shared/form-generator.js:1414 +#: client/src/shared/form-generator.js:1420 msgid "That value was not found. Please enter or select a valid value." msgstr "" @@ -2249,6 +3067,10 @@ msgstr "" msgid "The SCM update process is running." msgstr "" +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:70 +msgid "The credential used to run this command." +msgstr "" + #: client/src/forms/Credentials.js:191 msgid "The email address assigned to the Google Compute Engine %sservice account." msgstr "" @@ -2262,11 +3084,15 @@ msgstr "" msgid "The host value" msgstr "" -#: client/src/forms/JobTemplates.js:210 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:61 +msgid "The inventory this command ran on." +msgstr "" + +#: client/src/forms/JobTemplates.js:212 msgid "The number of parallel or simultaneous processes to use while executing the playbook. 0 signifies the default value from the %sansible configuration file%s." msgstr "" -#: client/src/job-results/job-results.controller.js:538 +#: client/src/job-results/job-results.controller.js:554 msgid "The output is too large to display. Please download." msgstr "" @@ -2278,6 +3104,18 @@ msgstr "" msgid "The selected project is not configured for SCM. To configure for SCM, edit the project and provide SCM settings, and then run an update." msgstr "" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:124 +msgid "The time must be in HH24:MM:SS format." +msgstr "" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:79 +msgid "The user who ran this command." +msgstr "" + +#: client/src/lists/Streams.js:19 +msgid "There are no events to display at this time" +msgstr "" + #: client/src/lists/PortalJobTemplates.js:20 msgid "There are no job templates to display at this time" msgstr "" @@ -2298,6 +3136,10 @@ msgstr "" msgid "There was an error resetting values. Returned status:" msgstr "" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:168 +msgid "This is not a valid number." +msgstr "" + #: client/src/helpers/Credentials.js:139 #: client/src/helpers/Credentials.js:275 msgid "This is the tenant name. This value is usually the same as the username." @@ -2307,7 +3149,7 @@ msgstr "" msgid "This list is populated by notification templates added from the %sNotifications%s section" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:199 +#: client/src/notifications/notificationTemplates.form.js:202 msgid "This must be of the form %s." msgstr "" @@ -2315,8 +3157,8 @@ msgstr "" msgid "This user is not a member of any teams" msgstr "" -#: client/src/shared/form-generator.js:830 -#: client/src/shared/form-generator.js:944 +#: client/src/shared/form-generator.js:831 +#: client/src/shared/form-generator.js:945 msgid "This value does not match the password you entered previously. Please confirm that password." msgstr "" @@ -2325,6 +3167,8 @@ msgid "This will reset all configuration values to their factory defaults. Are y msgstr "" #: client/src/dashboard/lists/jobs/jobs-list.partial.html:14 +#: client/src/lists/Streams.js:28 +#: client/src/notifications/notification-templates-list/list.controller.js:74 msgid "Time" msgstr "" @@ -2336,11 +3180,21 @@ msgstr "" msgid "Time in seconds to consider a project to be current. During job runs and callbacks the task system will evaluate the timestamp of the latest project update. If it is older than Cache Timeout, it is not considered current, and a new project update will be performed." msgstr "" +#: client/src/forms/EventsViewer.js:74 +#: client/src/forms/EventsViewer.js:78 +#: client/src/forms/EventsViewer.js:82 +msgid "Timing" +msgstr "" + #: client/src/forms/Credentials.js:126 msgid "To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." msgstr "" -#: client/src/shared/form-generator.js:855 +#: client/src/job-detail/job-detail.partial.html:416 +msgid "Toggle Output" +msgstr "" + +#: client/src/shared/form-generator.js:856 msgid "Toggle the display of plaintext." msgstr "" @@ -2349,35 +3203,40 @@ msgstr "" msgid "Token" msgstr "" +#: client/src/partials/logviewer.html:6 +msgid "Traceback" +msgstr "" + #: client/src/forms/Credentials.js:61 #: client/src/forms/Credentials.js:85 #: client/src/forms/Teams.js:130 -#: client/src/forms/Users.js:196 +#: client/src/forms/Users.js:197 #: client/src/forms/WorkflowMaker.js:34 +#: client/src/lists/AllJobs.js:61 #: client/src/lists/CompletedJobs.js:50 #: client/src/lists/Credentials.js:39 #: client/src/lists/Projects.js:43 -#: client/src/lists/ScheduledJobs.js:43 +#: client/src/lists/ScheduledJobs.js:44 #: client/src/lists/Templates.js:31 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:38 +#: client/src/notifications/notificationTemplates.form.js:57 +#: client/src/notifications/notificationTemplates.list.js:37 #: client/src/notifications/notifications.list.js:31 msgid "Type" msgstr "" #: client/src/forms/Credentials.js:25 -#: client/src/notifications/notificationTemplates.form.js:23 +#: client/src/notifications/notificationTemplates.form.js:26 msgid "Type Details" msgstr "" -#: client/src/notifications/notificationTemplates.form.js:212 -#: client/src/notifications/notificationTemplates.form.js:97 +#: client/src/notifications/notificationTemplates.form.js:100 +#: client/src/notifications/notificationTemplates.form.js:215 msgid "Type an option on each line." msgstr "" -#: client/src/notifications/notificationTemplates.form.js:141 -#: client/src/notifications/notificationTemplates.form.js:158 -#: client/src/notifications/notificationTemplates.form.js:371 +#: client/src/notifications/notificationTemplates.form.js:144 +#: client/src/notifications/notificationTemplates.form.js:161 +#: client/src/notifications/notificationTemplates.form.js:374 msgid "Type an option on each line. The pound symbol (#) is not required." msgstr "" @@ -2390,7 +3249,9 @@ msgstr "" msgid "USERNAME" msgstr "" -#: client/src/app.js:364 +#: client/src/app.js:367 +#: client/src/helpers/ActivityStream.js:32 +#: client/src/organizations/linkout/organizations-linkout.route.js:59 msgid "USERS" msgstr "" @@ -2410,23 +3271,36 @@ msgstr "" msgid "Upgrade" msgstr "" +#: client/src/notifications/notificationTemplates.form.js:408 +msgid "Use SSL" +msgstr "" + +#: client/src/notifications/notificationTemplates.form.js:403 +msgid "Use TLS" +msgstr "" + #: client/src/forms/Credentials.js:77 msgid "Used to check out and synchronize playbook repositories with a remote source control management system such as Git, Subversion (svn), or Mercurial (hg). These credentials are used by Projects." msgstr "" -#: client/src/forms/Credentials.js:456 -#: client/src/forms/Inventories.js:115 -#: client/src/forms/Inventories.js:161 -#: client/src/forms/Organizations.js:83 -#: client/src/forms/Projects.js:244 +#: client/src/forms/Credentials.js:457 +#: client/src/forms/Inventories.js:116 +#: client/src/forms/Organizations.js:84 +#: client/src/forms/Projects.js:245 #: client/src/forms/Teams.js:93 +#: client/src/forms/Workflows.js:136 msgid "User" msgstr "" +#: client/src/configuration/configuration.partial.html:18 +msgid "User Interface" +msgstr "" + #: client/src/forms/Users.js:94 msgid "User Type" msgstr "" +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 #: client/src/forms/Users.js:49 #: client/src/helpers/Credentials.js:118 #: client/src/helpers/Credentials.js:225 @@ -2435,7 +3309,7 @@ msgstr "" #: client/src/helpers/Credentials.js:56 #: client/src/helpers/Credentials.js:89 #: client/src/lists/Users.js:37 -#: client/src/notifications/notificationTemplates.form.js:64 +#: client/src/notifications/notificationTemplates.form.js:67 msgid "Username" msgstr "" @@ -2443,6 +3317,8 @@ msgstr "" msgid "Usernames, passwords, and access keys for authenticating to the specified cloud or infrastructure provider. These are used for dynamic inventory sources and for cloud provisioning and deployment in playbook runs." msgstr "" +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 #: client/src/forms/Teams.js:75 #: client/src/lists/Users.js:26 #: client/src/lists/Users.js:27 @@ -2475,8 +3351,10 @@ msgstr "" msgid "Vault Password" msgstr "" -#: client/src/forms/JobTemplates.js:237 -#: client/src/forms/JobTemplates.js:244 +#: client/src/forms/JobTemplates.js:239 +#: client/src/forms/JobTemplates.js:246 +#: client/src/job-detail/job-detail.partial.html:148 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:99 msgid "Verbosity" msgstr "" @@ -2489,13 +3367,20 @@ msgstr "" #: client/src/inventory-scripts/inventory-scripts.list.js:65 #: client/src/lists/Credentials.js:81 #: client/src/lists/Inventories.js:85 +#: client/src/lists/JobEvents.js:98 +#: client/src/lists/Schedules.js:85 +#: client/src/lists/Streams.js:66 #: client/src/lists/Teams.js:69 -#: client/src/lists/Templates.js:117 +#: client/src/lists/Templates.js:116 #: client/src/lists/Users.js:78 -#: client/src/notifications/notificationTemplates.list.js:81 +#: client/src/notifications/notificationTemplates.list.js:80 msgid "View" msgstr "" +#: client/src/bread-crumb/bread-crumb.directive.js:111 +msgid "View Activity Stream" +msgstr "" + #: client/src/main-menu/main-menu.partial.html:173 msgid "View Documentation" msgstr "" @@ -2504,9 +3389,9 @@ msgstr "" msgid "View JSON examples at %s" msgstr "" -#: client/src/forms/JobTemplates.js:463 -#: client/src/forms/Workflows.js:163 -#: client/src/shared/form-generator.js:1716 +#: client/src/forms/JobTemplates.js:466 +#: client/src/forms/Workflows.js:164 +#: client/src/shared/form-generator.js:1727 msgid "View Survey" msgstr "" @@ -2526,6 +3411,11 @@ msgstr "" msgid "View credential" msgstr "" +#: client/src/lists/JobEvents.js:100 +#: client/src/lists/Streams.js:70 +msgid "View event details" +msgstr "" + #: client/src/setup-menu/setup-menu.partial.html:60 msgid "View information about this version of Ansible Tower." msgstr "" @@ -2538,23 +3428,31 @@ msgstr "" msgid "View inventory script" msgstr "" -#: client/src/notifications/notificationTemplates.list.js:83 +#: client/src/notifications/notificationTemplates.list.js:82 msgid "View notification" msgstr "" +#: client/src/lists/Schedules.js:87 +msgid "View schedule" +msgstr "" + #: client/src/lists/Teams.js:72 msgid "View team" msgstr "" -#: client/src/lists/Templates.js:119 +#: client/src/lists/Templates.js:118 msgid "View template" msgstr "" -#: client/src/lists/Projects.js:110 +#: client/src/lists/AllJobs.js:94 +msgid "View the job" +msgstr "" + +#: client/src/lists/Projects.js:109 msgid "View the project" msgstr "" -#: client/src/lists/ScheduledJobs.js:74 +#: client/src/lists/ScheduledJobs.js:75 msgid "View the schedule" msgstr "" @@ -2562,10 +3460,20 @@ msgstr "" msgid "View user" msgstr "" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:25 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:25 +msgid "View workflow results" +msgstr "" + #: client/src/forms/Workflows.js:22 msgid "WORKFLOW" msgstr "" +#: client/src/job-detail/job-detail.partial.html:313 +#: client/src/job-detail/job-detail.partial.html:368 +msgid "Waiting..." +msgstr "" + #: client/src/configuration/auth-form/configuration-auth.controller.js:68 #: client/src/configuration/configuration.controller.js:179 #: client/src/configuration/configuration.controller.js:241 @@ -2586,8 +3494,8 @@ msgstr "" msgid "When this template is submitted as a job, setting the type to %s will execute the playbook, running tasks on the selected hosts." msgstr "" -#: client/src/forms/Workflows.js:187 -#: client/src/shared/form-generator.js:1720 +#: client/src/forms/Workflows.js:188 +#: client/src/shared/form-generator.js:1731 msgid "Workflow Editor" msgstr "" @@ -2595,10 +3503,23 @@ msgstr "" msgid "Workflow Job Template" msgstr "" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:103 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:40 +msgid "Workflow Templates" +msgstr "" + +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:58 +msgid "You can create a job template here." +msgstr "" + #: client/src/controllers/Projects.js:508 msgid "You do not have access to view this property" msgstr "" +#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:26 +msgid "You do not have permission to add a job template." +msgstr "" + #: client/src/controllers/Projects.js:324 msgid "You do not have permission to add a project." msgstr "" @@ -2614,23 +3535,23 @@ msgstr "" msgid "You have unsaved changes. Would you like to proceed without saving?" msgstr "" -#: client/src/shared/form-generator.js:956 +#: client/src/shared/form-generator.js:957 msgid "Your password must be %d characters long." msgstr "" -#: client/src/shared/form-generator.js:961 +#: client/src/shared/form-generator.js:962 msgid "Your password must contain a lowercase letter." msgstr "" -#: client/src/shared/form-generator.js:971 +#: client/src/shared/form-generator.js:972 msgid "Your password must contain a number." msgstr "" -#: client/src/shared/form-generator.js:966 +#: client/src/shared/form-generator.js:967 msgid "Your password must contain an uppercase letter." msgstr "" -#: client/src/shared/form-generator.js:976 +#: client/src/shared/form-generator.js:977 msgid "Your password must contain one of the following characters: %s" msgstr "" @@ -2642,10 +3563,18 @@ msgstr "" msgid "Your session timed out due to inactivity. Please sign in." msgstr "" -#: client/src/shared/form-generator.js:1222 +#: client/src/shared/form-generator.js:1223 msgid "and" msgstr "" +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:22 +msgid "name" +msgstr "" + +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:25 +msgid "organization" +msgstr "" + #: client/src/forms/Credentials.js:139 #: client/src/forms/Credentials.js:365 msgid "set in helpers/credentials" diff --git a/awx/ui/po/fr.po b/awx/ui/po/fr.po index e4d820a8ff..3f5cafc3bd 100644 --- a/awx/ui/po/fr.po +++ b/awx/ui/po/fr.po @@ -3,30 +3,31 @@ # tfujiwar , 2017. #zanata msgid "" msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2017-01-23 11:29+0000\n" -"Last-Translator: Copied by Zanata \n" -"Language-Team: French\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Project-Id-Version: \n" +"MIME-Version: 1.0\n" +"PO-Revision-Date: 2017-02-06 03:40+0000\n" +"Last-Translator: Copied by Zanata \n" +"Language-Team: French\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Zanata 3.9.6\n" -#: client/src/notifications/notificationTemplates.form.js:372 +#: client/src/notifications/notificationTemplates.form.js:375 msgid "%s or %s" msgstr "%s ou %s" #: client/src/controllers/Projects.js:437 #: client/src/controllers/Projects.js:719 msgid "" -"%sNote:%s Mercurial does not support password authentication for SSH. Do not" -" put the username and key in the URL. If using Bitbucket and SSH, do not " +"%sNote:%s Mercurial does not support password authentication for SSH. Do not " +"put the username and key in the URL. If using Bitbucket and SSH, do not " "supply your Bitbucket username." msgstr "" -"%Remarque :%s Mercurial ne prend pas en charge l'authentification par mot de" -" passe pour SSH. N'entrez ni le nom d'utilisateur, ni la clé dans l'URL. Si " -"vous utilisez Bitbucket et SSH, ne saisissez pas votre nom d'utilisateur " +"%sRemarque%s : Mercurial ne prend pas en charge l'authentification par mot " +"de passe pour SSH. N'entrez ni le nom d'utilisateur, ni la clé dans l'URL. " +"Si vous utilisez Bitbucket et SSH, ne saisissez pas votre nom d'utilisateur " "Bitbucket." #: client/src/controllers/Projects.js:424 @@ -37,12 +38,11 @@ msgid "" "Bitbucket do not support password authentication when using SSH. GIT read " "only protocol (git://) does not use username or password information." msgstr "" -"%Remarque :%s Si vous utilisez le protocole SSH pour GitHub ou Bitbucket, " +"%sRemarque%s : Si vous utilisez le protocole SSH pour GitHub ou Bitbucket, " "entrez uniquement une clé SSH sans nom d'utilisateur (autre que git). De " "plus, GitHub et Bitbucket ne prennent pas en charge l'authentification par " -"mot de passe lorsque SSH est utilisé. Le protocole GIT en lecture seule " -"(git://) n'utilise pas les informations de nom d'utilisateur ou de mot de " -"passe." +"mot de passe lorsque SSH est utilisé. Le protocole GIT en lecture seule (git:" +"//) n'utilise pas les informations de nom d'utilisateur ou de mot de passe." #: client/src/forms/Credentials.js:288 msgid "(defaults to %s)" @@ -52,35 +52,74 @@ msgstr "(défini par défaut sur %s)" msgid "+ ADD" msgstr "+ AJOUTER" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 +msgid "A schedule name is required." +msgstr "Un intitulé est requis pour la programmation" + #: client/src/controllers/Users.js:185 msgid "A value is required" msgstr "Entrez une valeur" -#: client/src/forms/Credentials.js:449 client/src/forms/Inventories.js:153 -#: client/src/forms/JobTemplates.js:427 client/src/forms/Organizations.js:75 -#: client/src/forms/Projects.js:237 client/src/forms/Teams.js:85 -#: client/src/forms/Workflows.js:127 +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:167 +msgid "A value is required." +msgstr "Entrez une valeur." + +#: client/src/about/about.route.js:10 +msgid "ABOUT" +msgstr "À PROPOS" + +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:16 +msgid "ACTION" +msgstr "ACTION" + +#: client/src/activity-stream/activitystream.route.js:27 +msgid "ACTIVITY STREAM" +msgstr "FLUX D'ACTIVITÉ" + +#: client/src/forms/Credentials.js:450 +#: client/src/forms/JobTemplates.js:430 +#: client/src/forms/Organizations.js:76 +#: client/src/forms/Projects.js:238 +#: client/src/forms/Teams.js:85 +#: client/src/forms/Workflows.js:128 #: client/src/inventory-scripts/inventory-scripts.list.js:45 -#: client/src/lists/Credentials.js:60 client/src/lists/Inventories.js:68 -#: client/src/lists/Projects.js:77 client/src/lists/Teams.js:50 -#: client/src/lists/Templates.js:62 client/src/lists/Users.js:58 -#: client/src/notifications/notificationTemplates.list.js:53 +#: client/src/lists/Credentials.js:60 +#: client/src/lists/Inventories.js:68 +#: client/src/lists/Projects.js:77 +#: client/src/lists/Schedules.js:70 +#: client/src/lists/Teams.js:50 +#: client/src/lists/Templates.js:62 +#: client/src/lists/Users.js:58 +#: client/src/notifications/notificationTemplates.list.js:52 msgid "ADD" msgstr "AJOUTER" -#: client/src/notifications/notifications.list.js:68 +#: client/src/notifications/notifications.list.js:66 msgid "ADD NOTIFICATION TEMPLATE" msgstr "AJOUTER UN MODÈLE DE NOTIFICATION" -#: client/src/forms/Teams.js:157 client/src/forms/Users.js:212 +#: client/src/forms/Teams.js:157 +#: client/src/forms/Users.js:213 msgid "ADD PERMISSIONS" -msgstr "" +msgstr "AJOUTER PERMISSION" + +#: client/src/shared/smart-search/smart-search.partial.html:54 +msgid "ADDITIONAL INFORMATION:" +msgstr "INFORMATIONS SUPPLÉMENTAIRES :" + +#: client/src/organizations/linkout/organizations-linkout.route.js:363 +msgid "ADMINS" +msgstr "ADMINS" + +#: client/src/helpers/ActivityStream.js:19 +msgid "ALL ACTIVITY" +msgstr "ACTIVITÉS" #: client/src/forms/Credentials.js:199 msgid "API Key" msgstr "Clé API" -#: client/src/notifications/notificationTemplates.form.js:248 +#: client/src/notifications/notificationTemplates.form.js:251 msgid "API Service/Integration Key" msgstr "Service API/Clé d'intégration" @@ -96,16 +135,20 @@ msgstr "Tower" msgid "Access Key" msgstr "Clé d'accès" -#: client/src/notifications/notificationTemplates.form.js:226 +#: client/src/notifications/notificationTemplates.form.js:229 msgid "Account SID" msgstr "SID de compte" -#: client/src/notifications/notificationTemplates.form.js:184 +#: client/src/notifications/notificationTemplates.form.js:187 msgid "Account Token" msgstr "Token de compte" +#: client/src/forms/ActivityDetail.js:38 +msgid "Action" +msgstr "Action" + #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:20 -#: client/src/shared/list-generator/list-generator.factory.js:542 +#: client/src/shared/list-generator/list-generator.factory.js:546 msgid "Actions" msgstr "Actions" @@ -114,13 +157,21 @@ msgstr "Actions" msgid "Activity" msgstr "Activité" +#: client/src/forms/ActivityDetail.js:25 +msgid "Activity Detail" +msgstr "Détails sur l'activité" + #: client/src/configuration/system-form/configuration-system.controller.js:81 +#: client/src/lists/Streams.js:16 +#: client/src/lists/Streams.js:17 msgid "Activity Stream" msgstr "Flux d'activité" -#: client/src/forms/Inventories.js:104 client/src/forms/Inventories.js:150 -#: client/src/forms/Organizations.js:72 client/src/forms/Teams.js:82 -#: client/src/forms/Workflows.js:124 +#: client/src/forms/Inventories.js:105 +#: client/src/forms/Organizations.js:73 +#: client/src/forms/Teams.js:82 +#: client/src/forms/Workflows.js:125 +#: client/src/organizations/linkout/addUsers/addUsers.partial.html:8 msgid "Add" msgstr "Ajouter" @@ -136,16 +187,21 @@ msgstr "Ajouter des hôtes existants" msgid "Add Inventories" msgstr "Ajouter des inventaires" -#: client/src/notifications/notifications.list.js:63 +#: client/src/notifications/notifications.list.js:61 msgid "Add Notification" msgstr "Ajouter une notification" +#: client/src/shared/stateDefinitions.factory.js:277 +msgid "Add Permissions" +msgstr "Ajouter les permissions" + #: client/src/lists/Projects.js:15 msgid "Add Project" msgstr "Ajouter un projet" -#: client/src/forms/JobTemplates.js:472 client/src/forms/Workflows.js:172 -#: client/src/shared/form-generator.js:1708 +#: client/src/forms/JobTemplates.js:475 +#: client/src/forms/Workflows.js:173 +#: client/src/shared/form-generator.js:1719 msgid "Add Survey" msgstr "Ajouter un questionnaire" @@ -155,16 +211,24 @@ msgstr "Ajouter une équipe" #: client/src/forms/Teams.js:83 msgid "Add User" -msgstr "" +msgstr "Ajouter un utilisateur" #: client/src/lists/Users.js:25 +#: client/src/shared/stateDefinitions.factory.js:342 +#: client/src/shared/stateDefinitions.factory.js:511 msgid "Add Users" msgstr "Ajouter des utilisateurs" -#: client/src/forms/Credentials.js:447 client/src/forms/Inventories.js:106 -#: client/src/forms/Inventories.js:151 client/src/forms/JobTemplates.js:425 -#: client/src/forms/Organizations.js:73 client/src/forms/Projects.js:235 -#: client/src/forms/Workflows.js:125 +#: client/src/lists/Schedules.js:68 +msgid "Add a new schedule" +msgstr "Ajouter une nouvelle programmation" + +#: client/src/forms/Credentials.js:448 +#: client/src/forms/Inventories.js:107 +#: client/src/forms/JobTemplates.js:428 +#: client/src/forms/Organizations.js:74 +#: client/src/forms/Projects.js:236 +#: client/src/forms/Workflows.js:126 msgid "Add a permission" msgstr "Ajouter une permission" @@ -177,7 +241,7 @@ msgstr "" "utiliser lors du lancement de tâches sur des machines ou durant la " "synchronisation d'inventaires ou de projets." -#: client/src/shared/form-generator.js:1451 +#: client/src/shared/form-generator.js:1462 msgid "Admin" msgstr "Administrateur" @@ -185,14 +249,24 @@ msgstr "Administrateur" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:43 #: client/src/dashboard/graphs/dashboard-graphs.partial.html:65 #: client/src/dashboard/graphs/dashboard-graphs.partial.html:74 +#: client/src/job-detail/job-detail.partial.html:197 +#: client/src/job-detail/job-detail.partial.html:256 +#: client/src/job-detail/job-detail.partial.html:340 msgid "All" msgstr "Tous" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 +msgid "All Activity" +msgstr "Activités" + +#: client/src/lists/AllJobs.js:16 #: client/src/portal-mode/portal-mode-jobs.partial.html:7 +#: client/src/portal-mode/portal-mode-layout.partial.html:12 msgid "All Jobs" msgstr "Toutes les tâches" -#: client/src/forms/JobTemplates.js:301 client/src/forms/JobTemplates.js:308 +#: client/src/forms/JobTemplates.js:303 +#: client/src/forms/JobTemplates.js:310 msgid "Allow Provisioning Callbacks" msgstr "Autoriser les rappels d'exécution de Tower job_template" @@ -214,6 +288,24 @@ msgstr "" "Une mise à jour SCM ne semble pas s'exécuter pour le projet : %s. Cliquez " "sur le bouton %sActualiser%s pour voir l'état le plus récent." +#: client/src/controllers/Credentials.js:105 +msgid "Are you sure you want to delete the credential below?" +msgstr "" +"Voulez-vous vraiment supprimer les informations d'identification ci-" +"dessous ?" + +#: client/src/helpers/Jobs.js:231 +msgid "Are you sure you want to delete the job below?" +msgstr "Voulez-vous vraiment supprimer la tâche ci-dessous ?" + +#: client/src/notifications/notification-templates-list/list.controller.js:184 +msgid "Are you sure you want to delete the notification template below?" +msgstr "Voulez-vous vraiment supprimer le modèle de notification ci-dessous ?" + +#: client/src/organizations/list/organizations-list.controller.js:166 +msgid "Are you sure you want to delete the organization below?" +msgstr "Voulez-vous vraiment supprimer l'organisation ci-dessous ?" + #: client/src/controllers/Projects.js:202 msgid "Are you sure you want to delete the project below?" msgstr "Voulez-vous vraiment supprimer le projet ci-dessous ?" @@ -222,19 +314,30 @@ msgstr "Voulez-vous vraiment supprimer le projet ci-dessous ?" msgid "Are you sure you want to delete the user below?" msgstr "Voulez-vous vraiment supprimer l'utilisateur ci-dessous ?" +#: client/src/controllers/Credentials.js:579 #: client/src/controllers/Projects.js:687 msgid "Are you sure you want to remove the %s below from %s?" msgstr "Voulez-vous vraimment supprimer le %s ci-dessous de %s ?" -#: client/src/forms/Credentials.js:233 client/src/forms/Credentials.js:272 -#: client/src/forms/Credentials.js:312 client/src/forms/Credentials.js:398 +#: client/src/forms/EventsViewer.js:57 +msgid "Arguments" +msgstr "Arguments" + +#: client/src/forms/Credentials.js:233 +#: client/src/forms/Credentials.js:272 +#: client/src/forms/Credentials.js:312 +#: client/src/forms/Credentials.js:398 msgid "Ask at runtime?" msgstr "Demander durant l'éxecution ?" -#: client/src/shared/form-generator.js:1453 +#: client/src/shared/form-generator.js:1464 msgid "Auditor" msgstr "Auditeur" +#: client/src/configuration/configuration.partial.html:15 +msgid "Authentication" +msgstr "Authentification" + #: client/src/forms/Credentials.js:73 msgid "" "Authentication for network device access. This can include SSH keys, " @@ -253,8 +356,8 @@ msgid "" "usernames, passwords, and sudo information. Machine credentials are used " "when submitting jobs to run playbooks against remote hosts." msgstr "" -"Authentification pour l'accès aux machines distantes. Il peut s'agir de clés" -" SSH, de noms d'utilisateur, de mots de passe et d'informations sudo. Les " +"Authentification pour l'accès aux machines distantes. Il peut s'agir de clés " +"SSH, de noms d'utilisateur, de mots de passe et d'informations sudo. Les " "informations d'identification de machine sont utilisées au cours de l'envoi " "de tâches afin d'exécuter des playbooks sur des hôtes distants." @@ -270,6 +373,10 @@ msgstr "Mot de passe d'autorisation" msgid "Azure AD" msgstr "Azure AD" +#: client/src/shared/directives.js:133 +msgid "BROWSE" +msgstr "NAVIGUER" + #: client/src/forms/Projects.js:80 msgid "" "Base path used for locating playbooks. Directories found inside this path " @@ -283,7 +390,7 @@ msgstr "" "sélectionnés fournissent ensemble le chemin complet servant à localiser les " "playbooks." -#: client/src/forms/JobTemplates.js:295 +#: client/src/forms/JobTemplates.js:297 msgid "Become Privilege Escalation" msgstr "Activer l'élévation des privilèges" @@ -291,7 +398,41 @@ msgstr "Activer l'élévation des privilèges" msgid "Browse" msgstr "Parcourir" -#: client/src/app.js:316 +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:20 +msgid "CHANGES" +msgstr "MODIFICATIONS" + +#: client/src/shared/smart-search/smart-search.partial.html:31 +msgid "CLEAR ALL" +msgstr "TOUT EFFACER" + +#: client/src/inventories/manage/copy-move/copy-move.route.js:29 +#: client/src/inventories/manage/copy-move/copy-move.route.js:65 +msgid "COPY OR MOVE" +msgstr "COPIER OU DÉPLACER" + +#: client/src/shared/stateDefinitions.factory.js:153 +msgid "CREATE %s" +msgstr "CRÉER %s" + +#: client/src/inventories/main.js:110 +#: client/src/scheduler/main.js:176 +#: client/src/scheduler/main.js:253 +#: client/src/scheduler/main.js:90 +msgid "CREATE SCHEDULE" +msgstr "CRÉER UNE PROGRAMMATION" + +#: client/src/management-jobs/scheduler/main.js:74 +msgid "CREATE SCHEDULED JOB" +msgstr "CRÉER UNE TÂCHE PROGRAMMÉE" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:80 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:82 +msgid "CREDENTIAL" +msgstr "INFORMATIONS D'IDENTIFICATION" + +#: client/src/app.js:319 +#: client/src/helpers/ActivityStream.js:29 msgid "CREDENTIALS" msgstr "INFORMATIONS D'IDENTIFICATION" @@ -303,7 +444,8 @@ msgstr "Expiration du délai d'attente du cache" msgid "Cache Timeout%s (seconds)%s" msgstr "Expiration du délai d'attente du cache%s (secondes)%s" -#: client/src/controllers/Projects.js:193 client/src/controllers/Users.js:95 +#: client/src/controllers/Projects.js:193 +#: client/src/controllers/Users.js:95 msgid "Call to %s failed. DELETE returned status:" msgstr "Échec de l'appel de %s. État DELETE renvoyé :" @@ -320,12 +462,20 @@ msgstr "Échec de l'appel de %s. État POST renvoyé :" msgid "Call to %s failed. POST status:" msgstr "Échec de l'appel de %s. État POST :" +#: client/src/management-jobs/card/card.controller.js:30 +msgid "Call to %s failed. Return status: %d" +msgstr "Échec de l'appel de %s. État du renvoie : %d" + #: client/src/controllers/Projects.js:266 msgid "Call to get project failed. GET status:" msgstr "Échec de l'appel du projet en GET. État GET :" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:171 #: client/src/configuration/configuration.controller.js:449 -#: client/src/shared/form-generator.js:1696 +#: client/src/helpers/Jobs.js:161 +#: client/src/shared/form-generator.js:1707 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:12 +#: client/src/workflow-results/workflow-results.partial.html:42 msgid "Cancel" msgstr "Annuler" @@ -333,26 +483,44 @@ msgstr "Annuler" msgid "Cancel Not Allowed" msgstr "Annulation non autorisée" -#: client/src/lists/Projects.js:123 +#: client/src/lists/Projects.js:122 msgid "Cancel the SCM update" msgstr "Annuler la mise à jour SCM" +#: client/src/lists/AllJobs.js:108 +msgid "Cancel the job" +msgstr "Annulation de la tâche" + #: client/src/controllers/Projects.js:82 +#: client/src/helpers/Projects.js:79 msgid "Canceled. Click for details" msgstr "Annulé. Cliquez pour connaître les détails." +#: client/src/shared/smart-search/smart-search.controller.js:38 +#: client/src/shared/smart-search/smart-search.controller.js:80 +msgid "Cannot search running job" +msgstr "Impossible de rechercher les tâches en cours" + #: client/src/forms/Projects.js:82 msgid "Change %s under \"Configure Tower\" to change this location." msgstr "Modifiez %s sous \"Configurer Tower\" pour changer d'emplacement." -#: client/src/shared/form-generator.js:1082 +#: client/src/forms/ActivityDetail.js:43 +msgid "Changes" +msgstr "Modifications" + +#: client/src/shared/form-generator.js:1083 msgid "Choose a %s" msgstr "Choisir un %s" +#: client/src/shared/directives.js:134 +msgid "Choose file" +msgstr "Choisir un fichier" + #: client/src/license/license.partial.html:97 msgid "" -"Choose your license file, agree to the End User License Agreement, and click" -" submit." +"Choose your license file, agree to the End User License Agreement, and click " +"submit." msgstr "" "Choisissez votre fichier de licence, acceptez le Contrat de licence de " "l'utilisateur final et validez." @@ -379,8 +547,8 @@ msgstr "" #: client/src/lists/Templates.js:19 msgid "" -"Click on a row to select it, and click Finished when done. Use the %s button" -" to create a new job template." +"Click on a row to select it, and click Finished when done. Use the %s button " +"to create a new job template." msgstr "" "Cliquez sur une ligne pour la sélectionner, puis sur Terminé lorsque vous " "avez fini. Cliquez sur le bouton %s pour créer un modèle de tâche." @@ -389,7 +557,7 @@ msgstr "" msgid "Client ID" msgstr "ID du client" -#: client/src/notifications/notificationTemplates.form.js:259 +#: client/src/notifications/notificationTemplates.form.js:262 msgid "Client Identifier" msgstr "Identifiant client" @@ -397,25 +565,28 @@ msgstr "Identifiant client" msgid "Client Secret" msgstr "Question secrète du client" -#: client/src/shared/form-generator.js:1700 +#: client/src/shared/form-generator.js:1711 msgid "Close" msgstr "Fermer" -#: client/src/forms/JobTemplates.js:166 client/src/forms/JobTemplates.js:178 +#: client/src/forms/JobTemplates.js:168 +#: client/src/forms/JobTemplates.js:180 +#: client/src/job-detail/job-detail.partial.html:124 msgid "Cloud Credential" msgstr "Informations d'identification cloud" -#: client/src/helpers/Credentials.js:160 client/src/helpers/Credentials.js:296 +#: client/src/helpers/Credentials.js:160 +#: client/src/helpers/Credentials.js:296 msgid "CloudForms URL" -msgstr "" +msgstr "URL CloudForms" -#: client/src/job-results/job-results.controller.js:193 +#: client/src/job-results/job-results.controller.js:205 #: client/src/standard-out/standard-out.controller.js:233 -#: client/src/workflow-results/workflow-results.controller.js:109 +#: client/src/workflow-results/workflow-results.controller.js:131 msgid "Collapse Output" -msgstr "" +msgstr "Tout réduire" -#: client/src/notifications/notificationTemplates.form.js:295 +#: client/src/notifications/notificationTemplates.form.js:298 msgid "Color can be one of %s." msgstr "La couleur peut être l'une des %s." @@ -427,6 +598,11 @@ msgstr "Tâches terminées" msgid "Configure Notifications" msgstr "Configurer les notifications" +#: client/src/configuration/configuration.partial.html:10 +#: client/src/setup-menu/setup-menu.partial.html:53 +msgid "Configure Tower" +msgstr "Configurer Tower" + #: client/src/forms/Users.js:82 msgid "Confirm Password" msgstr "Confirmer le mot de passe" @@ -439,26 +615,28 @@ msgstr "Confirmer la réinitialisation" msgid "Confirm factory reset" msgstr "Confirmer la réinitialisation usine" -#: client/src/forms/JobTemplates.js:257 client/src/forms/JobTemplates.js:275 -#: client/src/forms/WorkflowMaker.js:141 client/src/forms/WorkflowMaker.js:156 +#: client/src/forms/JobTemplates.js:259 +#: client/src/forms/JobTemplates.js:277 +#: client/src/forms/WorkflowMaker.js:141 +#: client/src/forms/WorkflowMaker.js:156 msgid "" "Consult the Ansible documentation for further details on the usage of tags." msgstr "" "Consultez la documentation d'Ansible pour en savoir plus sur l'utilisation " "des balises." -#: client/src/forms/JobTemplates.js:243 +#: client/src/forms/JobTemplates.js:245 msgid "" "Control the level of output ansible will produce as the playbook executes." msgstr "" "Contrôlez le niveau de sortie qu'Ansible génère lors de l'exécution du " "playbook." -#: client/src/lists/Templates.js:100 +#: client/src/lists/Templates.js:99 msgid "Copy" msgstr "Copier" -#: client/src/lists/Templates.js:103 +#: client/src/lists/Templates.js:102 msgid "Copy template" msgstr "Copier le modèle" @@ -482,8 +660,8 @@ msgstr "Créer un inventaire personnalisé" msgid "Create a new inventory" msgstr "Créer un inventaire" -#: client/src/notifications/notificationTemplates.list.js:51 -#: client/src/notifications/notifications.list.js:66 +#: client/src/notifications/notificationTemplates.list.js:50 +#: client/src/notifications/notifications.list.js:64 msgid "Create a new notification template" msgstr "Créer un modèle de notification" @@ -521,43 +699,82 @@ msgstr "" "Créer des modèles pour envoyer des notifications via email, HipChat, Slack, " "et SMS." -#: client/src/forms/JobTemplates.js:156 client/src/forms/WorkflowMaker.js:60 +#: client/src/forms/EventsViewer.js:32 +#: client/src/lists/JobEvents.js:44 +msgid "Created On" +msgstr "Créé le" + +#: client/src/forms/JobTemplates.js:157 +#: client/src/forms/WorkflowMaker.js:60 #: client/src/forms/WorkflowMaker.js:69 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:67 msgid "Credential" msgstr "Information d'identification" -#: client/src/lists/Credentials.js:18 client/src/lists/Credentials.js:19 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:123 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:57 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 +#: client/src/lists/Credentials.js:18 +#: client/src/lists/Credentials.js:19 #: client/src/setup-menu/setup-menu.partial.html:22 msgid "Credentials" msgstr "Informations d'identification" -#: client/src/controllers/Credentials.js:345 +#: client/src/controllers/Credentials.js:349 msgid "" -"Credentials are only shared within an organization. Assign credentials to an" -" organization to delegate credential permissions. The organization cannot be" -" edited after credentials are assigned." +"Credentials are only shared within an organization. Assign credentials to an " +"organization to delegate credential permissions. The organization cannot be " +"edited after credentials are assigned." msgstr "" +"Les informations d'identification ne peuvent être partagées que dans " +"l'organisation. Allouer les informations d'identification à une organisation " +"pour déléguer les permissions d'informations d'identification." -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 +#: client/src/inventory-scripts/inventory-scripts.form.js:53 +#: client/src/inventory-scripts/inventory-scripts.form.js:63 msgid "Custom Script" msgstr "Script personnalisé" -#: client/src/app.js:408 +#: client/src/shared/directives.js:135 +msgid "Custom logo has been uploaded" +msgstr "Le logo personnalisé a été téléchargé" + +#: client/src/app.js:410 msgid "DASHBOARD" msgstr "TABLEAU DE BORD" -#: client/src/controllers/Projects.js:689 client/src/controllers/Users.js:104 +#: client/src/controllers/Credentials.js:107 +#: client/src/controllers/Credentials.js:581 +#: client/src/controllers/Projects.js:689 +#: client/src/controllers/Users.js:104 +#: client/src/notifications/notification-templates-list/list.controller.js:189 +#: client/src/organizations/list/organizations-list.controller.js:168 msgid "DELETE" msgstr "SUPPRIMER" +#: client/src/job-detail/job-detail.partial.html:176 +#: client/src/job-detail/job-detail.partial.html:179 +msgid "DETAILS" +msgstr "DÉTAILS" + +#: client/src/controllers/Credentials.js:104 +#: client/src/controllers/Credentials.js:578 #: client/src/controllers/Projects.js:201 -#: client/src/controllers/Projects.js:686 client/src/controllers/Users.js:101 +#: client/src/controllers/Projects.js:686 +#: client/src/controllers/Users.js:101 +#: client/src/helpers/Jobs.js:165 #: client/src/inventory-scripts/inventory-scripts.list.js:74 -#: client/src/lists/Credentials.js:91 client/src/lists/Inventories.js:92 -#: client/src/lists/Teams.js:77 client/src/lists/Templates.js:125 +#: client/src/lists/Credentials.js:91 +#: client/src/lists/Inventories.js:92 +#: client/src/lists/Schedules.js:92 +#: client/src/lists/Teams.js:77 +#: client/src/lists/Templates.js:124 #: client/src/lists/Users.js:87 -#: client/src/notifications/notificationTemplates.list.js:90 +#: client/src/notifications/notification-templates-list/list.controller.js:186 +#: client/src/notifications/notificationTemplates.list.js:89 +#: client/src/organizations/list/organizations-list.controller.js:165 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:13 +#: client/src/workflow-results/workflow-results.partial.html:54 msgid "Delete" msgstr "Supprimer" @@ -573,7 +790,7 @@ msgstr "Supprimer l'inventaire" msgid "Delete inventory script" msgstr "Supprimer le script d'inventaire" -#: client/src/notifications/notificationTemplates.list.js:92 +#: client/src/notifications/notificationTemplates.list.js:91 msgid "Delete notification" msgstr "Supprimer la notification" @@ -581,14 +798,19 @@ msgstr "Supprimer la notification" msgid "Delete on Update" msgstr "Supprimer lors de la mise à jour" +#: client/src/lists/Schedules.js:95 +msgid "Delete schedule" +msgstr "Supprimer la programmation" + #: client/src/lists/Teams.js:81 msgid "Delete team" msgstr "Supprimer l'équipe" -#: client/src/lists/Templates.js:128 +#: client/src/lists/Templates.js:127 msgid "Delete template" msgstr "Supprimer le modèle" +#: client/src/lists/AllJobs.js:115 #: client/src/lists/CompletedJobs.js:82 msgid "Delete the job" msgstr "Supprimer la tâche" @@ -600,11 +822,11 @@ msgstr "" "Supprimer le référentiel local dans son intégralité avant de lancer la mise " "à jour." -#: client/src/lists/Projects.js:117 +#: client/src/lists/Projects.js:116 msgid "Delete the project" msgstr "Supprimer le projet" -#: client/src/lists/ScheduledJobs.js:81 +#: client/src/lists/ScheduledJobs.js:82 msgid "Delete the schedule" msgstr "Supprimer la planification" @@ -620,39 +842,44 @@ msgstr "" "Selon la taille du référentiel, cette opération risque d'augmenter " "considérablement le délai d'exécution de la mise à jour." -#: client/src/forms/Credentials.js:41 client/src/forms/Inventories.js:37 -#: client/src/forms/JobTemplates.js:42 client/src/forms/Organizations.js:33 -#: client/src/forms/Projects.js:38 client/src/forms/Teams.js:34 -#: client/src/forms/Users.js:143 client/src/forms/Users.js:168 +#: client/src/forms/Credentials.js:41 +#: client/src/forms/Inventories.js:37 +#: client/src/forms/JobTemplates.js:42 +#: client/src/forms/Organizations.js:33 +#: client/src/forms/Projects.js:38 +#: client/src/forms/Teams.js:34 +#: client/src/forms/Users.js:143 +#: client/src/forms/Users.js:168 #: client/src/forms/Workflows.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:32 +#: client/src/inventory-scripts/inventory-scripts.form.js:35 #: client/src/inventory-scripts/inventory-scripts.list.js:25 #: client/src/lists/Credentials.js:34 -#: client/src/lists/PortalJobTemplates.js:29 client/src/lists/Teams.js:30 +#: client/src/lists/PortalJobTemplates.js:29 +#: client/src/lists/Teams.js:30 #: client/src/lists/Templates.js:36 -#: client/src/notifications/notificationTemplates.form.js:36 +#: client/src/notifications/notificationTemplates.form.js:39 msgid "Description" msgstr "Description" -#: client/src/notifications/notificationTemplates.form.js:138 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/notifications/notificationTemplates.form.js:155 -#: client/src/notifications/notificationTemplates.form.js:160 -#: client/src/notifications/notificationTemplates.form.js:373 +#: client/src/notifications/notificationTemplates.form.js:141 +#: client/src/notifications/notificationTemplates.form.js:146 +#: client/src/notifications/notificationTemplates.form.js:158 +#: client/src/notifications/notificationTemplates.form.js:163 +#: client/src/notifications/notificationTemplates.form.js:376 msgid "Destination Channels" msgstr "Canaux de destination" -#: client/src/notifications/notificationTemplates.form.js:368 +#: client/src/notifications/notificationTemplates.form.js:371 msgid "Destination Channels or Users" msgstr "Canaux de destination pour les utilisateurs" -#: client/src/notifications/notificationTemplates.form.js:209 -#: client/src/notifications/notificationTemplates.form.js:214 +#: client/src/notifications/notificationTemplates.form.js:212 +#: client/src/notifications/notificationTemplates.form.js:217 msgid "Destination SMS Number" msgstr "Numéro SMS de destination" #: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1482 +#: client/src/shared/form-generator.js:1493 msgid "Details" msgstr "Détails" @@ -667,20 +894,25 @@ msgstr "Ignorer les modifications" msgid "Dissasociate permission from team" msgstr "Dissocier la permission de l'équipe" -#: client/src/forms/Users.js:221 +#: client/src/forms/Users.js:222 msgid "Dissasociate permission from user" msgstr "Dissocier la permission de l'utilisateur" -#: client/src/forms/Credentials.js:385 client/src/helpers/Credentials.js:134 +#: client/src/forms/Credentials.js:385 +#: client/src/helpers/Credentials.js:134 #: client/src/helpers/Credentials.js:270 msgid "Domain Name" msgstr "Nom de domaine" -#: client/src/job-results/job-results.controller.js:7 +#: client/src/job-detail/job-detail.partial.html:420 +#: client/src/job-results/job-results.controller.js:8 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:114 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:137 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:102 msgid "Download Output" -msgstr "" +msgstr "Télécharger la sortie" -#: client/src/inventory-scripts/inventory-scripts.form.js:58 +#: client/src/inventory-scripts/inventory-scripts.form.js:61 msgid "" "Drag and drop your custom inventory script file here or create one in the " "field to import your custom inventory." @@ -688,6 +920,25 @@ msgstr "" "Faites glisser votre script d'inventaire personnalisé et déposez-le ici ou " "créez-en un dans le champ pour importer votre inventaire personnalisé." +#: client/src/management-jobs/scheduler/main.js:88 +msgid "EDIT SCHEDULED JOB" +msgstr "MODIFIER UNE TÂCHE PROGRAMMÉE" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:46 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:66 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:59 +msgid "ELAPSED" +msgstr "TEMPS ÉCOULÉ" + +#: client/src/job-detail/job-detail.partial.html:391 +#: client/src/job-detail/job-detail.partial.html:394 +msgid "EVENT SUMMARY" +msgstr "RÉCAP ÉVÉNEMENT" + +#: client/src/shared/smart-search/smart-search.partial.html:40 +msgid "EXAMPLES:" +msgstr "EXEMPLES :" + #: client/src/forms/Projects.js:174 msgid "" "Each time a job runs using this project, perform an update to the local " @@ -696,26 +947,38 @@ msgstr "" "Chaque fois qu'une tâche s'exécute avec ce projet, réalisez une mise à jour " "dans le référentiel local avant de lancer la tâche." -#: client/src/dashboard/hosts/dashboard-hosts.list.js:63 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:62 #: client/src/inventory-scripts/inventory-scripts.list.js:57 -#: client/src/lists/Credentials.js:72 client/src/lists/Inventories.js:78 -#: client/src/lists/Teams.js:60 client/src/lists/Templates.js:108 +#: client/src/lists/Credentials.js:72 +#: client/src/lists/Inventories.js:78 +#: client/src/lists/Schedules.js:77 +#: client/src/lists/Teams.js:60 +#: client/src/lists/Templates.js:107 #: client/src/lists/Users.js:68 -#: client/src/notifications/notificationTemplates.list.js:64 -#: client/src/notifications/notificationTemplates.list.js:73 +#: client/src/notifications/notificationTemplates.list.js:63 +#: client/src/notifications/notificationTemplates.list.js:72 msgid "Edit" msgstr "Modifier" -#: client/src/forms/JobTemplates.js:479 client/src/forms/Workflows.js:179 -#: client/src/shared/form-generator.js:1712 +#: client/src/configuration/configuration.route.js:30 +msgid "Edit Configuration" +msgstr "Modifier la configuration" + +#: client/src/forms/JobTemplates.js:482 +#: client/src/forms/Workflows.js:180 +#: client/src/shared/form-generator.js:1723 msgid "Edit Survey" msgstr "Modifier le questionnaire" +#: client/src/setup-menu/setup-menu.partial.html:54 +msgid "Edit Tower's configuration." +msgstr "Modifier la configuration de Tower." + #: client/src/lists/Credentials.js:74 msgid "Edit credential" msgstr "Modifier les informations d'identification" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:66 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:65 msgid "Edit host" msgstr "Modifier l'hôte" @@ -727,23 +990,31 @@ msgstr "Modifier l'inventaire" msgid "Edit inventory script" msgstr "Modifier le script d'inventaire" -#: client/src/notifications/notificationTemplates.list.js:75 +#: client/src/notifications/notificationTemplates.list.js:74 msgid "Edit notification" msgstr "Modifier la notification" +#: client/src/lists/Schedules.js:80 +msgid "Edit schedule" +msgstr "Modifier la programmation" + #: client/src/lists/Teams.js:64 msgid "Edit team" msgstr "Modifier l'équipe" -#: client/src/lists/Templates.js:110 +#: client/src/lists/Templates.js:109 msgid "Edit template" msgstr "Modifier le modèle" -#: client/src/lists/Projects.js:104 +#: client/src/workflow-results/workflow-results.partial.html:109 +msgid "Edit the User" +msgstr "Modifier l'Utilisateur" + +#: client/src/lists/Projects.js:103 msgid "Edit the project" msgstr "Modifier le projet" -#: client/src/lists/ScheduledJobs.js:67 +#: client/src/lists/ScheduledJobs.js:68 msgid "Edit the schedule" msgstr "Modifier la planification" @@ -753,25 +1024,35 @@ msgstr "Modifier l'utilisateur" #: client/src/controllers/Projects.js:236 msgid "" -"Either you do not have access or the SCM update process completed. Click the" -" %sRefresh%s button to view the latest status." +"Either you do not have access or the SCM update process completed. Click the " +"%sRefresh%s button to view the latest status." msgstr "" "Vous n'avez pas accès, ou la mise à jour SCM est terminée. Cliquez sur le " "bouton %sActualiser%s pour voir l'état le plus récent." -#: client/src/forms/Credentials.js:192 client/src/forms/Users.js:42 +#: client/src/forms/EventsViewer.js:81 +#: client/src/forms/LogViewerStatus.js:50 +#: client/src/job-detail/job-detail.partial.html:210 +#: client/src/job-detail/job-detail.partial.html:268 +#: client/src/job-detail/job-detail.partial.html:86 +msgid "Elapsed" +msgstr "Temps écoulé" + +#: client/src/forms/Credentials.js:192 +#: client/src/forms/Users.js:42 msgid "Email" msgstr "Email" -#: client/src/forms/JobTemplates.js:314 client/src/forms/JobTemplates.js:319 +#: client/src/forms/JobTemplates.js:316 +#: client/src/forms/JobTemplates.js:321 msgid "Enable Concurrent Jobs" -msgstr "" +msgstr "Activer les tâches parallèles" -#: client/src/forms/JobTemplates.js:290 +#: client/src/forms/JobTemplates.js:292 msgid "Enable Privilege Escalation" msgstr "Activer l'élévation des privilèges" -#: client/src/forms/JobTemplates.js:305 +#: client/src/forms/JobTemplates.js:307 msgid "" "Enables creation of a provisioning callback URL. Using the URL a host can " "contact Tower and request a configuration update using this job template." @@ -785,6 +1066,10 @@ msgid "Encrypted credentials are not supported." msgstr "" "Les informations d'identification chiffrées ne sont pas prises en charge." +#: client/src/forms/EventsViewer.js:77 +msgid "End" +msgstr "Fin" + #: client/src/license/license.partial.html:108 msgid "End User License Agreement" msgstr "Contrat de licence de l'utilisateur final" @@ -797,19 +1082,26 @@ msgstr "" "Entrez les variables d'inventaire avec la syntaxe JSON ou YAML. Utilisez le " "bouton radio pour basculer entre les deux." -#: client/src/helpers/Credentials.js:161 client/src/helpers/Credentials.js:297 +#: client/src/helpers/Credentials.js:161 +#: client/src/helpers/Credentials.js:297 msgid "" "Enter the URL for the virtual machine which %scorresponds to your CloudForm " "instance. %sFor example, %s" msgstr "" +"Veuillez saisir l'URL de la machine virtuelle qui correspond à votre " +"instance de CloudForm. %sPar exemple, %s" -#: client/src/helpers/Credentials.js:151 client/src/helpers/Credentials.js:287 +#: client/src/helpers/Credentials.js:151 +#: client/src/helpers/Credentials.js:287 msgid "" "Enter the URL which corresponds to your %sRed Hat Satellite 6 server. %sFor " "example, %s" msgstr "" +"Veuillez saisir l'URL qui correspond à votre serveur %sRed Hat Satellite 6. " +"%sPar exemple, %s" -#: client/src/helpers/Credentials.js:129 client/src/helpers/Credentials.js:265 +#: client/src/helpers/Credentials.js:129 +#: client/src/helpers/Credentials.js:265 msgid "" "Enter the hostname or IP address which corresponds to your VMware vCenter." msgstr "" @@ -828,14 +1120,45 @@ msgstr "" #: client/src/controllers/Projects.js:403 #: client/src/controllers/Projects.js:597 #: client/src/controllers/Projects.js:663 -#: client/src/controllers/Projects.js:681 client/src/controllers/Users.js:182 -#: client/src/controllers/Users.js:271 client/src/controllers/Users.js:339 -#: client/src/controllers/Users.js:94 client/src/helpers/Credentials.js:418 +#: client/src/controllers/Projects.js:681 +#: client/src/controllers/Users.js:182 +#: client/src/controllers/Users.js:271 +#: client/src/controllers/Users.js:339 +#: client/src/controllers/Users.js:94 +#: client/src/helpers/Credentials.js:418 #: client/src/helpers/Credentials.js:434 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:168 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:187 #: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:119 +#: client/src/management-jobs/card/card.controller.js:150 +#: client/src/management-jobs/card/card.controller.js:240 +#: client/src/management-jobs/card/card.controller.js:29 msgid "Error!" msgstr "Erreur !" +#: client/src/forms/EventsViewer.js:21 +#: client/src/forms/EventsViewer.js:25 +#: client/src/forms/EventsViewer.js:29 +#: client/src/forms/EventsViewer.js:33 +#: client/src/forms/EventsViewer.js:37 +#: client/src/forms/EventsViewer.js:42 +#: client/src/forms/EventsViewer.js:46 +#: client/src/forms/EventsViewer.js:50 +#: client/src/forms/EventsViewer.js:54 +#: client/src/forms/EventsViewer.js:58 +#: client/src/lists/JobEvents.js:65 +#: client/src/lists/Streams.js:43 +msgid "Event" +msgstr "Événement" + +#: client/src/widgets/Stream.js:216 +msgid "Event summary not available" +msgstr "Récapitulatif de l'événement non disponible" + +#: client/src/lists/JobEvents.js:31 +msgid "Events" +msgstr "Événements" + #: client/src/controllers/Projects.js:421 #: client/src/controllers/Projects.js:704 msgid "Example URLs for GIT SCM include:" @@ -851,21 +1174,29 @@ msgstr "Exemples d'URL pour le SCM Mercurial :" msgid "Example URLs for Subversion SCM include:" msgstr "Exemples d'URL pour le SCM Subversion :" -#: client/src/job-results/job-results.controller.js:10 -#: client/src/job-results/job-results.controller.js:195 +#: client/src/job-results/job-results.controller.js:11 +#: client/src/job-results/job-results.controller.js:207 #: client/src/standard-out/standard-out.controller.js:235 #: client/src/standard-out/standard-out.controller.js:25 -#: client/src/workflow-results/workflow-results.controller.js:111 -#: client/src/workflow-results/workflow-results.controller.js:70 +#: client/src/workflow-results/workflow-results.controller.js:133 +#: client/src/workflow-results/workflow-results.controller.js:92 msgid "Expand Output" -msgstr "" +msgstr "Tout agrandir" #: client/src/license/license.partial.html:39 msgid "Expires On" msgstr "Arrive à expiration le" -#: client/src/forms/JobTemplates.js:365 client/src/forms/JobTemplates.js:377 -#: client/src/forms/Workflows.js:72 client/src/forms/Workflows.js:84 +#: client/src/job-detail/job-detail.partial.html:31 +msgid "Explanation" +msgstr "Explication" + +#: client/src/forms/JobTemplates.js:367 +#: client/src/forms/JobTemplates.js:379 +#: client/src/forms/Workflows.js:72 +#: client/src/forms/Workflows.js:84 +#: client/src/job-detail/job-detail.partial.html:163 +#: client/src/partials/logviewer.html:8 msgid "Extra Variables" msgstr "Variables supplémentaires" @@ -873,7 +1204,20 @@ msgstr "Variables supplémentaires" msgid "FAILED" msgstr "ÉCHEC" +#: client/src/shared/smart-search/smart-search.partial.html:48 +msgid "FIELDS:" +msgstr "CHAMPS :" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:39 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:59 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:52 +msgid "FINISHED" +msgstr "TERMINÉ" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:80 +#: client/src/job-detail/job-detail.partial.html:198 +#: client/src/job-detail/job-detail.partial.html:257 +#: client/src/job-detail/job-detail.partial.html:341 msgid "Failed" msgstr "Échec" @@ -897,11 +1241,17 @@ msgstr "La création du projet a échoué. État POST renvoyé :" msgid "Failed to get third-party login types. Returned status:" msgstr "L'obtention des types de connexion tiers a échoué. État renvoyé :" +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:188 +msgid "Failed to retrieve job template extra variables." +msgstr "" +"N'a pas pu extraire les variables supplémentaires du modèle de la tâche." + #: client/src/controllers/Projects.js:598 msgid "Failed to retrieve project: %s. GET status:" msgstr "La récupération du projet a échoué : %s. État GET :" -#: client/src/controllers/Users.js:272 client/src/controllers/Users.js:340 +#: client/src/controllers/Users.js:272 +#: client/src/controllers/Users.js:340 msgid "Failed to retrieve user: %s. GET status:" msgstr "La récupération de l'utilisateur a échoué : %s. État GET :" @@ -923,32 +1273,66 @@ msgstr "La mise à jour des informations d'identification a échoué. État PUT msgid "Failed to update project: %s. PUT status:" msgstr "La mise à jour du projet a échoué : %s. État PUT :" -#: client/src/notifications/notifications.list.js:49 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:169 +#: client/src/management-jobs/card/card.controller.js:151 +#: client/src/management-jobs/card/card.controller.js:241 +msgid "Failed updating job %s with variables. POST returned: %d" +msgstr "" +"N'a pas pu mettre à jour la tâche %s avec les variables. Retour POST : %d" + +#: client/src/helpers/Projects.js:73 +msgid "Failed. Click for details" +msgstr "Échec. Cliquer pour obtenir davantage d'informations" + +#: client/src/notifications/notifications.list.js:48 msgid "Failure" msgstr "Défaillance" -#: client/src/lists/CompletedJobs.js:56 client/src/lists/PortalJobs.js:37 +#: client/src/lists/Schedules.js:50 +msgid "Final Run" +msgstr "Dernière exécution" + +#: client/src/forms/LogViewerStatus.js:44 +#: client/src/job-detail/job-detail.partial.html:74 +#: client/src/lists/AllJobs.js:68 +#: client/src/lists/CompletedJobs.js:56 +#: client/src/lists/PortalJobs.js:37 msgid "Finished" msgstr "Terminé" -#: client/src/forms/Users.js:28 client/src/lists/Users.js:41 +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 +#: client/src/forms/Users.js:28 +#: client/src/lists/Users.js:41 msgid "First Name" msgstr "Prénom" -#: client/src/helpers/Credentials.js:143 client/src/helpers/Credentials.js:279 +#: client/src/lists/Schedules.js:40 +msgid "First Run" +msgstr "Première exécution" + +#: client/src/shared/smart-search/smart-search.partial.html:54 +msgid "" +"For additional information on advanced search search syntax please see the " +"Ansible Tower documentation." +msgstr "" +"Pour obtenir des informations supplémentaires sur la syntaxe de recherche " +"avancée, consulter la documentation Ansible Tower." + +#: client/src/helpers/Credentials.js:143 +#: client/src/helpers/Credentials.js:279 msgid "For example, %s" msgstr "Par exemple, %s" -#: client/src/notifications/notificationTemplates.form.js:142 -#: client/src/notifications/notificationTemplates.form.js:159 -#: client/src/notifications/notificationTemplates.form.js:213 -#: client/src/notifications/notificationTemplates.form.js:334 -#: client/src/notifications/notificationTemplates.form.js:372 -#: client/src/notifications/notificationTemplates.form.js:98 +#: client/src/notifications/notificationTemplates.form.js:101 +#: client/src/notifications/notificationTemplates.form.js:145 +#: client/src/notifications/notificationTemplates.form.js:162 +#: client/src/notifications/notificationTemplates.form.js:216 +#: client/src/notifications/notificationTemplates.form.js:337 +#: client/src/notifications/notificationTemplates.form.js:375 msgid "For example:" msgstr "Par exemple :" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:53 msgid "" "For hosts that are part of an external inventory, this flag cannot be " "changed. It will be set by the inventory sync process." @@ -957,18 +1341,30 @@ msgstr "" "pas être modifié. Il sera défini par le processus de synchronisation des " "inventaires." -#: client/src/forms/JobTemplates.js:225 client/src/forms/WorkflowMaker.js:125 +#: client/src/forms/JobTemplates.js:227 +#: client/src/forms/WorkflowMaker.js:125 msgid "" -"For more information and examples see %sthe Patterns topic at " -"docs.ansible.com%s." +"For more information and examples see %sthe Patterns topic at docs.ansible." +"com%s." msgstr "" "Pour obtenir plus d'informations et voir des exemples, reportez-vous à la " "rubrique %sPatterns sur docs.ansible.com%s." -#: client/src/forms/JobTemplates.js:201 client/src/forms/JobTemplates.js:214 +#: client/src/forms/JobTemplates.js:203 +#: client/src/forms/JobTemplates.js:216 +#: client/src/job-detail/job-detail.partial.html:138 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:87 msgid "Forks" msgstr "Forks" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:172 +msgid "Frequency Details" +msgstr "Informations sur la fréquence" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:89 +msgid "GROUP" +msgstr "GROUPE" + #: client/src/configuration/auth-form/configuration-auth.controller.js:102 msgid "GitHub" msgstr "GitHub" @@ -979,15 +1375,16 @@ msgstr "GitHub Org" #: client/src/configuration/auth-form/configuration-auth.controller.js:104 msgid "GitHub Team" -msgstr "" +msgstr "Équipe GitHub" #: client/src/configuration/auth-form/configuration-auth.controller.js:105 msgid "Google OAuth2" msgstr "Google OAuth2" -#: client/src/forms/Teams.js:155 client/src/forms/Users.js:210 +#: client/src/forms/Teams.js:155 +#: client/src/forms/Users.js:211 msgid "Grant Permission" -msgstr "" +msgstr "Donner Permission" #: client/src/setup-menu/setup-menu.partial.html:5 msgid "" @@ -997,28 +1394,51 @@ msgstr "" "Regroupez l'ensemble du contenu pour gérer les permissions entre les " "différents services de votre entreprise." -#: client/src/notifications/notificationTemplates.form.js:324 +#: client/src/dashboard/hosts/main.js:55 +#: client/src/helpers/ActivityStream.js:53 +msgid "HOSTS" +msgstr "HÔTES " + +#: client/src/notifications/notificationTemplates.form.js:327 msgid "HTTP Headers" msgstr "En-têtes HTTP" +#: client/src/bread-crumb/bread-crumb.directive.js:111 +msgid "Hide Activity Stream" +msgstr "Cacher le flux d'activité" + #: client/src/forms/Credentials.js:140 -#: client/src/notifications/notificationTemplates.form.js:72 +#: client/src/forms/EventsViewer.js:20 +#: client/src/lists/JobEvents.js:73 +#: client/src/notifications/notificationTemplates.form.js:75 msgid "Host" msgstr "Hôte" -#: client/src/helpers/Credentials.js:132 client/src/helpers/Credentials.js:268 +#: client/src/helpers/Credentials.js:132 +#: client/src/helpers/Credentials.js:268 msgid "Host (Authentication URL)" msgstr "Hôte (URL d'authentification)" -#: client/src/forms/JobTemplates.js:339 client/src/forms/JobTemplates.js:348 +#: client/src/forms/JobTemplates.js:341 +#: client/src/forms/JobTemplates.js:350 msgid "Host Config Key" msgstr "Clé de configuration de l'hôte" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:55 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 msgid "Host Enabled" msgstr "Hôte activé" +#: client/src/job-detail/job-detail.partial.html:269 +msgid "Host Status" +msgstr "Statut de l'hôte" + +#: client/src/lists/JobEvents.js:37 +msgid "Host Summary" +msgstr "Récapitulatif de l'hôte" + +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 #: client/src/dashboard/counts/dashboard-counts.directive.js:39 +#: client/src/job-detail/job-detail.partial.html:349 msgid "Hosts" msgstr "Hôtes" @@ -1038,16 +1458,36 @@ msgstr "Hôtes utilisés" msgid "I agree to the End User License Agreement" msgstr "J'accepte le Contrat de licence de l'utilisateur final" +#: client/src/forms/EventsViewer.js:28 +msgid "ID" +msgstr "ID" + +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:12 +msgid "INITIATED BY" +msgstr "INITIÉ PAR" + +#: client/src/helpers/ActivityStream.js:26 +#: client/src/inventories/main.js:291 #: client/src/main-menu/main-menu.partial.html:104 #: client/src/main-menu/main-menu.partial.html:27 +#: client/src/organizations/linkout/organizations-linkout.route.js:178 msgid "INVENTORIES" msgstr "INVENTAIRES" -#: client/src/notifications/notificationTemplates.form.js:357 +#: client/src/inventory-scripts/inventory-scripts.form.js:23 +msgid "INVENTORY SCRIPT" +msgstr "SCRIPT D'INVENTAIRE" + +#: client/src/helpers/ActivityStream.js:47 +#: client/src/inventory-scripts/main.js:66 +msgid "INVENTORY SCRIPTS" +msgstr "SCRIPTS D'INVENTAIRE" + +#: client/src/notifications/notificationTemplates.form.js:360 msgid "IRC Nick" msgstr "Surnom IRC" -#: client/src/notifications/notificationTemplates.form.js:346 +#: client/src/notifications/notificationTemplates.form.js:349 msgid "IRC Server Address" msgstr "Adresse du serveur IRC" @@ -1059,17 +1499,33 @@ msgstr "Mot de passe du serveur IRC" msgid "IRC Server Port" msgstr "Port du serveur IRC" -#: client/src/forms/JobTemplates.js:293 +#: client/src/shared/paginate/paginate.partial.html:43 msgid "" -"If enabled, run this playbook as an administrator. This is the equivalent of" -" passing the %s option to the %s command." +"ITEMS \n" +" {{dataRange}}\n" +" of {{dataCount()}}" msgstr "" -"Si cette option est activée, exécutez ce playbook en tant qu'administrateur." -" Cette opération revient à transmettre l'option %s à la commande %s." +"ITEMS \n" +" {{dataRange}}\n" +" of {{dataCount()}}" -#: client/src/forms/JobTemplates.js:317 +#: client/src/login/authenticationServices/timer.factory.js:157 +msgid "Idle Session" +msgstr "Session inactive" + +#: client/src/forms/JobTemplates.js:295 +msgid "" +"If enabled, run this playbook as an administrator. This is the equivalent of " +"passing the %s option to the %s command." +msgstr "" +"Si cette option est activée, exécutez ce playbook en tant qu'administrateur. " +"Cette opération revient à transmettre l'option %s à la commande %s." + +#: client/src/forms/JobTemplates.js:319 msgid "If enabled, simultaneous runs of this job template will be allowed." msgstr "" +"Si activé, il sera possible d'avoir des exécutions de ce modèle de tâche en " +"simultané." #: client/src/forms/Credentials.js:54 msgid "" @@ -1092,13 +1548,18 @@ msgstr "" "Si vous êtes prêt à effectuer une mise à niveau, contactez-nous en cliquant " "sur le bouton ci-dessous" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:53 msgid "" "Indicates if a host is available and should be included in running jobs." msgstr "" "Indique si un hôte est disponible et doit être ajouté aux tâches en cours " "d'exécution." +#: client/src/forms/ActivityDetail.js:33 +#: client/src/lists/Streams.js:36 +msgid "Initiated by" +msgstr "Initié par" + #: client/src/forms/JobTemplates.js:58 msgid "" "Instead, %s will check playbook syntax, test environment setup and report " @@ -1120,17 +1581,26 @@ msgstr "Format de fichier non valide. Chargez un fichier JSON valide." msgid "Invalid username and/or password. Please try again." msgstr "Nom d'utilisateur et/ou mot de passe non valide. Veuillez réessayer." +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:116 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:51 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 #: client/src/dashboard/counts/dashboard-counts.directive.js:50 -#: client/src/lists/Inventories.js:16 client/src/lists/Inventories.js:17 +#: client/src/lists/Inventories.js:16 +#: client/src/lists/Inventories.js:17 msgid "Inventories" msgstr "Inventaires" #: client/src/dashboard/hosts/dashboard-hosts.list.js:41 -#: client/src/forms/JobTemplates.js:73 client/src/forms/JobTemplates.js:87 -#: client/src/forms/WorkflowMaker.js:79 client/src/forms/WorkflowMaker.js:89 +#: client/src/forms/JobTemplates.js:73 +#: client/src/forms/JobTemplates.js:87 +#: client/src/forms/WorkflowMaker.js:79 +#: client/src/forms/WorkflowMaker.js:89 +#: client/src/job-detail/job-detail.partial.html:98 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:58 msgid "Inventory" msgstr "Inventaire" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 #: client/src/inventory-scripts/inventory-scripts.list.js:12 #: client/src/setup-menu/setup-menu.partial.html:34 msgid "Inventory Scripts" @@ -1148,6 +1618,11 @@ msgstr "Erreurs de synchronisation des inventaires" msgid "Inventory Variables" msgstr "Variables d'inventaire" +#: client/src/forms/EventsViewer.js:49 +#: client/src/job-detail/job-detail.partial.html:350 +msgid "Item" +msgstr "Item" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:4 msgid "JOB STATUS" msgstr "ÉTAT DE LA TÂCHE" @@ -1156,15 +1631,27 @@ msgstr "ÉTAT DE LA TÂCHE" msgid "JOB TEMPLATE" msgstr "MODÈLES DE TÂCHE" -#: client/src/app.js:428 +#: client/src/organizations/linkout/organizations-linkout.route.js:287 +msgid "JOB TEMPLATES" +msgstr "MODÈLES DE TÂCHE " + +#: client/src/app.js:430 #: client/src/dashboard/graphs/job-status/job-status-graph.directive.js:113 +#: client/src/helpers/ActivityStream.js:44 #: client/src/main-menu/main-menu.partial.html:122 #: client/src/main-menu/main-menu.partial.html:43 msgid "JOBS" msgstr "TÂCHES" -#: client/src/forms/JobTemplates.js:250 client/src/forms/JobTemplates.js:258 -#: client/src/forms/WorkflowMaker.js:134 client/src/forms/WorkflowMaker.js:142 +#: client/src/lists/JobEvents.js:15 +msgid "Job Events" +msgstr "Événements d'une tâche" + +#: client/src/forms/JobTemplates.js:252 +#: client/src/forms/JobTemplates.js:260 +#: client/src/forms/WorkflowMaker.js:134 +#: client/src/forms/WorkflowMaker.js:142 +#: client/src/job-detail/job-detail.partial.html:153 msgid "Job Tags" msgstr "Balises de tâche" @@ -1172,41 +1659,72 @@ msgstr "Balises de tâche" msgid "Job Template" msgstr "Modèle de tâche" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:35 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:97 #: client/src/lists/PortalJobTemplates.js:15 #: client/src/lists/PortalJobTemplates.js:16 msgid "Job Templates" msgstr "Modèles de tâche" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:32 -#: client/src/forms/JobTemplates.js:48 client/src/forms/JobTemplates.js:62 -#: client/src/forms/WorkflowMaker.js:110 client/src/forms/WorkflowMaker.js:99 +#: client/src/forms/JobTemplates.js:48 +#: client/src/forms/JobTemplates.js:62 +#: client/src/forms/WorkflowMaker.js:110 +#: client/src/forms/WorkflowMaker.js:99 +#: client/src/job-detail/job-detail.partial.html:69 msgid "Job Type" msgstr "Type de tâche" -#: client/src/lists/PortalJobs.js:15 client/src/lists/PortalJobs.js:19 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 +#: client/src/configuration/configuration.partial.html:16 +#: client/src/lists/PortalJobs.js:15 +#: client/src/lists/PortalJobs.js:19 #: client/src/partials/jobs.html:7 msgid "Jobs" msgstr "Tâches" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:90 +#: client/src/shared/smart-search/smart-search.partial.html:14 +msgid "Key" +msgstr "Clé" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:73 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:66 +msgid "LAUNCH TYPE" +msgstr "TYPE LANCEMENT" + #: client/src/configuration/auth-form/configuration-auth.controller.js:106 msgid "LDAP" msgstr "LDAP" +#: client/src/license/license.route.js:18 +msgid "LICENSE" +msgstr "LICENCE" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:45 +msgid "LICENSE ERROR" +msgstr "ERREUR DE LICENCE" + #: client/src/main-menu/main-menu.partial.html:83 msgid "LOG OUT" msgstr "SE DÉCONNECTER" -#: client/src/notifications/notificationTemplates.form.js:270 +#: client/src/notifications/notificationTemplates.form.js:273 msgid "Label to be shown with notification" msgstr "Libellé à afficher avec la notification" -#: client/src/forms/JobTemplates.js:353 client/src/forms/JobTemplates.js:358 -#: client/src/forms/Workflows.js:60 client/src/forms/Workflows.js:65 +#: client/src/forms/JobTemplates.js:355 +#: client/src/forms/JobTemplates.js:360 +#: client/src/forms/Workflows.js:60 +#: client/src/forms/Workflows.js:65 +#: client/src/lists/AllJobs.js:76 #: client/src/lists/Templates.js:47 msgid "Labels" msgstr "Libellés" -#: client/src/forms/Users.js:35 client/src/lists/Users.js:45 +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 +#: client/src/forms/Users.js:35 +#: client/src/lists/Users.js:45 msgid "Last Name" msgstr "Nom" @@ -1214,8 +1732,9 @@ msgstr "Nom" msgid "Last Updated" msgstr "Dernière mise à jour" -#: client/src/lists/PortalJobTemplates.js:39 client/src/lists/Templates.js:84 -#: client/src/shared/form-generator.js:1704 +#: client/src/lists/PortalJobTemplates.js:39 +#: client/src/lists/Templates.js:84 +#: client/src/shared/form-generator.js:1715 msgid "Launch" msgstr "Lancer" @@ -1223,11 +1742,25 @@ msgstr "Lancer" msgid "Launch Management Job" msgstr "Lancer la tâche de gestion" +#: client/src/forms/LogViewerStatus.js:55 +msgid "Launch Type" +msgstr "Type de lancement" + +#: client/src/job-detail/job-detail.partial.html:79 +#: client/src/job-detail/job-detail.partial.html:91 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:76 +msgid "Launched By" +msgstr "Lancé par" + #: client/src/license/license.controller.js:42 #: client/src/license/license.partial.html:8 msgid "License" msgstr "Licence" +#: client/src/forms/LogViewerStatus.js:33 +msgid "License Error" +msgstr "Erreur de licence" + #: client/src/license/license.partial.html:102 msgid "License File" msgstr "Fichier de licence" @@ -1244,16 +1777,20 @@ msgstr "Gestion des licences" msgid "License Type" msgstr "Type de licence" -#: client/src/forms/JobTemplates.js:220 client/src/forms/JobTemplates.js:227 -#: client/src/forms/WorkflowMaker.js:120 client/src/forms/WorkflowMaker.js:127 +#: client/src/forms/JobTemplates.js:222 +#: client/src/forms/JobTemplates.js:229 +#: client/src/forms/WorkflowMaker.js:120 +#: client/src/forms/WorkflowMaker.js:127 +#: client/src/job-detail/job-detail.partial.html:143 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:92 msgid "Limit" msgstr "Limite" -#: client/src/shared/socket/socket.service.js:170 +#: client/src/shared/socket/socket.service.js:168 msgid "Live events: attempting to connect to the Tower server." msgstr "Événements en direct : tentative de connexion au serveur Tower." -#: client/src/shared/socket/socket.service.js:174 +#: client/src/shared/socket/socket.service.js:172 msgid "" "Live events: connected. Pages containing job status information will " "automatically update in real-time." @@ -1261,14 +1798,20 @@ msgstr "" "Événements en direct : connecté. Les pages contenant des informations sur " "l'état de la tâche seront automatiquement mises à jour en temps réel." -#: client/src/shared/socket/socket.service.js:178 +#: client/src/shared/socket/socket.service.js:176 msgid "Live events: error connecting to the Tower server." msgstr "Événements en direct : erreur de connexion au serveur Tower." -#: client/src/shared/form-generator.js:1977 +#: client/src/job-detail/job-detail.partial.html:316 +#: client/src/job-detail/job-detail.partial.html:371 +#: client/src/shared/form-generator.js:1991 msgid "Loading..." msgstr "Chargement en cours..." +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:133 +msgid "Local Time Zone" +msgstr "Fuseau horaire local" + #: client/src/main-menu/main-menu.partial.html:188 msgid "Log Out" msgstr "Se déconnecter" @@ -1281,11 +1824,16 @@ msgstr "Journalisation" msgid "MANAGEMENT JOBS" msgstr "TÂCHES DE GESTION" +#: client/src/portal-mode/portal-mode.route.js:12 +msgid "MY VIEW" +msgstr "MON ÉCRAN" + #: client/src/forms/Credentials.js:68 msgid "Machine" msgstr "Machine" -#: client/src/forms/JobTemplates.js:138 +#: client/src/forms/JobTemplates.js:139 +#: client/src/job-detail/job-detail.partial.html:117 msgid "Machine Credential" msgstr "Informations d'identification de la machine" @@ -1298,7 +1846,8 @@ msgstr "" "d’activité, des données marquées pour suppression et des informations de " "suivi du système." -#: client/src/helpers/Credentials.js:112 client/src/helpers/Credentials.js:248 +#: client/src/helpers/Credentials.js:112 +#: client/src/helpers/Credentials.js:248 msgid "Management Certificate" msgstr "Certificat de gestion" @@ -1322,11 +1871,29 @@ msgstr "" "Nombre maximum de sessions par utilisateur atteintes. Veuillez vous " "connecter." +#: client/src/forms/EventsViewer.js:65 +#: client/src/job-detail/job-detail.partial.html:351 +msgid "Message" +msgstr "Message" + #: client/src/configuration/system-form/configuration-system.controller.js:80 msgid "Misc. System" msgstr "Système divers" +#: client/src/helpers/Projects.js:76 +msgid "Missing. Click for details" +msgstr "Manquant. Cliquer pour obtenir davantage d'informations" + +#: client/src/forms/EventsViewer.js:53 +msgid "Module" +msgstr "Module" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:53 +msgid "Module Args" +msgstr "Args de module" + #: client/src/portal-mode/portal-mode-jobs.partial.html:4 +#: client/src/portal-mode/portal-mode-layout.partial.html:10 msgid "My Jobs" msgstr "Mes tâches" @@ -1334,28 +1901,65 @@ msgstr "Mes tâches" msgid "My View" msgstr "Ma vue" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:19 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:19 +msgid "NAME" +msgstr "NOM" + #: client/src/dashboard/hosts/dashboard-hosts.list.js:18 msgid "NO HOSTS FOUND" msgstr "AUCUN HÔTE DÉTECTÉ" +#: client/src/login/loginModal/loginModal.partial.html:89 +msgid "NOTICE" +msgstr "ENVOI D'INFOS" + +#: client/src/notifications/notificationTemplates.form.js:21 +msgid "NOTIFICATION TEMPLATE" +msgstr "MODÈLE DE NOTIFICATION" + +#: client/src/helpers/ActivityStream.js:38 +msgid "NOTIFICATION TEMPLATES" +msgstr "MODÈLES DE NOTIFICATION" + +#: client/src/management-jobs/notifications/notification.route.js:46 +#: client/src/notifications/main.js:43 +#: client/src/notifications/main.js:88 +msgid "NOTIFICATIONS" +msgstr "NOTIFICATIONS" + #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:14 #: client/src/dashboard/lists/jobs/jobs-list.partial.html:13 -#: client/src/forms/Credentials.js:34 client/src/forms/Inventories.js:29 -#: client/src/forms/JobTemplates.js:35 client/src/forms/Organizations.js:26 -#: client/src/forms/Projects.js:31 client/src/forms/Teams.js:124 -#: client/src/forms/Teams.js:27 client/src/forms/Users.js:140 -#: client/src/forms/Users.js:165 client/src/forms/Users.js:190 +#: client/src/forms/Credentials.js:34 +#: client/src/forms/Inventories.js:29 +#: client/src/forms/JobTemplates.js:35 +#: client/src/forms/LogViewerStatus.js:23 +#: client/src/forms/Organizations.js:26 +#: client/src/forms/Projects.js:31 +#: client/src/forms/Teams.js:124 +#: client/src/forms/Teams.js:27 +#: client/src/forms/Users.js:140 +#: client/src/forms/Users.js:165 +#: client/src/forms/Users.js:191 #: client/src/forms/Workflows.js:34 -#: client/src/inventory-scripts/inventory-scripts.form.js:25 +#: client/src/inventory-scripts/inventory-scripts.form.js:28 #: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/lists/CompletedJobs.js:43 client/src/lists/Credentials.js:29 +#: client/src/lists/AllJobs.js:45 +#: client/src/lists/CompletedJobs.js:43 +#: client/src/lists/Credentials.js:29 #: client/src/lists/Inventories.js:46 -#: client/src/lists/PortalJobTemplates.js:24 client/src/lists/PortalJobs.js:32 -#: client/src/lists/Projects.js:38 client/src/lists/ScheduledJobs.js:32 -#: client/src/lists/Teams.js:25 client/src/lists/Templates.js:26 -#: client/src/notifications/notificationTemplates.form.js:29 -#: client/src/notifications/notificationTemplates.list.js:33 +#: client/src/lists/PortalJobTemplates.js:24 +#: client/src/lists/PortalJobs.js:32 +#: client/src/lists/Projects.js:38 +#: client/src/lists/ScheduledJobs.js:33 +#: client/src/lists/Schedules.js:35 +#: client/src/lists/Teams.js:25 +#: client/src/lists/Templates.js:26 +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 +#: client/src/notifications/notificationTemplates.form.js:32 +#: client/src/notifications/notificationTemplates.list.js:32 #: client/src/notifications/notifications.list.js:26 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:19 msgid "Name" msgstr "Nom" @@ -1363,14 +1967,16 @@ msgstr "Nom" msgid "Network" msgstr "Réseau" -#: client/src/forms/JobTemplates.js:184 client/src/forms/JobTemplates.js:195 +#: client/src/forms/JobTemplates.js:186 +#: client/src/forms/JobTemplates.js:197 +#: client/src/job-detail/job-detail.partial.html:131 msgid "Network Credential" msgstr "Informations d'identification réseau" -#: client/src/forms/JobTemplates.js:194 +#: client/src/forms/JobTemplates.js:196 msgid "" -"Network credentials are used by Ansible networking modules to connect to and" -" manage networking devices." +"Network credentials are used by Ansible networking modules to connect to and " +"manage networking devices." msgstr "" "Les informations d'identification sont utilisées par les modules de mise en " "réseau d'Ansible pour connecter et gérer les périphériques réseau." @@ -1415,7 +2021,8 @@ msgstr "Nouveau modèle de tâche Workflow" msgid "New user successfully created!" msgstr "Création de l'utilisateur réussie" -#: client/src/lists/ScheduledJobs.js:51 +#: client/src/lists/ScheduledJobs.js:52 +#: client/src/lists/Schedules.js:45 msgid "Next Run" msgstr "Exécution suivante" @@ -1427,10 +2034,22 @@ msgstr "Informations d'identification non créées" msgid "No SCM Configuration" msgstr "Aucune configuration SCM" +#: client/src/helpers/Projects.js:58 +msgid "No SCM updates have run for this project" +msgstr "Aucune mise à jour SCM n'a été exécutée pour ce projet" + +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:18 +msgid "No Teams exist" +msgstr "Aucune équipe existante" + #: client/src/controllers/Projects.js:152 msgid "No Updates Available" msgstr "Aucune mise à jour disponible" +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:24 +msgid "No Users exist" +msgstr "Aucun utilisateur existant" + #: client/src/lists/CompletedJobs.js:22 msgid "No completed jobs" msgstr "Aucune tâche terminée" @@ -1439,18 +2058,43 @@ msgstr "Aucune tâche terminée" msgid "No file selected." msgstr "Aucun fichier sélectionné." +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:56 +msgid "No job templates were recently used." +msgstr "Aucun modèle de tâche utilisé récemment." + #: client/src/lists/AllJobs.js:20 msgid "No jobs have yet run." -msgstr "" +msgstr "Aucune tâche exécutée pour l'instant." #: client/src/dashboard/lists/jobs/jobs-list.partial.html:46 msgid "No jobs were recently run." msgstr "Aucune tâche récemment exécutée." -#: client/src/forms/Teams.js:121 client/src/forms/Users.js:187 +#: client/src/job-detail/job-detail.partial.html:374 +msgid "No matching host events" +msgstr "Aucun événement d'hôte correspondant" + +#: client/src/job-detail/job-detail.partial.html:307 +msgid "No matching hosts." +msgstr "Aucun hôte correspondant." + +#: client/src/job-detail/job-detail.partial.html:319 +msgid "No matching tasks" +msgstr "Aucune tâche correspondante" + +#: client/src/forms/Teams.js:121 +#: client/src/forms/Users.js:188 msgid "No permissions have been granted" msgstr "Aucune permission accordée" +#: client/src/notifications/notification-templates-list/list.controller.js:88 +msgid "No recent notifications." +msgstr "Aucun notification récente." + +#: client/src/shared/form-generator.js:1885 +msgid "No records matched your search." +msgstr "Aucun enregistrement ne correspond à votre demande." + #: client/src/lists/ScheduledJobs.js:18 msgid "No schedules exist" msgstr "Aucune planification existante" @@ -1463,24 +2107,30 @@ msgstr "Utilisateur normal" msgid "Not configured for SCM" msgstr "Non configuré pour le SCM" -#: client/src/notifications/notificationTemplates.form.js:293 +#: client/src/notifications/notificationTemplates.form.js:296 msgid "Notification Color" msgstr "Couleur des notifications" +#: client/src/notifications/notification-templates-list/list.controller.js:115 +msgid "Notification Failed." +msgstr "Échec de notification" + +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 #: client/src/notifications/notificationTemplates.list.js:14 msgid "Notification Templates" msgstr "Modèles de notification" +#: client/src/management-jobs/notifications/notification.route.js:21 #: client/src/notifications/notifications.list.js:17 #: client/src/setup-menu/setup-menu.partial.html:41 msgid "Notifications" msgstr "Notifications" -#: client/src/notifications/notificationTemplates.form.js:306 +#: client/src/notifications/notificationTemplates.form.js:309 msgid "Notify Channel" msgstr "Canal de notification" -#: client/src/notifications/notificationTemplates.form.js:198 +#: client/src/notifications/notificationTemplates.form.js:201 msgid "Number associated with the \"Messaging Service\" in Twilio." msgstr "Numéro associé au \"Service de messagerie\" de Twilio." @@ -1492,10 +2142,20 @@ msgstr "DÉSACTIVÉ" msgid "ON" msgstr "ACTIVÉ" +#: client/src/helpers/ActivityStream.js:41 #: client/src/organizations/list/organizations-list.partial.html:6 +#: client/src/organizations/main.js:52 msgid "ORGANIZATIONS" msgstr "ORGANISATIONS" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:112 +msgid "OVERWRITE" +msgstr "REMPLACER" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:119 +msgid "OVERWRITE VARS" +msgstr "REMPLACER VARS" + #: client/src/forms/WorkflowMaker.js:45 msgid "On Failure" msgstr "Lors d'un échec" @@ -1513,7 +2173,8 @@ msgstr "" "nécessaires seulement pour les URL d'authentification Keystone v3. Les " "scénarios courants incluent :" -#: client/src/forms/JobTemplates.js:360 client/src/forms/Workflows.js:67 +#: client/src/forms/JobTemplates.js:362 +#: client/src/forms/Workflows.js:67 msgid "" "Optional labels that describe this job template, such as 'dev' or 'test'. " "Labels can be used to group and filter job templates and completed jobs in " @@ -1523,22 +2184,30 @@ msgstr "" "'test'. Les libellés peuvent être utilisés pour regrouper et filtrer les " "modèles de tâche et les tâches terminées dans l'affichage de Tower." -#: client/src/forms/JobTemplates.js:286 +#: client/src/forms/JobTemplates.js:288 +#: client/src/notifications/notificationTemplates.form.js:395 +#: client/src/partials/logviewer.html:7 msgid "Options" msgstr "Options" -#: client/src/forms/Credentials.js:48 client/src/forms/Credentials.js:55 -#: client/src/forms/Inventories.js:42 client/src/forms/Projects.js:43 -#: client/src/forms/Projects.js:49 client/src/forms/Teams.js:39 -#: client/src/forms/Users.js:59 client/src/forms/Workflows.js:47 +#: client/src/forms/Credentials.js:48 +#: client/src/forms/Credentials.js:55 +#: client/src/forms/Inventories.js:42 +#: client/src/forms/Projects.js:43 +#: client/src/forms/Projects.js:49 +#: client/src/forms/Teams.js:39 +#: client/src/forms/Users.js:59 +#: client/src/forms/Workflows.js:47 #: client/src/forms/Workflows.js:53 -#: client/src/inventory-scripts/inventory-scripts.form.js:37 +#: client/src/inventory-scripts/inventory-scripts.form.js:40 #: client/src/inventory-scripts/inventory-scripts.list.js:30 -#: client/src/lists/Inventories.js:52 client/src/lists/Teams.js:35 -#: client/src/notifications/notificationTemplates.form.js:41 +#: client/src/lists/Inventories.js:52 +#: client/src/lists/Teams.js:35 +#: client/src/notifications/notificationTemplates.form.js:44 msgid "Organization" msgstr "Organisation" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 #: client/src/forms/Users.js:130 #: client/src/setup-menu/setup-menu.partial.html:4 msgid "Organizations" @@ -1557,7 +2226,7 @@ msgid "PASSWORD" msgstr "MOT DE PASSE" #: client/src/organizations/list/organizations-list.partial.html:45 -#: client/src/shared/form-generator.js:1880 +#: client/src/shared/form-generator.js:1891 #: client/src/shared/list-generator/list-generator.factory.js:246 msgid "PLEASE ADD ITEMS TO THIS LIST" msgstr "AJOUTEZ DES ÉLÉMENTS À CETTE LISTE" @@ -1566,16 +2235,34 @@ msgstr "AJOUTEZ DES ÉLÉMENTS À CETTE LISTE" msgid "PORTAL MODE" msgstr "MODE PORTAIL" +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:73 +msgid "PROJECT" +msgstr "PROJET" + +#: client/src/app.js:295 +#: client/src/helpers/ActivityStream.js:23 #: client/src/main-menu/main-menu.partial.html:19 #: client/src/main-menu/main-menu.partial.html:95 +#: client/src/organizations/linkout/organizations-linkout.route.js:229 msgid "PROJECTS" msgstr "PROJETS" -#: client/src/notifications/notificationTemplates.form.js:237 +#: client/src/shared/paginate/paginate.partial.html:33 +msgid "" +"Page\n" +" {{current()}} of\n" +" {{last()}}" +msgstr "" +"Page\n" +" {{current()}} of\n" +" {{last()}}" + +#: client/src/notifications/notificationTemplates.form.js:240 msgid "Pagerduty subdomain" msgstr "Sous-domaine Pagerduty" -#: client/src/forms/JobTemplates.js:371 client/src/forms/Workflows.js:78 +#: client/src/forms/JobTemplates.js:373 +#: client/src/forms/Workflows.js:78 msgid "" "Pass extra command line variables to the playbook. This is the %s or %s " "command line parameter for %s. Provide key/value pairs using either YAML or " @@ -1585,13 +2272,20 @@ msgstr "" "Il s'agit du paramètre de ligne de commande %s ou %s pour %s. Entrez des " "paires clé/valeur avec la syntaxe YAML ou JSON." -#: client/src/forms/Credentials.js:227 client/src/forms/Users.js:70 -#: client/src/helpers/Credentials.js:120 client/src/helpers/Credentials.js:128 -#: client/src/helpers/Credentials.js:148 client/src/helpers/Credentials.js:158 -#: client/src/helpers/Credentials.js:168 client/src/helpers/Credentials.js:231 -#: client/src/helpers/Credentials.js:256 client/src/helpers/Credentials.js:264 -#: client/src/helpers/Credentials.js:284 client/src/helpers/Credentials.js:294 -#: client/src/helpers/Credentials.js:304 client/src/helpers/Credentials.js:45 +#: client/src/forms/Credentials.js:227 +#: client/src/forms/Users.js:70 +#: client/src/helpers/Credentials.js:120 +#: client/src/helpers/Credentials.js:128 +#: client/src/helpers/Credentials.js:148 +#: client/src/helpers/Credentials.js:158 +#: client/src/helpers/Credentials.js:168 +#: client/src/helpers/Credentials.js:231 +#: client/src/helpers/Credentials.js:256 +#: client/src/helpers/Credentials.js:264 +#: client/src/helpers/Credentials.js:284 +#: client/src/helpers/Credentials.js:294 +#: client/src/helpers/Credentials.js:304 +#: client/src/helpers/Credentials.js:45 #: client/src/helpers/Credentials.js:95 #: client/src/notifications/shared/type-change.service.js:28 msgid "Password" @@ -1614,15 +2308,17 @@ msgstr "Le mois dernier" msgid "Past Week" msgstr "La semaine dernière" -#: client/src/helpers/Credentials.js:103 client/src/helpers/Credentials.js:239 +#: client/src/helpers/Credentials.js:103 +#: client/src/helpers/Credentials.js:239 msgid "" -"Paste the contents of the PEM file associated with the service account " -"email." +"Paste the contents of the PEM file associated with the service account email." +"" msgstr "" "Collez le contenu du fichier PEM associé à l'adresse électronique du compte " "de service." -#: client/src/helpers/Credentials.js:115 client/src/helpers/Credentials.js:251 +#: client/src/helpers/Credentials.js:115 +#: client/src/helpers/Credentials.js:251 msgid "" "Paste the contents of the PEM file that corresponds to the certificate you " "uploaded in the Microsoft Azure console." @@ -1643,18 +2339,30 @@ msgstr "" msgid "Period" msgstr "Période" -#: client/src/controllers/Projects.js:324 client/src/controllers/Users.js:141 +#: client/src/controllers/Projects.js:324 +#: client/src/controllers/Users.js:141 +#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:26 msgid "Permission Error" msgstr "Erreur de permission" -#: client/src/forms/Credentials.js:439 client/src/forms/Inventories.js:142 -#: client/src/forms/JobTemplates.js:416 client/src/forms/Organizations.js:64 -#: client/src/forms/Projects.js:227 client/src/forms/Teams.js:117 -#: client/src/forms/Users.js:183 client/src/forms/Workflows.js:116 +#: client/src/forms/Credentials.js:440 +#: client/src/forms/Inventories.js:96 +#: client/src/forms/JobTemplates.js:419 +#: client/src/forms/Organizations.js:65 +#: client/src/forms/Projects.js:228 +#: client/src/forms/Teams.js:117 +#: client/src/forms/Users.js:184 +#: client/src/forms/Workflows.js:117 msgid "Permissions" msgstr "Permissions" -#: client/src/forms/JobTemplates.js:121 client/src/forms/JobTemplates.js:132 +#: client/src/forms/EventsViewer.js:40 +msgid "Play" +msgstr "Lancer" + +#: client/src/forms/JobTemplates.js:122 +#: client/src/forms/JobTemplates.js:133 +#: client/src/job-detail/job-detail.partial.html:112 msgid "Playbook" msgstr "Playbook" @@ -1666,9 +2374,21 @@ msgstr "Répertoire de playbooks" msgid "Playbook Run" msgstr "Exécution du playbook" +#: client/src/job-detail/job-detail.partial.html:208 +msgid "Plays" +msgstr "Lancements" + #: client/src/forms/Users.js:124 msgid "Please add user to an Organization." -msgstr "" +msgstr "Veuillez ajouter un utilisateur à votre organisation." + +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:89 +msgid "Please assign roles to the selected resources" +msgstr "Veuillez allouer des rôles aux ressources sélectionnées" + +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:62 +msgid "Please assign roles to the selected users/teams" +msgstr "Veuillez allouer des rôles aux utilisateurs / équipes sélectionnées" #: client/src/license/license.partial.html:84 msgid "" @@ -1678,24 +2398,24 @@ msgstr "" "Cliquez sur le bouton ci-dessous pour visiter le site Web d'Ansible afin " "d'obtenir une clé de licence Tower." -#: client/src/shared/form-generator.js:835 -#: client/src/shared/form-generator.js:949 +#: client/src/shared/form-generator.js:836 +#: client/src/shared/form-generator.js:950 msgid "" "Please enter a URL that begins with ssh, http or https. The URL may not " "contain the '@' character." msgstr "" -"Veuillez saisir une URL commençant par ssh, http ou https. L'URL ne doit pas" -" contenir le caractère '@'." +"Veuillez saisir une URL commençant par ssh, http ou https. L'URL ne doit pas " +"contenir le caractère '@'." -#: client/src/shared/form-generator.js:1187 +#: client/src/shared/form-generator.js:1188 msgid "Please enter a number greater than %d and less than %d." msgstr "Entrez un nombre supérieur à %d et inférieur à %d." -#: client/src/shared/form-generator.js:1189 +#: client/src/shared/form-generator.js:1190 msgid "Please enter a number greater than %d." msgstr "Entrez un nombre supérieur à %d." -#: client/src/shared/form-generator.js:1181 +#: client/src/shared/form-generator.js:1182 msgid "Please enter a number." msgstr "Entrez un nombre." @@ -1707,14 +2427,14 @@ msgstr "Entrez un mot de passe." msgid "Please enter a username." msgstr "Entrez un nom d'utilisateur." -#: client/src/shared/form-generator.js:825 -#: client/src/shared/form-generator.js:939 +#: client/src/shared/form-generator.js:826 +#: client/src/shared/form-generator.js:940 msgid "Please enter a valid email address." msgstr "Entrez une adresse électronique valide." -#: client/src/shared/form-generator.js:1041 -#: client/src/shared/form-generator.js:820 -#: client/src/shared/form-generator.js:934 +#: client/src/shared/form-generator.js:1042 +#: client/src/shared/form-generator.js:821 +#: client/src/shared/form-generator.js:935 msgid "Please enter a value." msgstr "Entrez une valeur." @@ -1730,14 +2450,18 @@ msgstr "Veuillez enregistrer avant d'ajouter des notifications" msgid "Please save before adding users" msgstr "Veuillez enregistrer avant d'ajouter des utilisateurs" -#: client/src/forms/Inventories.js:138 client/src/forms/Inventories.js:91 -#: client/src/forms/JobTemplates.js:409 client/src/forms/Organizations.js:57 -#: client/src/forms/Projects.js:219 client/src/forms/Teams.js:113 -#: client/src/forms/Workflows.js:109 +#: client/src/controllers/Credentials.js:161 +#: client/src/forms/Inventories.js:92 +#: client/src/forms/JobTemplates.js:412 +#: client/src/forms/Organizations.js:58 +#: client/src/forms/Projects.js:220 +#: client/src/forms/Teams.js:113 +#: client/src/forms/Workflows.js:110 msgid "Please save before assigning permissions" msgstr "Veuillez enregistrer avant d'attribuer des permissions" -#: client/src/forms/Users.js:122 client/src/forms/Users.js:179 +#: client/src/forms/Users.js:122 +#: client/src/forms/Users.js:180 msgid "Please save before assigning to organizations" msgstr "Veuillez enregistrer avant l'attribution à des organisations" @@ -1745,33 +2469,47 @@ msgstr "Veuillez enregistrer avant l'attribution à des organisations" msgid "Please save before assigning to teams" msgstr "Veuillez enregistrer avant l'attribution à des équipes" -#: client/src/forms/Workflows.js:185 +#: client/src/forms/Workflows.js:186 msgid "Please save before defining the workflow graph" msgstr "Veuillez enregistrer avant de définir le graphique du workflow" +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 +msgid "Please select Users / Teams from the lists below." +msgstr "" +"Veuillez sélectionner des utilisateurs / équipes dans les listes ci-dessous." + +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 +msgid "Please select Users from the list below." +msgstr "Veuillez sélectionner des utilisateurs dans la liste ci-dessous." + #: client/src/forms/WorkflowMaker.js:65 msgid "Please select a Credential." msgstr "Sélectionnez des informations d'identification." -#: client/src/forms/JobTemplates.js:152 +#: client/src/forms/JobTemplates.js:153 msgid "" "Please select a Machine Credential or check the Prompt on launch option." msgstr "" "Sélectionnez les informations d'identification de la machine ou cochez " "l'option Me le demander au lancement." -#: client/src/shared/form-generator.js:1222 +#: client/src/shared/form-generator.js:1223 msgid "Please select a number between" msgstr "Sélectionnez un nombre compris entre" -#: client/src/shared/form-generator.js:1218 +#: client/src/shared/form-generator.js:1219 msgid "Please select a number." msgstr "Sélectionnez un nombre." -#: client/src/shared/form-generator.js:1109 -#: client/src/shared/form-generator.js:1178 -#: client/src/shared/form-generator.js:1297 -#: client/src/shared/form-generator.js:1404 +#: client/src/job-detail/job-detail.partial.html:245 +msgid "Please select a task below to view its associated hosts" +msgstr "" +"Veuillez sélectionner une tâche ci-dessous pour afficher ses hôtes associés" + +#: client/src/shared/form-generator.js:1110 +#: client/src/shared/form-generator.js:1179 +#: client/src/shared/form-generator.js:1299 +#: client/src/shared/form-generator.js:1406 msgid "Please select a value." msgstr "Sélectionnez une valeur." @@ -1784,15 +2522,20 @@ msgstr "" msgid "Please select an Inventory." msgstr "Sélectionnez un inventaire." -#: client/src/shared/form-generator.js:1215 +#: client/src/shared/form-generator.js:1216 msgid "Please select at least one value." msgstr "Sélectionnez une valeur au moins." +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:29 +msgid "Please select resources from the lists below." +msgstr "Veuillez sélectionner des ressources dans les listes ci-dessous." + #: client/src/notifications/shared/type-change.service.js:27 msgid "Port" msgstr "Port" -#: client/src/forms/Credentials.js:258 client/src/helpers/Credentials.js:36 +#: client/src/forms/Credentials.js:258 +#: client/src/helpers/Credentials.js:36 #: client/src/helpers/Credentials.js:60 msgid "Private Key" msgstr "Clé privée" @@ -1801,28 +2544,36 @@ msgstr "Clé privée" msgid "Private Key Passphrase" msgstr "Phrase de passe pour la clé privée" -#: client/src/forms/Credentials.js:280 client/src/forms/Credentials.js:284 +#: client/src/forms/Credentials.js:280 +#: client/src/forms/Credentials.js:284 msgid "Privilege Escalation" msgstr "Élévation des privilèges" -#: client/src/helpers/Credentials.js:227 client/src/helpers/Credentials.js:91 +#: client/src/helpers/Credentials.js:227 +#: client/src/helpers/Credentials.js:91 msgid "Privilege Escalation Password" msgstr "Mot de passe pour l'élévation des privilèges" -#: client/src/helpers/Credentials.js:226 client/src/helpers/Credentials.js:90 +#: client/src/helpers/Credentials.js:226 +#: client/src/helpers/Credentials.js:90 msgid "Privilege Escalation Username" msgstr "Nom d'utilisateur pour l'élévation des privilèges" -#: client/src/forms/JobTemplates.js:115 client/src/forms/JobTemplates.js:98 -#: client/src/helpers/Credentials.js:104 client/src/helpers/Credentials.js:240 +#: client/src/forms/JobTemplates.js:116 +#: client/src/forms/JobTemplates.js:99 +#: client/src/helpers/Credentials.js:104 +#: client/src/helpers/Credentials.js:240 +#: client/src/job-detail/job-detail.partial.html:105 msgid "Project" msgstr "Projet" -#: client/src/helpers/Credentials.js:133 client/src/helpers/Credentials.js:269 +#: client/src/helpers/Credentials.js:133 +#: client/src/helpers/Credentials.js:269 msgid "Project (Tenant Name)" msgstr "Projet (nom du client)" -#: client/src/forms/Projects.js:75 client/src/forms/Projects.js:83 +#: client/src/forms/Projects.js:75 +#: client/src/forms/Projects.js:83 msgid "Project Base Path" msgstr "Chemin de base du projet" @@ -1842,37 +2593,52 @@ msgstr "Erreurs de synchronisation du projet" msgid "Project lookup failed. GET returned:" msgstr "La recherche de projet n'a pas abouti. GET renvoyé :" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:109 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:46 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 #: client/src/dashboard/counts/dashboard-counts.directive.js:61 -#: client/src/lists/Projects.js:16 client/src/lists/Projects.js:17 +#: client/src/lists/Projects.js:16 +#: client/src/lists/Projects.js:17 msgid "Projects" msgstr "Projets" -#: client/src/forms/JobTemplates.js:161 client/src/forms/JobTemplates.js:232 -#: client/src/forms/JobTemplates.js:263 client/src/forms/JobTemplates.js:281 -#: client/src/forms/JobTemplates.js:382 client/src/forms/JobTemplates.js:68 -#: client/src/forms/JobTemplates.js:93 +#: client/src/forms/JobTemplates.js:162 +#: client/src/forms/JobTemplates.js:234 +#: client/src/forms/JobTemplates.js:265 +#: client/src/forms/JobTemplates.js:283 +#: client/src/forms/JobTemplates.js:384 +#: client/src/forms/JobTemplates.js:68 +#: client/src/forms/JobTemplates.js:94 msgid "Prompt on launch" msgstr "Me le demander au lancement" -#: client/src/forms/JobTemplates.js:255 client/src/forms/JobTemplates.js:273 -#: client/src/forms/WorkflowMaker.js:139 client/src/forms/WorkflowMaker.js:154 +#: client/src/forms/JobTemplates.js:257 +#: client/src/forms/JobTemplates.js:275 +#: client/src/forms/WorkflowMaker.js:139 +#: client/src/forms/WorkflowMaker.js:154 msgid "Provide a comma separated list of tags." msgstr "Entrez une liste de balises séparées par des virgules." -#: client/src/forms/JobTemplates.js:223 client/src/forms/WorkflowMaker.js:123 +#: client/src/forms/JobTemplates.js:225 +#: client/src/forms/WorkflowMaker.js:123 msgid "" "Provide a host pattern to further constrain the list of hosts that will be " "managed or affected by the playbook. Multiple patterns can be separated by " "%s %s or %s" msgstr "" -"Entrez un modèle d'hôte pour limiter davantage la liste des hôtes qui seront" -" gérés ou attribués par le playbook. Plusieurs modèles peuvent être séparés " +"Entrez un modèle d'hôte pour limiter davantage la liste des hôtes qui seront " +"gérés ou attribués par le playbook. Plusieurs modèles peuvent être séparés " "par des %s %s ou des %s" -#: client/src/forms/JobTemplates.js:326 client/src/forms/JobTemplates.js:334 +#: client/src/forms/JobTemplates.js:328 +#: client/src/forms/JobTemplates.js:336 msgid "Provisioning Callback URL" msgstr "URL de rappel d'exécution de Tower job_template" +#: client/src/helpers/Projects.js:63 +msgid "Queued. Click for details" +msgstr "En file d'attente. Cliquer pour obtenir davantage d'informations" + #: client/src/configuration/auth-form/configuration-auth.controller.js:107 msgid "RADIUS" msgstr "RADIUS" @@ -1885,53 +2651,124 @@ msgstr "RÉCENTES EXÉCUTIONS DE TÂCHE" msgid "RECENTLY RUN JOBS" msgstr "TÂCHES RÉCEMMENT EXÉCUTÉES" -#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:4 #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:52 msgid "RECENTLY USED JOB TEMPLATES" msgstr "MODÈLES DE TÂCHE RÉCEMMENT UTILISÉS" -#: client/src/lists/Projects.js:70 client/src/partials/jobs.html:15 +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:4 +msgid "RECENTLY USED TEMPLATES" +msgstr "MODÈLES RÉCEMMENT UTILISÉS" + +#: client/src/lists/JobEvents.js:89 +#: client/src/lists/Projects.js:70 +#: client/src/lists/Schedules.js:63 +#: client/src/lists/Streams.js:57 +#: client/src/partials/jobs.html:15 #: client/src/portal-mode/portal-mode-jobs.partial.html:12 msgid "REFRESH" msgstr "ACTUALISER" -#: client/src/forms/JobTemplates.js:100 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:105 +msgid "REGIONS" +msgstr "RÉGIONS" + +#: client/src/shared/smart-search/smart-search.partial.html:51 +msgid "RELATED FIELDS:" +msgstr "CHAMPS ASSOCIÉS :" + +#: client/src/shared/directives.js:136 +msgid "REMOVE" +msgstr "SUPPRIMER" + +#: client/src/forms/JobTemplates.js:101 msgid "RESET" msgstr "RÉINITIALISER" -#: client/src/helpers/Credentials.js:235 client/src/helpers/Credentials.js:99 +#: client/src/job-detail/job-detail.partial.html:11 +#: client/src/job-detail/job-detail.partial.html:14 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:7 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:7 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:7 +msgid "RESULTS" +msgstr "RÉSULTATS" + +#: client/src/helpers/Credentials.js:235 +#: client/src/helpers/Credentials.js:99 msgid "RSA Private Key" msgstr "Clé privée RSA" -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:99 +#: client/src/inventories/manage/adhoc/adhoc.route.js:26 +msgid "RUN COMMAND" +msgstr "EXÉCUTER COMMANDE" + +#: client/src/workflow-results/workflow-results.partial.html:140 +msgid "Read only view of extra variables added to the workflow." +msgstr "" +"Affichage en lecture seule de variables supplémentaires ajoutées au flux de " +"travail." + +#: client/src/notifications/notificationTemplates.list.js:26 +msgid "Recent Notifications" +msgstr "Notifications récentes" + +#: client/src/notifications/notificationTemplates.form.js:102 +#: client/src/notifications/notificationTemplates.form.js:97 msgid "Recipient List" msgstr "Liste de destinataires" #: client/src/bread-crumb/bread-crumb.partial.html:6 #: client/src/lists/Projects.js:66 +#: client/src/lists/Schedules.js:59 +#: client/src/lists/Streams.js:54 msgid "Refresh the page" msgstr "Actualiser la page" +#: client/src/lists/AllJobs.js:101 #: client/src/lists/CompletedJobs.js:75 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:11 +#: client/src/workflow-results/workflow-results.partial.html:29 msgid "Relaunch using the same parameters" msgstr "Relancer en utilisant les mêmes paramètres" #: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:37 -#: client/src/forms/Teams.js:142 client/src/forms/Users.js:218 +#: client/src/forms/Teams.js:142 +#: client/src/forms/Users.js:219 msgid "Remove" msgstr "Supprimer" #: client/src/forms/Projects.js:153 msgid "Remove any local modifications prior to performing an update." msgstr "" -"Supprimez toutes les modifications locales avant d'effectuer une mise à " -"jour." +"Supprimez toutes les modifications locales avant d'effectuer une mise à jour." +"" + +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:149 +msgid "Repeat frequency" +msgstr "Fréquence de répétition" #: client/src/license/license.partial.html:89 msgid "Request License" msgstr "Demander une licence" +#: client/src/shared/form-generator.js:681 +msgid "Reset" +msgstr "Réinitialisation" + +#: client/src/forms/EventsViewer.js:62 +#: client/src/forms/EventsViewer.js:66 +#: client/src/forms/EventsViewer.js:69 +#: client/src/forms/EventsViewer.js:70 +msgid "Results" +msgstr "Résultats" + +#: client/src/job-detail/job-detail.partial.html:52 +msgid "Results Traceback" +msgstr "Traceback Résultats" + +#: client/src/forms/EventsViewer.js:61 +msgid "Return Code" +msgstr "Code de renvoi" + #: client/src/configuration/auth-form/sub-forms/auth-azure.form.js:46 #: client/src/configuration/auth-form/sub-forms/auth-github-org.form.js:50 #: client/src/configuration/auth-form/sub-forms/auth-github-team.form.js:50 @@ -1940,13 +2777,13 @@ msgstr "Demander une licence" #: client/src/configuration/auth-form/sub-forms/auth-ldap.form.js:88 #: client/src/configuration/auth-form/sub-forms/auth-radius.form.js:33 #: client/src/configuration/auth-form/sub-forms/auth-saml.form.js:82 -#: client/src/configuration/jobs-form/configuration-jobs.form.js:67 +#: client/src/configuration/jobs-form/configuration-jobs.form.js:63 #: client/src/configuration/system-form/sub-forms/system-activity-stream.form.js:25 #: client/src/configuration/system-form/sub-forms/system-logging.form.js:52 #: client/src/configuration/system-form/sub-forms/system-misc.form.js:29 #: client/src/configuration/ui-form/configuration-ui.form.js:35 msgid "Revert all to default" -msgstr "" +msgstr "Revenir aux valeurs par défaut" #: client/src/lists/Projects.js:49 msgid "Revision" @@ -1956,17 +2793,39 @@ msgstr "Révision" msgid "Revision #" msgstr "Révision n°" -#: client/src/forms/Credentials.js:461 client/src/forms/Inventories.js:120 -#: client/src/forms/Inventories.js:166 client/src/forms/Organizations.js:88 -#: client/src/forms/Projects.js:249 client/src/forms/Teams.js:135 -#: client/src/forms/Teams.js:98 client/src/forms/Users.js:201 +#: client/src/forms/Credentials.js:462 +#: client/src/forms/EventsViewer.js:36 +#: client/src/forms/Inventories.js:121 +#: client/src/forms/Organizations.js:89 +#: client/src/forms/Projects.js:250 +#: client/src/forms/Teams.js:135 +#: client/src/forms/Teams.js:98 +#: client/src/forms/Users.js:202 +#: client/src/forms/Workflows.js:141 msgid "Role" msgstr "Rôle" +#: client/src/helpers/Projects.js:67 +msgid "Running! Click for details" +msgstr "En cours d'exécution. Cliquer pour obtenir davantage d'informations" + #: client/src/configuration/auth-form/configuration-auth.controller.js:108 msgid "SAML" msgstr "SAML" +#: client/src/scheduler/main.js:293 +msgid "SCHEDULED" +msgstr "PROGRAMMÉ" + +#: client/src/helpers/ActivityStream.js:50 +#: client/src/inventories/main.js:59 +#: client/src/management-jobs/scheduler/main.js:26 +#: client/src/scheduler/main.js:122 +#: client/src/scheduler/main.js:205 +#: client/src/scheduler/main.js:36 +msgid "SCHEDULES" +msgstr "PROGRAMMATIONS" + #: client/src/controllers/Projects.js:697 msgid "SCM Branch" msgstr "Branche SCM" @@ -1983,7 +2842,8 @@ msgstr "Information d'identification SCM" msgid "SCM Delete" msgstr "Suppression SCM" -#: client/src/helpers/Credentials.js:230 client/src/helpers/Credentials.js:94 +#: client/src/helpers/Credentials.js:230 +#: client/src/helpers/Credentials.js:94 msgid "SCM Private Key" msgstr "Clé privée SCM" @@ -2010,6 +2870,7 @@ msgid "SCM update currently running" msgstr "Mise à jour SCM en cours" #: client/src/main-menu/main-menu.partial.html:59 +#: client/src/setup-menu/setup.route.js:8 msgid "SETTINGS" msgstr "PARAMÈTRES" @@ -2021,11 +2882,16 @@ msgstr "SE CONNECTER" msgid "SIGN IN WITH" msgstr "SE CONNECTER AVEC" -#: client/src/app.js:497 +#: client/src/app.js:499 msgid "SOCKETS" msgstr "SOCKETS" -#: client/src/helpers/Credentials.js:169 client/src/helpers/Credentials.js:305 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:98 +msgid "SOURCE" +msgstr "SOURCE" + +#: client/src/helpers/Credentials.js:169 +#: client/src/helpers/Credentials.js:305 msgid "SSH Key" msgstr "Clé SSH" @@ -2033,11 +2899,31 @@ msgstr "Clé SSH" msgid "SSH key description" msgstr "Description de la clé SSH" -#: client/src/notifications/notificationTemplates.form.js:385 +#: client/src/notifications/notificationTemplates.form.js:388 msgid "SSL Connection" msgstr "Connexion SSL" -#: client/src/forms/Credentials.js:120 client/src/forms/Credentials.js:128 +#: client/src/job-detail/job-detail.partial.html:414 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:108 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:131 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:96 +msgid "STANDARD OUT" +msgstr "STANDARD OUT" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:32 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:52 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:45 +msgid "STARTED" +msgstr "DÉMARRÉ" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:24 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:37 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:37 +msgid "STATUS" +msgstr "STATUT" + +#: client/src/forms/Credentials.js:120 +#: client/src/forms/Credentials.js:128 msgid "STS Token" msgstr "Token STS" @@ -2045,11 +2931,17 @@ msgstr "Token STS" msgid "SUCCESSFUL" msgstr "RÉUSSI" -#: client/src/helpers/Credentials.js:150 client/src/helpers/Credentials.js:286 -msgid "Satellite 6 URL" -msgstr "" +#: client/src/system-tracking/system-tracking.route.js:18 +msgid "SYSTEM TRACKING" +msgstr "SUIVI DU SYSTÈME" -#: client/src/shared/form-generator.js:1688 +#: client/src/helpers/Credentials.js:150 +#: client/src/helpers/Credentials.js:286 +msgid "Satellite 6 URL" +msgstr "URL Satellite 6" + +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:176 +#: client/src/shared/form-generator.js:1699 msgid "Save" msgstr "Enregistrer" @@ -2084,14 +2976,25 @@ msgstr "Planifier les prochaines exécutions de modèle de tâche" msgid "Scheduled Jobs" msgstr "Tâches planifiées" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 +#: client/src/inventories/main.js:93 +#: client/src/management-jobs/scheduler/main.js:32 #: client/src/partials/jobs.html:10 +#: client/src/scheduler/main.js:153 +#: client/src/scheduler/main.js:236 +#: client/src/scheduler/main.js:67 msgid "Schedules" msgstr "Calendriers" -#: client/src/inventory-scripts/inventory-scripts.form.js:59 +#: client/src/inventory-scripts/inventory-scripts.form.js:62 msgid "Script must begin with a hashbang sequence: i.e.... %s" msgstr "Le script doit commencer par une séquence hashbang : c.-à-d. ....%s" +#: client/src/shared/smart-search/smart-search.controller.js:38 +#: client/src/shared/smart-search/smart-search.controller.js:83 +msgid "Search" +msgstr "Rechercher" + #: client/src/forms/Credentials.js:105 msgid "Secret Key" msgstr "Clé secrète" @@ -2106,34 +3009,39 @@ msgstr "" "demander des informations d'identification provisoires avec des privilèges " "limités pour les utilisateurs d'AWS Identity and Access Management (IAM)." -#: client/src/shared/form-generator.js:1692 +#: client/src/shared/form-generator.js:1703 msgid "Select" msgstr "Sélectionner" #: client/src/access/add-rbac-user-team/rbac-user-team.controller.js:67 msgid "Select a role" -msgstr "" +msgstr "Sélectionner un rôle" -#: client/src/configuration/jobs-form/configuration-jobs.controller.js:89 -#: client/src/configuration/ui-form/configuration-ui.controller.js:84 +#: client/src/configuration/jobs-form/configuration-jobs.controller.js:90 +#: client/src/configuration/ui-form/configuration-ui.controller.js:85 msgid "Select commands" msgstr "Sélectionner des commandes" #: client/src/forms/Projects.js:98 msgid "" -"Select from the list of directories found in the Project Base Path. Together" -" the base path and the playbook directory provide the full path used to " +"Select from the list of directories found in the Project Base Path. Together " +"the base path and the playbook directory provide the full path used to " "locate playbooks." msgstr "" "Faites une sélection à partir de la liste des répertoires trouvés dans le " "chemin de base du projet. Le chemin de base et le répertoire de playbook " "fournissent ensemble le chemin complet servant à localiser les playbooks." -#: client/src/configuration/auth-form/configuration-auth.controller.js:229 +#: client/src/configuration/auth-form/configuration-auth.controller.js:230 msgid "Select group types" msgstr "Sélectionner des types de groupe" -#: client/src/forms/JobTemplates.js:154 client/src/forms/WorkflowMaker.js:67 +#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:25 +msgid "Select roles" +msgstr "Sélectionner des rôles" + +#: client/src/forms/JobTemplates.js:155 +#: client/src/forms/WorkflowMaker.js:67 msgid "" "Select the credential you want the job to use when accessing the remote " "hosts. Choose the credential containing the username and SSH key or " @@ -2144,45 +3052,48 @@ msgstr "" "d'identification contenant le nom d'utilisateur et la clé SSH ou le mot de " "passe dont Ansible aura besoin pour se connecter aux hôtes distants." -#: client/src/forms/JobTemplates.js:86 client/src/forms/WorkflowMaker.js:88 +#: client/src/forms/JobTemplates.js:86 +#: client/src/forms/WorkflowMaker.js:88 msgid "Select the inventory containing the hosts you want this job to manage." msgstr "" "Sélectionnez l'inventaire contenant les hôtes que vous souhaitez gérer." -#: client/src/forms/JobTemplates.js:131 +#: client/src/forms/JobTemplates.js:132 msgid "Select the playbook to be executed by this job." msgstr "Sélectionnez le playbook qui devra être exécuté par cette tâche." -#: client/src/forms/JobTemplates.js:114 +#: client/src/forms/JobTemplates.js:115 msgid "" "Select the project containing the playbook you want this job to execute." msgstr "" "Sélectionnez le projet contenant le playbook que cette tâche devra exécuter." -#: client/src/configuration/system-form/configuration-system.controller.js:169 +#: client/src/configuration/system-form/configuration-system.controller.js:170 msgid "Select types" msgstr "Sélectionner des types" -#: client/src/forms/JobTemplates.js:176 +#: client/src/forms/JobTemplates.js:178 msgid "" "Selecting an optional cloud credential in the job template will pass along " "the access credentials to the running playbook, allowing provisioning into " "the cloud without manually passing parameters to the included modules." msgstr "" -"La sélection d'informations identification cloud facultatives dans le modèle" -" de tâche transmettra les informations d'identification d'accès au playbook " +"La sélection d'informations identification cloud facultatives dans le modèle " +"de tâche transmettra les informations d'identification d'accès au playbook " "en cours d'exécution, ce qui permet une authentification dans le cloud sans " "transmettre manuellement les paramètres aux modules inclus." -#: client/src/notifications/notificationTemplates.form.js:83 +#: client/src/notifications/notificationTemplates.form.js:86 msgid "Sender Email" msgstr "Adresse électronique de l'expéditeur" -#: client/src/helpers/Credentials.js:234 client/src/helpers/Credentials.js:98 +#: client/src/helpers/Credentials.js:234 +#: client/src/helpers/Credentials.js:98 msgid "Service Account Email Address" msgstr "Adresse électronique du compte de service" -#: client/src/forms/JobTemplates.js:60 client/src/forms/WorkflowMaker.js:108 +#: client/src/forms/JobTemplates.js:60 +#: client/src/forms/WorkflowMaker.js:108 msgid "" "Setting the type to %s will execute the playbook and store any scanned " "facts for use with Tower's System Tracking feature." @@ -2196,18 +3107,18 @@ msgstr "La définition du type sur %s n'exécute pas le playbook." #: client/src/forms/WorkflowMaker.js:106 msgid "" -"Setting the type to %s will not execute the playbook. Instead, %s will check" -" playbook syntax, test environment setup and report problems." +"Setting the type to %s will not execute the playbook. Instead, %s will check " +"playbook syntax, test environment setup and report problems." msgstr "" "La définition du type sur %s n'exécute pas le playbook. À la place, %s " -"vérifie la syntaxe du playbook, teste la configuration de l'environnement et" -" signale les problèmes." +"vérifie la syntaxe du playbook, teste la configuration de l'environnement et " +"signale les problèmes." #: client/src/main-menu/main-menu.partial.html:147 msgid "Settings" msgstr "Paramètres" -#: client/src/shared/form-generator.js:850 +#: client/src/shared/form-generator.js:851 msgid "Show" msgstr "Afficher" @@ -2226,12 +3137,16 @@ msgstr "Se connecter avec des organisations %s" msgid "Sign in with %s Teams" msgstr "Se connecter avec des équipes %s" -#: client/src/forms/JobTemplates.js:268 client/src/forms/JobTemplates.js:276 -#: client/src/forms/WorkflowMaker.js:149 client/src/forms/WorkflowMaker.js:157 +#: client/src/forms/JobTemplates.js:270 +#: client/src/forms/JobTemplates.js:278 +#: client/src/forms/WorkflowMaker.js:149 +#: client/src/forms/WorkflowMaker.js:157 +#: client/src/job-detail/job-detail.partial.html:158 msgid "Skip Tags" msgstr "Balises de saut" -#: client/src/forms/JobTemplates.js:274 client/src/forms/WorkflowMaker.js:155 +#: client/src/forms/JobTemplates.js:276 +#: client/src/forms/WorkflowMaker.js:155 msgid "" "Skip tags are useful when you have a large playbook, and you want to skip " "specific parts of a play or task." @@ -2247,11 +3162,15 @@ msgstr "Contrôle de la source" msgid "Source Details" msgstr "Détails de la source" -#: client/src/notifications/notificationTemplates.form.js:196 +#: client/src/notifications/notificationTemplates.form.js:199 msgid "Source Phone Number" msgstr "Numéro de téléphone de la source" -#: client/src/notifications/notificationTemplates.form.js:333 +#: client/src/partials/logviewer.html:9 +msgid "Source Vars" +msgstr "Vars Source" + +#: client/src/notifications/notificationTemplates.form.js:336 msgid "Specify HTTP Headers in JSON format" msgstr "Spécifier les en-têtes HTTP au format JSON" @@ -2271,7 +3190,24 @@ msgstr "" "Divisez votre organisation afin d'associer du contenu et des permissions de " "contrôle pour les groupes." -#: client/src/lists/PortalJobTemplates.js:42 client/src/lists/Templates.js:87 +#: client/src/partials/logviewer.html:5 +msgid "Standard Out" +msgstr "Standard Out" + +#: client/src/forms/EventsViewer.js:73 +msgid "Start" +msgstr "Démarrer" + +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:41 +msgid "Start Date" +msgstr "Date Début" + +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 +msgid "Start Time" +msgstr "Heure Début" + +#: client/src/lists/PortalJobTemplates.js:42 +#: client/src/lists/Templates.js:87 msgid "Start a job using this template" msgstr "Démarrer une tâche avec ce modèle" @@ -2280,19 +3216,41 @@ msgstr "Démarrer une tâche avec ce modèle" msgid "Start an SCM update" msgstr "Démarrer une mise à jour SCM" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:49 +#: client/src/forms/LogViewerStatus.js:38 +#: client/src/job-detail/job-detail.partial.html:209 +#: client/src/job-detail/job-detail.partial.html:267 +#: client/src/job-detail/job-detail.partial.html:64 +msgid "Started" +msgstr "Démarré" + +#: client/src/dashboard/hosts/dashboard-hosts.list.js:48 +#: client/src/forms/EventsViewer.js:24 +#: client/src/forms/LogViewerStatus.js:28 +#: client/src/job-detail/job-detail.partial.html:26 +#: client/src/lists/JobEvents.js:51 +#: client/src/notifications/notification-templates-list/list.controller.js:73 +#: client/src/partials/logviewer.html:4 msgid "Status" msgstr "État" +#: client/src/configuration/auth-form/configuration-auth.partial.html:3 +msgid "Sub Category" +msgstr "Sous-catégorie" + #: client/src/license/license.partial.html:121 msgid "Submit" msgstr "Valider" +#: client/src/helpers/Jobs.js:230 +msgid "Submit the request to cancel?" +msgstr "Demander l'annulation de la demande ?" + #: client/src/license/license.partial.html:27 msgid "Subscription" msgstr "Abonnement" -#: client/src/forms/Credentials.js:152 client/src/forms/Credentials.js:163 +#: client/src/forms/Credentials.js:152 +#: client/src/forms/Credentials.js:163 msgid "Subscription ID" msgstr "ID d'abonnement" @@ -2305,10 +3263,18 @@ msgstr "" msgid "Success" msgstr "Réussite" +#: client/src/helpers/Projects.js:70 +msgid "Success! Click for details" +msgstr "Réussi. Cliquer pour obtenir davantage d'informations" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:77 msgid "Successful" msgstr "Réussi" +#: client/src/configuration/configuration.partial.html:17 +msgid "System" +msgstr "Système" + #: client/src/controllers/Users.js:18 msgid "System Administrator" msgstr "Administrateur système" @@ -2317,12 +3283,22 @@ msgstr "Administrateur système" msgid "System Auditor" msgstr "Auditeur système" -#: client/src/app.js:340 +#: client/src/configuration/configuration.partial.html:3 +msgid "System auditors have read-only permissions in this section." +msgstr "" +"Les auditeurs de système n'ont que des permissions lecture-seule sur cette " +"section." + +#: client/src/app.js:343 +#: client/src/helpers/ActivityStream.js:35 +#: client/src/organizations/linkout/organizations-linkout.route.js:132 msgid "TEAMS" msgstr "ÉQUIPES" +#: client/src/helpers/ActivityStream.js:56 #: client/src/main-menu/main-menu.partial.html:113 #: client/src/main-menu/main-menu.partial.html:35 +#: client/src/templates/list/templates-list.route.js:13 msgid "TEMPLATES" msgstr "MODÈLES" @@ -2330,7 +3306,8 @@ msgstr "MODÈLES" msgid "TIME" msgstr "DURÉE" -#: client/src/forms/JobTemplates.js:256 client/src/forms/WorkflowMaker.js:140 +#: client/src/forms/JobTemplates.js:258 +#: client/src/forms/WorkflowMaker.js:140 msgid "" "Tags are useful when you have a large playbook, and you want to run a " "specific part of a play or task." @@ -2338,27 +3315,44 @@ msgstr "" "Les balises sont utiles si votre playbook est important et que vous " "souhaitez exécuter une partie donnée d'une scène ou d'une tâche." -#: client/src/notifications/notificationTemplates.form.js:313 +#: client/src/notifications/notificationTemplates.form.js:316 msgid "Target URL" msgstr "URL cible" -#: client/src/forms/Credentials.js:468 client/src/forms/Inventories.js:126 -#: client/src/forms/Inventories.js:173 client/src/forms/Organizations.js:95 -#: client/src/forms/Projects.js:255 +#: client/src/forms/EventsViewer.js:45 +msgid "Task" +msgstr "Tâche" + +#: client/src/job-detail/job-detail.partial.html:266 +msgid "Tasks" +msgstr "Tâches" + +#: client/src/forms/Credentials.js:468 +#: client/src/forms/Inventories.js:127 +#: client/src/forms/Organizations.js:95 +#: client/src/forms/Projects.js:256 +#: client/src/forms/Workflows.js:147 msgid "Team Roles" msgstr "Rôles d'équipe" -#: client/src/forms/Users.js:156 client/src/lists/Teams.js:16 +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 +#: client/src/forms/Users.js:156 +#: client/src/lists/Teams.js:16 #: client/src/lists/Teams.js:17 #: client/src/setup-menu/setup-menu.partial.html:16 +#: client/src/shared/stateDefinitions.factory.js:342 msgid "Teams" msgstr "Équipes" +#: client/src/job-detail/job-detail.partial.html:57 #: client/src/lists/Templates.js:16 msgid "Template" msgstr "Modèle" -#: client/src/lists/Templates.js:17 client/src/lists/Templates.js:18 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 +#: client/src/lists/Templates.js:17 +#: client/src/lists/Templates.js:18 msgid "Templates" msgstr "Modèles" @@ -2366,17 +3360,19 @@ msgstr "Modèles" msgid "Tenant ID" msgstr "ID Client" -#: client/src/notifications/notificationTemplates.list.js:66 +#: client/src/notifications/notificationTemplates.list.js:65 msgid "Test notification" msgstr "Notification test" -#: client/src/shared/form-generator.js:1410 +#: client/src/shared/form-generator.js:1414 +#: client/src/shared/form-generator.js:1420 msgid "That value was not found. Please enter or select a valid value." msgstr "" -"Cette valeur n'a pas été trouvée. Veuillez entrer ou sélectionner une valeur" -" valide." +"Cette valeur n'a pas été trouvée. Veuillez entrer ou sélectionner une valeur " +"valide." -#: client/src/helpers/Credentials.js:106 client/src/helpers/Credentials.js:242 +#: client/src/helpers/Credentials.js:106 +#: client/src/helpers/Credentials.js:242 msgid "" "The Project ID is the GCE assigned identification. It is constructed as two " "words followed by a three digit number. Such as:" @@ -2388,14 +3384,20 @@ msgstr "" msgid "The SCM update process is running." msgstr "Le processus de mise à jour SCM est en cours d'exécution." +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:70 +msgid "The credential used to run this command." +msgstr "" +"Les informations d'identification utilisées pour exécuter cette commande." + #: client/src/forms/Credentials.js:191 msgid "" "The email address assigned to the Google Compute Engine %sservice account." msgstr "" -"Adresse électronique attribuée au compte de service Google Compute Engine " -"%s." +"Adresse électronique attribuée au compte de service Google Compute Engine %s." +"" -#: client/src/helpers/Credentials.js:142 client/src/helpers/Credentials.js:278 +#: client/src/helpers/Credentials.js:142 +#: client/src/helpers/Credentials.js:278 msgid "The host to authenticate with." msgstr "Hôte avec lequel s'authentifier." @@ -2403,7 +3405,11 @@ msgstr "Hôte avec lequel s'authentifier." msgid "The host value" msgstr "Valeur de l'hôte" -#: client/src/forms/JobTemplates.js:210 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:61 +msgid "The inventory this command ran on." +msgstr "L'inventaire sur lequel cette commande a été exécutée." + +#: client/src/forms/JobTemplates.js:212 msgid "" "The number of parallel or simultaneous processes to use while executing the " "playbook. 0 signifies the default value from the %sansible configuration " @@ -2413,9 +3419,10 @@ msgstr "" "du playbook. 0 indique la valeur par défaut du %sfichier de configuration " "ansible%s." -#: client/src/job-results/job-results.controller.js:538 +#: client/src/job-results/job-results.controller.js:554 msgid "The output is too large to display. Please download." msgstr "" +"La sortie est trop volumineuse pour être affichée. Veuillez télécharger." #: client/src/helpers/Credentials.js:74 msgid "The project value" @@ -2430,6 +3437,18 @@ msgstr "" "pour SCM, modifiez le projet et définissez les paramètres SCM, puis lancez " "une mise à jour." +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:124 +msgid "The time must be in HH24:MM:SS format." +msgstr "L'heure doit être sous le format suivant HH24:MM:SS" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:79 +msgid "The user who ran this command." +msgstr "L'utilisateur qui a exécuté cette commande." + +#: client/src/lists/Streams.js:19 +msgid "There are no events to display at this time" +msgstr "Aucun événement à afficher pour le moment" + #: client/src/lists/PortalJobTemplates.js:20 msgid "There are no job templates to display at this time" msgstr "Aucun modèle de tâche à afficher pour le moment" @@ -2440,8 +3459,8 @@ msgstr "Aucune tâche à afficher pour le moment" #: client/src/controllers/Projects.js:152 msgid "" -"There is no SCM update information available for this project. An update has" -" not yet been completed. If you have not already done so, start an update " +"There is no SCM update information available for this project. An update has " +"not yet been completed. If you have not already done so, start an update " "for this project." msgstr "" "Aucune information de mise à jour SCM n'est disponible pour ce projet. Une " @@ -2460,7 +3479,12 @@ msgstr "" "Une erreur s'est produite lors de la réinitialisation des valeurs. État " "renvoyé :" -#: client/src/helpers/Credentials.js:139 client/src/helpers/Credentials.js:275 +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:168 +msgid "This is not a valid number." +msgstr "Le nombre n'est pas valide." + +#: client/src/helpers/Credentials.js:139 +#: client/src/helpers/Credentials.js:275 msgid "" "This is the tenant name. This value is usually the same as the username." msgstr "" @@ -2475,7 +3499,7 @@ msgstr "" "Cette liste contient des modèles de notification ajoutés à partir de la " "section %sNotifications%s" -#: client/src/notifications/notificationTemplates.form.js:199 +#: client/src/notifications/notificationTemplates.form.js:202 msgid "This must be of the form %s." msgstr "Elle doit se présenter au format %s." @@ -2483,8 +3507,8 @@ msgstr "Elle doit se présenter au format %s." msgid "This user is not a member of any teams" msgstr "Cet utilisateur n'est pas membre d'une équipe" -#: client/src/shared/form-generator.js:830 -#: client/src/shared/form-generator.js:944 +#: client/src/shared/form-generator.js:831 +#: client/src/shared/form-generator.js:945 msgid "" "This value does not match the password you entered previously. Please " "confirm that password." @@ -2501,6 +3525,8 @@ msgstr "" "valeurs par défaut. Voulez-vous vraiment continuer ?" #: client/src/dashboard/lists/jobs/jobs-list.partial.html:14 +#: client/src/lists/Streams.js:28 +#: client/src/notifications/notification-templates-list/list.controller.js:74 msgid "Time" msgstr "Durée" @@ -2512,24 +3538,34 @@ msgstr "Durée restante" msgid "" "Time in seconds to consider a project to be current. During job runs and " "callbacks the task system will evaluate the timestamp of the latest project " -"update. If it is older than Cache Timeout, it is not considered current, and" -" a new project update will be performed." +"update. If it is older than Cache Timeout, it is not considered current, and " +"a new project update will be performed." msgstr "" "Délai en secondes à prévoir pour qu'un projet soit actualisé. Durant " "l'exécution des tâches et les rappels, le système de tâches évalue " -"l'horodatage de la dernière mise à jour du projet. Si elle est plus ancienne" -" que le délai d'expiration du cache, elle n'est pas considérée comme " +"l'horodatage de la dernière mise à jour du projet. Si elle est plus ancienne " +"que le délai d'expiration du cache, elle n'est pas considérée comme " "actualisée, et une nouvelle mise à jour du projet sera effectuée." +#: client/src/forms/EventsViewer.js:74 +#: client/src/forms/EventsViewer.js:78 +#: client/src/forms/EventsViewer.js:82 +msgid "Timing" +msgstr "Timing" + #: client/src/forms/Credentials.js:126 msgid "" -"To learn more about the IAM STS Token, refer to the %sAmazon " -"documentation%s." +"To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." +"" msgstr "" -"Pour en savoir plus sur le token STS d'IAM, reportez-vous à la documentation" -" d'%sAmazon%s." +"Pour en savoir plus sur le token STS d'IAM, reportez-vous à la documentation " +"d'%sAmazon%s." -#: client/src/shared/form-generator.js:855 +#: client/src/job-detail/job-detail.partial.html:416 +msgid "Toggle Output" +msgstr "Basculer Sortie" + +#: client/src/shared/form-generator.js:856 msgid "Toggle the display of plaintext." msgstr "Bascule l'affichage du texte en clair." @@ -2538,34 +3574,44 @@ msgstr "Bascule l'affichage du texte en clair." msgid "Token" msgstr "Token" -#: client/src/forms/Credentials.js:61 client/src/forms/Credentials.js:85 -#: client/src/forms/Teams.js:130 client/src/forms/Users.js:196 -#: client/src/forms/WorkflowMaker.js:34 client/src/lists/CompletedJobs.js:50 -#: client/src/lists/Credentials.js:39 client/src/lists/Projects.js:43 -#: client/src/lists/ScheduledJobs.js:43 client/src/lists/Templates.js:31 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:38 +#: client/src/partials/logviewer.html:6 +msgid "Traceback" +msgstr "Traceback" + +#: client/src/forms/Credentials.js:61 +#: client/src/forms/Credentials.js:85 +#: client/src/forms/Teams.js:130 +#: client/src/forms/Users.js:197 +#: client/src/forms/WorkflowMaker.js:34 +#: client/src/lists/AllJobs.js:61 +#: client/src/lists/CompletedJobs.js:50 +#: client/src/lists/Credentials.js:39 +#: client/src/lists/Projects.js:43 +#: client/src/lists/ScheduledJobs.js:44 +#: client/src/lists/Templates.js:31 +#: client/src/notifications/notificationTemplates.form.js:57 +#: client/src/notifications/notificationTemplates.list.js:37 #: client/src/notifications/notifications.list.js:31 msgid "Type" msgstr "Type" #: client/src/forms/Credentials.js:25 -#: client/src/notifications/notificationTemplates.form.js:23 +#: client/src/notifications/notificationTemplates.form.js:26 msgid "Type Details" msgstr "Détails sur le type" -#: client/src/notifications/notificationTemplates.form.js:212 -#: client/src/notifications/notificationTemplates.form.js:97 +#: client/src/notifications/notificationTemplates.form.js:100 +#: client/src/notifications/notificationTemplates.form.js:215 msgid "Type an option on each line." msgstr "Tapez une option sur chaque ligne." -#: client/src/notifications/notificationTemplates.form.js:141 -#: client/src/notifications/notificationTemplates.form.js:158 -#: client/src/notifications/notificationTemplates.form.js:371 +#: client/src/notifications/notificationTemplates.form.js:144 +#: client/src/notifications/notificationTemplates.form.js:161 +#: client/src/notifications/notificationTemplates.form.js:374 msgid "Type an option on each line. The pound symbol (#) is not required." msgstr "" -"Tapez une option sur chaque ligne. Le symbole dièse (#) n'est pas " -"nécessaire." +"Tapez une option sur chaque ligne. Le symbole dièse (#) n'est pas nécessaire." +"" #: client/src/controllers/Projects.js:442 #: client/src/controllers/Projects.js:724 @@ -2576,7 +3622,9 @@ msgstr "Texte popover de l'URL" msgid "USERNAME" msgstr "NOM D'UTILISATEUR" -#: client/src/app.js:364 +#: client/src/app.js:367 +#: client/src/helpers/ActivityStream.js:32 +#: client/src/organizations/linkout/organizations-linkout.route.js:59 msgid "USERS" msgstr "UTILISATEURS" @@ -2596,31 +3644,51 @@ msgstr "Mettre à jour au lancement" msgid "Upgrade" msgstr "Mettre à niveau" +#: client/src/notifications/notificationTemplates.form.js:408 +msgid "Use SSL" +msgstr "Utiliser SSL" + +#: client/src/notifications/notificationTemplates.form.js:403 +msgid "Use TLS" +msgstr "Utiliser TLS" + #: client/src/forms/Credentials.js:77 msgid "" -"Used to check out and synchronize playbook repositories with a remote source" -" control management system such as Git, Subversion (svn), or Mercurial (hg)." -" These credentials are used by Projects." +"Used to check out and synchronize playbook repositories with a remote source " +"control management system such as Git, Subversion (svn), or Mercurial (hg). " +"These credentials are used by Projects." msgstr "" "Utilisé pour vérifier et synchroniser les référentiels de playbooks avec un " "SCM à distance tel que Git, Subversion (svn) ou Mercurial (hg). Ces " "informations d'identification sont utilisées par les Projets." -#: client/src/forms/Credentials.js:456 client/src/forms/Inventories.js:115 -#: client/src/forms/Inventories.js:161 client/src/forms/Organizations.js:83 -#: client/src/forms/Projects.js:244 client/src/forms/Teams.js:93 +#: client/src/forms/Credentials.js:457 +#: client/src/forms/Inventories.js:116 +#: client/src/forms/Organizations.js:84 +#: client/src/forms/Projects.js:245 +#: client/src/forms/Teams.js:93 +#: client/src/forms/Workflows.js:136 msgid "User" msgstr "Utilisateur" +#: client/src/configuration/configuration.partial.html:18 +msgid "User Interface" +msgstr "Interface utilisateur" + #: client/src/forms/Users.js:94 msgid "User Type" msgstr "Type d'utilisateur" -#: client/src/forms/Users.js:49 client/src/helpers/Credentials.js:118 -#: client/src/helpers/Credentials.js:225 client/src/helpers/Credentials.js:254 -#: client/src/helpers/Credentials.js:32 client/src/helpers/Credentials.js:56 -#: client/src/helpers/Credentials.js:89 client/src/lists/Users.js:37 -#: client/src/notifications/notificationTemplates.form.js:64 +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 +#: client/src/forms/Users.js:49 +#: client/src/helpers/Credentials.js:118 +#: client/src/helpers/Credentials.js:225 +#: client/src/helpers/Credentials.js:254 +#: client/src/helpers/Credentials.js:32 +#: client/src/helpers/Credentials.js:56 +#: client/src/helpers/Credentials.js:89 +#: client/src/lists/Users.js:37 +#: client/src/notifications/notificationTemplates.form.js:67 msgid "Username" msgstr "Nom d'utilisateur" @@ -2630,12 +3698,15 @@ msgid "" "cloud or infrastructure provider. These are used for dynamic inventory " "sources and for cloud provisioning and deployment in playbook runs." msgstr "" -"Noms d'utilisateur, mots de passe et clés d'accès pour s'authentifier auprès" -" du fournisseur de cloud ou d'infrastructure spécifié. Ceux-ci sont utilisés" -" pour les sources d'inventaire dynamique et pour l'authentification de " +"Noms d'utilisateur, mots de passe et clés d'accès pour s'authentifier auprès " +"du fournisseur de cloud ou d'infrastructure spécifié. Ceux-ci sont utilisés " +"pour les sources d'inventaire dynamique et pour l'authentification de " "services dans le cloud et leur déploiement dans les playbooks." -#: client/src/forms/Teams.js:75 client/src/lists/Users.js:26 +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 +#: client/src/forms/Teams.js:75 +#: client/src/lists/Users.js:26 #: client/src/lists/Users.js:27 #: client/src/setup-menu/setup-menu.partial.html:10 msgid "Users" @@ -2653,8 +3724,8 @@ msgstr "AFFICHER LA DOCUMENTATION" #: client/src/main-menu/main-menu.partial.html:51 msgid "VIEW USER PAGE FOR {{ $root.current_user.username | uppercase }}" msgstr "" -"AFFICHER LA PAGE UTILISATEUR POUR {{ $root.current_user.username | uppercase" -" }}" +"AFFICHER LA PAGE UTILISATEUR POUR {{ $root.current_user.username | uppercase " +"}}" #: client/src/license/license.partial.html:10 msgid "Valid License" @@ -2668,7 +3739,10 @@ msgstr "Variables" msgid "Vault Password" msgstr "Mot de passe Vault" -#: client/src/forms/JobTemplates.js:237 client/src/forms/JobTemplates.js:244 +#: client/src/forms/JobTemplates.js:239 +#: client/src/forms/JobTemplates.js:246 +#: client/src/job-detail/job-detail.partial.html:148 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:99 msgid "Verbosity" msgstr "Verbosité" @@ -2679,13 +3753,22 @@ msgstr "Version" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:58 #: client/src/inventory-scripts/inventory-scripts.list.js:65 -#: client/src/lists/Credentials.js:81 client/src/lists/Inventories.js:85 -#: client/src/lists/Teams.js:69 client/src/lists/Templates.js:117 +#: client/src/lists/Credentials.js:81 +#: client/src/lists/Inventories.js:85 +#: client/src/lists/JobEvents.js:98 +#: client/src/lists/Schedules.js:85 +#: client/src/lists/Streams.js:66 +#: client/src/lists/Teams.js:69 +#: client/src/lists/Templates.js:116 #: client/src/lists/Users.js:78 -#: client/src/notifications/notificationTemplates.list.js:81 +#: client/src/notifications/notificationTemplates.list.js:80 msgid "View" msgstr "Afficher" +#: client/src/bread-crumb/bread-crumb.directive.js:111 +msgid "View Activity Stream" +msgstr "Afficher le flux d'activité" + #: client/src/main-menu/main-menu.partial.html:173 msgid "View Documentation" msgstr "Afficher la documentation" @@ -2694,8 +3777,9 @@ msgstr "Afficher la documentation" msgid "View JSON examples at %s" msgstr "Afficher les exemples JSON à %s" -#: client/src/forms/JobTemplates.js:463 client/src/forms/Workflows.js:163 -#: client/src/shared/form-generator.js:1716 +#: client/src/forms/JobTemplates.js:466 +#: client/src/forms/Workflows.js:164 +#: client/src/shared/form-generator.js:1727 msgid "View Survey" msgstr "Afficher le questionnaire" @@ -2715,6 +3799,11 @@ msgstr "Affichez et modifiez vos informations de licence." msgid "View credential" msgstr "Afficher les informations d'identification" +#: client/src/lists/JobEvents.js:100 +#: client/src/lists/Streams.js:70 +msgid "View event details" +msgstr "Afficher les détails de l'événement" + #: client/src/setup-menu/setup-menu.partial.html:60 msgid "View information about this version of Ansible Tower." msgstr "Afficher les informations sur cette version d'Ansible Tower." @@ -2727,23 +3816,31 @@ msgstr "Afficher l'inventaire" msgid "View inventory script" msgstr "Afficher le script d'inventaire" -#: client/src/notifications/notificationTemplates.list.js:83 +#: client/src/notifications/notificationTemplates.list.js:82 msgid "View notification" msgstr "Afficher la notification" +#: client/src/lists/Schedules.js:87 +msgid "View schedule" +msgstr "Afficher le calendrier" + #: client/src/lists/Teams.js:72 msgid "View team" msgstr "Afficher l'équipe" -#: client/src/lists/Templates.js:119 +#: client/src/lists/Templates.js:118 msgid "View template" msgstr "Afficher le modèle" -#: client/src/lists/Projects.js:110 +#: client/src/lists/AllJobs.js:94 +msgid "View the job" +msgstr "Afficher la tâche" + +#: client/src/lists/Projects.js:109 msgid "View the project" msgstr "Afficher le projet" -#: client/src/lists/ScheduledJobs.js:74 +#: client/src/lists/ScheduledJobs.js:75 msgid "View the schedule" msgstr "Afficher le calendrier" @@ -2751,10 +3848,20 @@ msgstr "Afficher le calendrier" msgid "View user" msgstr "Afficher l'utilisateur" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:25 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:25 +msgid "View workflow results" +msgstr "Afficher les résultats du workflow" + #: client/src/forms/Workflows.js:22 msgid "WORKFLOW" msgstr "WORKFLOW" +#: client/src/job-detail/job-detail.partial.html:313 +#: client/src/job-detail/job-detail.partial.html:368 +msgid "Waiting..." +msgstr "Attente..." + #: client/src/configuration/auth-form/configuration-auth.controller.js:68 #: client/src/configuration/configuration.controller.js:179 #: client/src/configuration/configuration.controller.js:241 @@ -2774,7 +3881,8 @@ msgstr "" "Bienvenue à Ansible Tower ! Veuillez suivre les étapes ci-dessous pour " "obtenir une licence." -#: client/src/forms/JobTemplates.js:55 client/src/forms/WorkflowMaker.js:104 +#: client/src/forms/JobTemplates.js:55 +#: client/src/forms/WorkflowMaker.js:104 msgid "" "When this template is submitted as a job, setting the type to %s will " "execute the playbook, running tasks on the selected hosts." @@ -2782,7 +3890,8 @@ msgstr "" "Lorsque ce modèle est validé en tant que tâche, le fait de définir le type " "sur %s exécute le playbook en lançant les tâches sur les hôtes sélectionnés." -#: client/src/forms/Workflows.js:187 client/src/shared/form-generator.js:1720 +#: client/src/forms/Workflows.js:188 +#: client/src/shared/form-generator.js:1731 msgid "Workflow Editor" msgstr "Workflow Editor" @@ -2790,10 +3899,27 @@ msgstr "Workflow Editor" msgid "Workflow Job Template" msgstr "Modèle de tâche Workflow" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:103 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:40 +msgid "Workflow Templates" +msgstr "Modèles de workflow" + +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:58 +msgid "" +"You can create a job template here." +msgstr "" +"Vous pouvez créer un modèle de tâche ici." + #: client/src/controllers/Projects.js:508 msgid "You do not have access to view this property" msgstr "Vous n'avez pas d'accès pour afficher cette propriété" +#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:26 +msgid "You do not have permission to add a job template." +msgstr "Vous n'êtes pas autorisé à ajouter un modèle de tâche." + #: client/src/controllers/Projects.js:324 msgid "You do not have permission to add a project." msgstr "Vous n'êtes pas autorisé à ajouter un projet." @@ -2807,29 +3933,29 @@ msgstr "Vous n'êtes pas autorisé à ajouter un utilisateur." #: client/src/configuration/configuration.controller.js:240 #: client/src/configuration/system-form/configuration-system.controller.js:46 msgid "" -"You have unsaved changes. Would you like to proceed without" -" saving?" +"You have unsaved changes. Would you like to proceed without " +"saving?" msgstr "" "Des modifications n'ont pas été enregistrées. Voulez-vous continuer " "sans les enregistrer ?" -#: client/src/shared/form-generator.js:956 +#: client/src/shared/form-generator.js:957 msgid "Your password must be %d characters long." msgstr "Votre mot de passe doit comporter %d caractères." -#: client/src/shared/form-generator.js:961 +#: client/src/shared/form-generator.js:962 msgid "Your password must contain a lowercase letter." msgstr "Votre mot de passe doit contenir une lettre minuscule." -#: client/src/shared/form-generator.js:971 +#: client/src/shared/form-generator.js:972 msgid "Your password must contain a number." msgstr "Votre mot de passe doit contenir un chiffre." -#: client/src/shared/form-generator.js:966 +#: client/src/shared/form-generator.js:967 msgid "Your password must contain an uppercase letter." msgstr "Votre mot de passe doit contenir une lettre majuscule." -#: client/src/shared/form-generator.js:976 +#: client/src/shared/form-generator.js:977 msgid "Your password must contain one of the following characters: %s" msgstr "Votre mot de passe doit contenir l'un des caractères suivants : %s" @@ -2845,11 +3971,20 @@ msgstr "" "Votre session a expiré en raison d'un temps d'inactivité. Veuillez vous " "connecter." -#: client/src/shared/form-generator.js:1222 +#: client/src/shared/form-generator.js:1223 msgid "and" msgstr "et" -#: client/src/forms/Credentials.js:139 client/src/forms/Credentials.js:365 +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:22 +msgid "name" +msgstr "nom" + +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:25 +msgid "organization" +msgstr "organisation" + +#: client/src/forms/Credentials.js:139 +#: client/src/forms/Credentials.js:365 msgid "set in helpers/credentials" msgstr "définir dans helpers/credentials" diff --git a/awx/ui/po/ja.po b/awx/ui/po/ja.po index a6e83809c7..72e9db76fa 100644 --- a/awx/ui/po/ja.po +++ b/awx/ui/po/ja.po @@ -1,26 +1,27 @@ # asasaki , 2017. #zanata +# tfujiwar , 2017. #zanata msgid "" msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2017-01-20 12:03+0000\n" -"Last-Translator: Copied by Zanata \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Project-Id-Version: \n" +"MIME-Version: 1.0\n" +"PO-Revision-Date: 2017-02-06 03:40+0000\n" +"Last-Translator: Copied by Zanata \n" +"Language-Team: Japanese\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.9.6\n" -#: client/src/notifications/notificationTemplates.form.js:372 +#: client/src/notifications/notificationTemplates.form.js:375 msgid "%s or %s" msgstr "%s または %s" #: client/src/controllers/Projects.js:437 #: client/src/controllers/Projects.js:719 msgid "" -"%sNote:%s Mercurial does not support password authentication for SSH. Do not" -" put the username and key in the URL. If using Bitbucket and SSH, do not " +"%sNote:%s Mercurial does not support password authentication for SSH. Do not " +"put the username and key in the URL. If using Bitbucket and SSH, do not " "supply your Bitbucket username." msgstr "" "%s注:%s Mercurial は SSH のパスワード認証をサポートしません。ユーザー名およびキーを URL " @@ -34,8 +35,8 @@ msgid "" "Bitbucket do not support password authentication when using SSH. GIT read " "only protocol (git://) does not use username or password information." msgstr "" -"%s注:%s GitHub または Bitbucket の SSH プロトコルを使用している場合、SSH キーのみを入力し、ユーザー名 (git 以外)" -" を入力しないでください。また、GitHub および Bitbucket は、SSH の使用時のパスワード認証をサポートしません。GIT " +"%s注:%s GitHub または Bitbucket の SSH プロトコルを使用している場合、SSH キーのみを入力し、ユーザー名 (git 以外) " +"を入力しないでください。また、GitHub および Bitbucket は、SSH の使用時のパスワード認証をサポートしません。GIT " "の読み取り専用プロトコル (git://) はユーザー名またはパスワード情報を使用しません。" #: client/src/forms/Credentials.js:288 @@ -46,35 +47,74 @@ msgstr "(%s にデフォルト設定)" msgid "+ ADD" msgstr "+ 追加" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:33 +msgid "A schedule name is required." +msgstr "スケジュール名が必要です。" + #: client/src/controllers/Users.js:185 msgid "A value is required" -msgstr "値が必要" +msgstr "値が必要です" -#: client/src/forms/Credentials.js:449 client/src/forms/Inventories.js:153 -#: client/src/forms/JobTemplates.js:427 client/src/forms/Organizations.js:75 -#: client/src/forms/Projects.js:237 client/src/forms/Teams.js:85 -#: client/src/forms/Workflows.js:127 +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:167 +msgid "A value is required." +msgstr "値が必要です。" + +#: client/src/about/about.route.js:10 +msgid "ABOUT" +msgstr "情報" + +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:16 +msgid "ACTION" +msgstr "アクション" + +#: client/src/activity-stream/activitystream.route.js:27 +msgid "ACTIVITY STREAM" +msgstr "アクティビティーストリーム" + +#: client/src/forms/Credentials.js:450 +#: client/src/forms/JobTemplates.js:430 +#: client/src/forms/Organizations.js:76 +#: client/src/forms/Projects.js:238 +#: client/src/forms/Teams.js:85 +#: client/src/forms/Workflows.js:128 #: client/src/inventory-scripts/inventory-scripts.list.js:45 -#: client/src/lists/Credentials.js:60 client/src/lists/Inventories.js:68 -#: client/src/lists/Projects.js:77 client/src/lists/Teams.js:50 -#: client/src/lists/Templates.js:62 client/src/lists/Users.js:58 -#: client/src/notifications/notificationTemplates.list.js:53 +#: client/src/lists/Credentials.js:60 +#: client/src/lists/Inventories.js:68 +#: client/src/lists/Projects.js:77 +#: client/src/lists/Schedules.js:70 +#: client/src/lists/Teams.js:50 +#: client/src/lists/Templates.js:62 +#: client/src/lists/Users.js:58 +#: client/src/notifications/notificationTemplates.list.js:52 msgid "ADD" msgstr "追加" -#: client/src/notifications/notifications.list.js:68 +#: client/src/notifications/notifications.list.js:66 msgid "ADD NOTIFICATION TEMPLATE" msgstr "通知テンプレートの追加" -#: client/src/forms/Teams.js:157 client/src/forms/Users.js:212 +#: client/src/forms/Teams.js:157 +#: client/src/forms/Users.js:213 msgid "ADD PERMISSIONS" -msgstr "" +msgstr "パーミッションの追加" + +#: client/src/shared/smart-search/smart-search.partial.html:54 +msgid "ADDITIONAL INFORMATION:" +msgstr "追加情報:" + +#: client/src/organizations/linkout/organizations-linkout.route.js:363 +msgid "ADMINS" +msgstr "管理者" + +#: client/src/helpers/ActivityStream.js:19 +msgid "ALL ACTIVITY" +msgstr "すべてのアクティビティー" #: client/src/forms/Credentials.js:199 msgid "API Key" msgstr "API キー" -#: client/src/notifications/notificationTemplates.form.js:248 +#: client/src/notifications/notificationTemplates.form.js:251 msgid "API Service/Integration Key" msgstr "API サービス/統合キー" @@ -90,16 +130,20 @@ msgstr "Tower について" msgid "Access Key" msgstr "アクセスキー" -#: client/src/notifications/notificationTemplates.form.js:226 +#: client/src/notifications/notificationTemplates.form.js:229 msgid "Account SID" msgstr "アカウント SID" -#: client/src/notifications/notificationTemplates.form.js:184 +#: client/src/notifications/notificationTemplates.form.js:187 msgid "Account Token" msgstr "アカウントトークン" +#: client/src/forms/ActivityDetail.js:38 +msgid "Action" +msgstr "アクション" + #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:20 -#: client/src/shared/list-generator/list-generator.factory.js:542 +#: client/src/shared/list-generator/list-generator.factory.js:546 msgid "Actions" msgstr "アクション" @@ -108,13 +152,21 @@ msgstr "アクション" msgid "Activity" msgstr "アクティビティー" +#: client/src/forms/ActivityDetail.js:25 +msgid "Activity Detail" +msgstr "アクティビティーの詳細" + #: client/src/configuration/system-form/configuration-system.controller.js:81 +#: client/src/lists/Streams.js:16 +#: client/src/lists/Streams.js:17 msgid "Activity Stream" msgstr "アクティビティーストリーム" -#: client/src/forms/Inventories.js:104 client/src/forms/Inventories.js:150 -#: client/src/forms/Organizations.js:72 client/src/forms/Teams.js:82 -#: client/src/forms/Workflows.js:124 +#: client/src/forms/Inventories.js:105 +#: client/src/forms/Organizations.js:73 +#: client/src/forms/Teams.js:82 +#: client/src/forms/Workflows.js:125 +#: client/src/organizations/linkout/addUsers/addUsers.partial.html:8 msgid "Add" msgstr "追加" @@ -130,16 +182,21 @@ msgstr "既存ホストの追加" msgid "Add Inventories" msgstr "インベントリーの追加" -#: client/src/notifications/notifications.list.js:63 +#: client/src/notifications/notifications.list.js:61 msgid "Add Notification" msgstr "通知の追加" +#: client/src/shared/stateDefinitions.factory.js:277 +msgid "Add Permissions" +msgstr "パーミッションの追加" + #: client/src/lists/Projects.js:15 msgid "Add Project" msgstr "プロジェクトの追加" -#: client/src/forms/JobTemplates.js:472 client/src/forms/Workflows.js:172 -#: client/src/shared/form-generator.js:1708 +#: client/src/forms/JobTemplates.js:475 +#: client/src/forms/Workflows.js:173 +#: client/src/shared/form-generator.js:1719 msgid "Add Survey" msgstr "Survey の追加" @@ -149,16 +206,24 @@ msgstr "チームの追加" #: client/src/forms/Teams.js:83 msgid "Add User" -msgstr "" +msgstr "ユーザーの追加" #: client/src/lists/Users.js:25 +#: client/src/shared/stateDefinitions.factory.js:342 +#: client/src/shared/stateDefinitions.factory.js:511 msgid "Add Users" msgstr "ユーザーの追加" -#: client/src/forms/Credentials.js:447 client/src/forms/Inventories.js:106 -#: client/src/forms/Inventories.js:151 client/src/forms/JobTemplates.js:425 -#: client/src/forms/Organizations.js:73 client/src/forms/Projects.js:235 -#: client/src/forms/Workflows.js:125 +#: client/src/lists/Schedules.js:68 +msgid "Add a new schedule" +msgstr "新規スケジュールの追加" + +#: client/src/forms/Credentials.js:448 +#: client/src/forms/Inventories.js:107 +#: client/src/forms/JobTemplates.js:428 +#: client/src/forms/Organizations.js:74 +#: client/src/forms/Projects.js:236 +#: client/src/forms/Workflows.js:126 msgid "Add a permission" msgstr "パーミッションの追加" @@ -169,7 +234,7 @@ msgid "" msgstr "" "マシンに対してジョブを起動する際やインベントリーまたはプロジェクトの同期時に使用する Tower のパスワード、SSH キーなどを追加します。" -#: client/src/shared/form-generator.js:1451 +#: client/src/shared/form-generator.js:1462 msgid "Admin" msgstr "管理者" @@ -177,14 +242,24 @@ msgstr "管理者" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:43 #: client/src/dashboard/graphs/dashboard-graphs.partial.html:65 #: client/src/dashboard/graphs/dashboard-graphs.partial.html:74 +#: client/src/job-detail/job-detail.partial.html:197 +#: client/src/job-detail/job-detail.partial.html:256 +#: client/src/job-detail/job-detail.partial.html:340 msgid "All" msgstr "すべて" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:23 +msgid "All Activity" +msgstr "すべてのアクティビティー" + +#: client/src/lists/AllJobs.js:16 #: client/src/portal-mode/portal-mode-jobs.partial.html:7 +#: client/src/portal-mode/portal-mode-layout.partial.html:12 msgid "All Jobs" msgstr "すべてのジョブ" -#: client/src/forms/JobTemplates.js:301 client/src/forms/JobTemplates.js:308 +#: client/src/forms/JobTemplates.js:303 +#: client/src/forms/JobTemplates.js:310 msgid "Allow Provisioning Callbacks" msgstr "プロビジョニングコールバックの許可" @@ -202,6 +277,22 @@ msgid "" "%sRefresh%s button to view the latest status." msgstr "SCM 更新がプロジェクトに対して実行されていないようです: %s。%s更新%s ボタンをクリックして最新のステータスを表示してください。" +#: client/src/controllers/Credentials.js:105 +msgid "Are you sure you want to delete the credential below?" +msgstr "以下の認証情報を削除してもよろしいですか?" + +#: client/src/helpers/Jobs.js:231 +msgid "Are you sure you want to delete the job below?" +msgstr "以下のジョブを削除してもよろしいですか?" + +#: client/src/notifications/notification-templates-list/list.controller.js:184 +msgid "Are you sure you want to delete the notification template below?" +msgstr "以下の通知テンプレートを削除してもよろしいですか?" + +#: client/src/organizations/list/organizations-list.controller.js:166 +msgid "Are you sure you want to delete the organization below?" +msgstr "以下の組織を削除してもよろしいですか?" + #: client/src/controllers/Projects.js:202 msgid "Are you sure you want to delete the project below?" msgstr "以下のプロジェクトを削除してもよろしいですか?" @@ -210,19 +301,30 @@ msgstr "以下のプロジェクトを削除してもよろしいですか?" msgid "Are you sure you want to delete the user below?" msgstr "以下のユーザーを削除してもよろしいですか?" +#: client/src/controllers/Credentials.js:579 #: client/src/controllers/Projects.js:687 msgid "Are you sure you want to remove the %s below from %s?" msgstr "%s から以下の %s を削除してもよろしいですか?" -#: client/src/forms/Credentials.js:233 client/src/forms/Credentials.js:272 -#: client/src/forms/Credentials.js:312 client/src/forms/Credentials.js:398 +#: client/src/forms/EventsViewer.js:57 +msgid "Arguments" +msgstr "引数" + +#: client/src/forms/Credentials.js:233 +#: client/src/forms/Credentials.js:272 +#: client/src/forms/Credentials.js:312 +#: client/src/forms/Credentials.js:398 msgid "Ask at runtime?" msgstr "実行時に確認しますか?" -#: client/src/shared/form-generator.js:1453 +#: client/src/shared/form-generator.js:1464 msgid "Auditor" msgstr "監査者" +#: client/src/configuration/configuration.partial.html:15 +msgid "Authentication" +msgstr "認証" + #: client/src/forms/Credentials.js:73 msgid "" "Authentication for network device access. This can include SSH keys, " @@ -254,6 +356,10 @@ msgstr "パスワードの承認" msgid "Azure AD" msgstr "Azure AD" +#: client/src/shared/directives.js:133 +msgid "BROWSE" +msgstr "参照" + #: client/src/forms/Projects.js:80 msgid "" "Base path used for locating playbooks. Directories found inside this path " @@ -265,7 +371,7 @@ msgstr "" "ディレクトリーのドロップダウンに一覧表示されます。ベースパスと選択された Playbook ディレクトリーは、Playbook " "を見つけるために使用される完全なパスを提供します。" -#: client/src/forms/JobTemplates.js:295 +#: client/src/forms/JobTemplates.js:297 msgid "Become Privilege Escalation" msgstr "Become (権限昇格)" @@ -273,7 +379,41 @@ msgstr "Become (権限昇格)" msgid "Browse" msgstr "参照" -#: client/src/app.js:316 +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:20 +msgid "CHANGES" +msgstr "変更" + +#: client/src/shared/smart-search/smart-search.partial.html:31 +msgid "CLEAR ALL" +msgstr "すべてをクリア" + +#: client/src/inventories/manage/copy-move/copy-move.route.js:29 +#: client/src/inventories/manage/copy-move/copy-move.route.js:65 +msgid "COPY OR MOVE" +msgstr "コピーまたは移動" + +#: client/src/shared/stateDefinitions.factory.js:153 +msgid "CREATE %s" +msgstr "%s の作成" + +#: client/src/inventories/main.js:110 +#: client/src/scheduler/main.js:176 +#: client/src/scheduler/main.js:253 +#: client/src/scheduler/main.js:90 +msgid "CREATE SCHEDULE" +msgstr "スケジュールの作成" + +#: client/src/management-jobs/scheduler/main.js:74 +msgid "CREATE SCHEDULED JOB" +msgstr "スケジュール済みジョブの作成" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:80 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:82 +msgid "CREDENTIAL" +msgstr "認証情報" + +#: client/src/app.js:319 +#: client/src/helpers/ActivityStream.js:29 msgid "CREDENTIALS" msgstr "認証情報" @@ -285,7 +425,8 @@ msgstr "キャッシュタイムアウト" msgid "Cache Timeout%s (seconds)%s" msgstr "キャッシュタイムアウト%s (seconds)%s" -#: client/src/controllers/Projects.js:193 client/src/controllers/Users.js:95 +#: client/src/controllers/Projects.js:193 +#: client/src/controllers/Users.js:95 msgid "Call to %s failed. DELETE returned status:" msgstr "%s の呼び出しに失敗しました。DELETE で返されたステータス:" @@ -302,12 +443,20 @@ msgstr "%s の呼び出しに失敗しました。POST で返されたステー msgid "Call to %s failed. POST status:" msgstr "%s の呼び出しに失敗しました。POST ステータス:" +#: client/src/management-jobs/card/card.controller.js:30 +msgid "Call to %s failed. Return status: %d" +msgstr "%s の呼び出しが失敗しました。返されたステータス: %d" + #: client/src/controllers/Projects.js:266 msgid "Call to get project failed. GET status:" msgstr "プロジェクトを取得するための呼び出しに失敗しました。GET ステータス:" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:171 #: client/src/configuration/configuration.controller.js:449 -#: client/src/shared/form-generator.js:1696 +#: client/src/helpers/Jobs.js:161 +#: client/src/shared/form-generator.js:1707 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:12 +#: client/src/workflow-results/workflow-results.partial.html:42 msgid "Cancel" msgstr "取り消し" @@ -315,26 +464,44 @@ msgstr "取り消し" msgid "Cancel Not Allowed" msgstr "取り消しは許可されていません" -#: client/src/lists/Projects.js:123 +#: client/src/lists/Projects.js:122 msgid "Cancel the SCM update" msgstr "SCM 更新の取り消し" +#: client/src/lists/AllJobs.js:108 +msgid "Cancel the job" +msgstr "ジョブの取り消し" + #: client/src/controllers/Projects.js:82 +#: client/src/helpers/Projects.js:79 msgid "Canceled. Click for details" msgstr "取り消されました。クリックして詳細を確認してください。" +#: client/src/shared/smart-search/smart-search.controller.js:38 +#: client/src/shared/smart-search/smart-search.controller.js:80 +msgid "Cannot search running job" +msgstr "実行中のジョブを検索することはできません" + #: client/src/forms/Projects.js:82 msgid "Change %s under \"Configure Tower\" to change this location." msgstr "この場所を変更するために「Tower の設定」下の %s を変更します。" -#: client/src/shared/form-generator.js:1082 +#: client/src/forms/ActivityDetail.js:43 +msgid "Changes" +msgstr "変更" + +#: client/src/shared/form-generator.js:1083 msgid "Choose a %s" msgstr "%s の選択" +#: client/src/shared/directives.js:134 +msgid "Choose file" +msgstr "ファイルの選択" + #: client/src/license/license.partial.html:97 msgid "" -"Choose your license file, agree to the End User License Agreement, and click" -" submit." +"Choose your license file, agree to the End User License Agreement, and click " +"submit." msgstr "ライセンスファイルを選択し、使用許諾契約書に同意した後に「送信」をクリックします。" #: client/src/forms/Projects.js:151 @@ -355,15 +522,15 @@ msgstr "行をクリックしてこれを選択し、終了したら「終了」 #: client/src/lists/Templates.js:19 msgid "" -"Click on a row to select it, and click Finished when done. Use the %s button" -" to create a new job template." +"Click on a row to select it, and click Finished when done. Use the %s button " +"to create a new job template." msgstr "行をクリックしてこれを選択し、終了したら「終了」をクリックします。%s ボタンをクリックして新規ジョブテンプレートを作成します。" #: client/src/forms/Credentials.js:322 msgid "Client ID" msgstr "クライアント ID" -#: client/src/notifications/notificationTemplates.form.js:259 +#: client/src/notifications/notificationTemplates.form.js:262 msgid "Client Identifier" msgstr "クライアント識別子" @@ -371,25 +538,28 @@ msgstr "クライアント識別子" msgid "Client Secret" msgstr "クライアントシークレット" -#: client/src/shared/form-generator.js:1700 +#: client/src/shared/form-generator.js:1711 msgid "Close" msgstr "閉じる" -#: client/src/forms/JobTemplates.js:166 client/src/forms/JobTemplates.js:178 +#: client/src/forms/JobTemplates.js:168 +#: client/src/forms/JobTemplates.js:180 +#: client/src/job-detail/job-detail.partial.html:124 msgid "Cloud Credential" msgstr "クラウド認証情報" -#: client/src/helpers/Credentials.js:160 client/src/helpers/Credentials.js:296 +#: client/src/helpers/Credentials.js:160 +#: client/src/helpers/Credentials.js:296 msgid "CloudForms URL" -msgstr "" +msgstr "CloudForms URL" -#: client/src/job-results/job-results.controller.js:193 +#: client/src/job-results/job-results.controller.js:205 #: client/src/standard-out/standard-out.controller.js:233 -#: client/src/workflow-results/workflow-results.controller.js:109 +#: client/src/workflow-results/workflow-results.controller.js:131 msgid "Collapse Output" -msgstr "" +msgstr "出力の縮小" -#: client/src/notifications/notificationTemplates.form.js:295 +#: client/src/notifications/notificationTemplates.form.js:298 msgid "Color can be one of %s." msgstr "色を %s のいずれかにすることができます。" @@ -401,6 +571,11 @@ msgstr "完了したジョブ" msgid "Configure Notifications" msgstr "通知の設定" +#: client/src/configuration/configuration.partial.html:10 +#: client/src/setup-menu/setup-menu.partial.html:53 +msgid "Configure Tower" +msgstr "Tower の設定" + #: client/src/forms/Users.js:82 msgid "Confirm Password" msgstr "パスワードの確認" @@ -413,22 +588,24 @@ msgstr "リセットの確認" msgid "Confirm factory reset" msgstr "出荷時の設定へのリセットの確認" -#: client/src/forms/JobTemplates.js:257 client/src/forms/JobTemplates.js:275 -#: client/src/forms/WorkflowMaker.js:141 client/src/forms/WorkflowMaker.js:156 +#: client/src/forms/JobTemplates.js:259 +#: client/src/forms/JobTemplates.js:277 +#: client/src/forms/WorkflowMaker.js:141 +#: client/src/forms/WorkflowMaker.js:156 msgid "" "Consult the Ansible documentation for further details on the usage of tags." msgstr "タグの使用法についての詳細は、Ansible ドキュメントを参照してください。" -#: client/src/forms/JobTemplates.js:243 +#: client/src/forms/JobTemplates.js:245 msgid "" "Control the level of output ansible will produce as the playbook executes." msgstr "Playbook の実行時に Ansible が生成する出力のレベルを制御します。" -#: client/src/lists/Templates.js:100 +#: client/src/lists/Templates.js:99 msgid "Copy" msgstr "コピー" -#: client/src/lists/Templates.js:103 +#: client/src/lists/Templates.js:102 msgid "Copy template" msgstr "テンプレートのコピー" @@ -452,8 +629,8 @@ msgstr "新規カスタムインベントリーの作成" msgid "Create a new inventory" msgstr "新規インベントリーの作成" -#: client/src/notifications/notificationTemplates.list.js:51 -#: client/src/notifications/notifications.list.js:66 +#: client/src/notifications/notificationTemplates.list.js:50 +#: client/src/notifications/notifications.list.js:64 msgid "Create a new notification template" msgstr "新規通知テンプレートの作成" @@ -487,43 +664,80 @@ msgid "" "SMS." msgstr "メール、HipChat、Slack、および SMS での通知を送信するためのテンプレートを作成します。" -#: client/src/forms/JobTemplates.js:156 client/src/forms/WorkflowMaker.js:60 +#: client/src/forms/EventsViewer.js:32 +#: client/src/lists/JobEvents.js:44 +msgid "Created On" +msgstr "作成日時" + +#: client/src/forms/JobTemplates.js:157 +#: client/src/forms/WorkflowMaker.js:60 #: client/src/forms/WorkflowMaker.js:69 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:67 msgid "Credential" msgstr "認証情報" -#: client/src/lists/Credentials.js:18 client/src/lists/Credentials.js:19 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:123 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:57 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:24 +#: client/src/lists/Credentials.js:18 +#: client/src/lists/Credentials.js:19 #: client/src/setup-menu/setup-menu.partial.html:22 msgid "Credentials" msgstr "認証情報" -#: client/src/controllers/Credentials.js:345 +#: client/src/controllers/Credentials.js:349 msgid "" -"Credentials are only shared within an organization. Assign credentials to an" -" organization to delegate credential permissions. The organization cannot be" -" edited after credentials are assigned." +"Credentials are only shared within an organization. Assign credentials to an " +"organization to delegate credential permissions. The organization cannot be " +"edited after credentials are assigned." msgstr "" +"認証情報は組織内でのみ共有されます。認証情報のパーミッションを委任するために認証情報を組織に割り当てます。認証情報の割り当て後に組織を編集することはできません。" -#: client/src/inventory-scripts/inventory-scripts.form.js:50 -#: client/src/inventory-scripts/inventory-scripts.form.js:60 +#: client/src/inventory-scripts/inventory-scripts.form.js:53 +#: client/src/inventory-scripts/inventory-scripts.form.js:63 msgid "Custom Script" msgstr "カスタムスクリプト" -#: client/src/app.js:408 +#: client/src/shared/directives.js:135 +msgid "Custom logo has been uploaded" +msgstr "カスタムロゴがアップロードされました" + +#: client/src/app.js:410 msgid "DASHBOARD" msgstr "ダッシュボード" -#: client/src/controllers/Projects.js:689 client/src/controllers/Users.js:104 +#: client/src/controllers/Credentials.js:107 +#: client/src/controllers/Credentials.js:581 +#: client/src/controllers/Projects.js:689 +#: client/src/controllers/Users.js:104 +#: client/src/notifications/notification-templates-list/list.controller.js:189 +#: client/src/organizations/list/organizations-list.controller.js:168 msgid "DELETE" msgstr "削除" +#: client/src/job-detail/job-detail.partial.html:176 +#: client/src/job-detail/job-detail.partial.html:179 +msgid "DETAILS" +msgstr "詳細" + +#: client/src/controllers/Credentials.js:104 +#: client/src/controllers/Credentials.js:578 #: client/src/controllers/Projects.js:201 -#: client/src/controllers/Projects.js:686 client/src/controllers/Users.js:101 +#: client/src/controllers/Projects.js:686 +#: client/src/controllers/Users.js:101 +#: client/src/helpers/Jobs.js:165 #: client/src/inventory-scripts/inventory-scripts.list.js:74 -#: client/src/lists/Credentials.js:91 client/src/lists/Inventories.js:92 -#: client/src/lists/Teams.js:77 client/src/lists/Templates.js:125 +#: client/src/lists/Credentials.js:91 +#: client/src/lists/Inventories.js:92 +#: client/src/lists/Schedules.js:92 +#: client/src/lists/Teams.js:77 +#: client/src/lists/Templates.js:124 #: client/src/lists/Users.js:87 -#: client/src/notifications/notificationTemplates.list.js:90 +#: client/src/notifications/notification-templates-list/list.controller.js:186 +#: client/src/notifications/notificationTemplates.list.js:89 +#: client/src/organizations/list/organizations-list.controller.js:165 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:13 +#: client/src/workflow-results/workflow-results.partial.html:54 msgid "Delete" msgstr "削除" @@ -539,7 +753,7 @@ msgstr "インベントリーの削除" msgid "Delete inventory script" msgstr "インベントリースクリプトの削除" -#: client/src/notifications/notificationTemplates.list.js:92 +#: client/src/notifications/notificationTemplates.list.js:91 msgid "Delete notification" msgstr "通知の削除" @@ -547,14 +761,19 @@ msgstr "通知の削除" msgid "Delete on Update" msgstr "更新時のデプロイ" +#: client/src/lists/Schedules.js:95 +msgid "Delete schedule" +msgstr "スケジュールの削除" + #: client/src/lists/Teams.js:81 msgid "Delete team" msgstr "チームの削除" -#: client/src/lists/Templates.js:128 +#: client/src/lists/Templates.js:127 msgid "Delete template" msgstr "テンプレートの削除" +#: client/src/lists/AllJobs.js:115 #: client/src/lists/CompletedJobs.js:82 msgid "Delete the job" msgstr "ジョブの削除" @@ -564,11 +783,11 @@ msgid "" "Delete the local repository in its entirety prior to performing an update." msgstr "更新の実行前にローカルリポジトリーを完全に削除します。" -#: client/src/lists/Projects.js:117 +#: client/src/lists/Projects.js:116 msgid "Delete the project" msgstr "プロジェクトの削除" -#: client/src/lists/ScheduledJobs.js:81 +#: client/src/lists/ScheduledJobs.js:82 msgid "Delete the schedule" msgstr "スケジュールの削除" @@ -582,39 +801,44 @@ msgid "" "amount of time required to complete an update." msgstr "リポジトリーのサイズにより、更新の完了までに必要な時間が大幅に長くなる可能性があります。" -#: client/src/forms/Credentials.js:41 client/src/forms/Inventories.js:37 -#: client/src/forms/JobTemplates.js:42 client/src/forms/Organizations.js:33 -#: client/src/forms/Projects.js:38 client/src/forms/Teams.js:34 -#: client/src/forms/Users.js:143 client/src/forms/Users.js:168 +#: client/src/forms/Credentials.js:41 +#: client/src/forms/Inventories.js:37 +#: client/src/forms/JobTemplates.js:42 +#: client/src/forms/Organizations.js:33 +#: client/src/forms/Projects.js:38 +#: client/src/forms/Teams.js:34 +#: client/src/forms/Users.js:143 +#: client/src/forms/Users.js:168 #: client/src/forms/Workflows.js:41 -#: client/src/inventory-scripts/inventory-scripts.form.js:32 +#: client/src/inventory-scripts/inventory-scripts.form.js:35 #: client/src/inventory-scripts/inventory-scripts.list.js:25 #: client/src/lists/Credentials.js:34 -#: client/src/lists/PortalJobTemplates.js:29 client/src/lists/Teams.js:30 +#: client/src/lists/PortalJobTemplates.js:29 +#: client/src/lists/Teams.js:30 #: client/src/lists/Templates.js:36 -#: client/src/notifications/notificationTemplates.form.js:36 +#: client/src/notifications/notificationTemplates.form.js:39 msgid "Description" msgstr "説明" -#: client/src/notifications/notificationTemplates.form.js:138 -#: client/src/notifications/notificationTemplates.form.js:143 -#: client/src/notifications/notificationTemplates.form.js:155 -#: client/src/notifications/notificationTemplates.form.js:160 -#: client/src/notifications/notificationTemplates.form.js:373 +#: client/src/notifications/notificationTemplates.form.js:141 +#: client/src/notifications/notificationTemplates.form.js:146 +#: client/src/notifications/notificationTemplates.form.js:158 +#: client/src/notifications/notificationTemplates.form.js:163 +#: client/src/notifications/notificationTemplates.form.js:376 msgid "Destination Channels" msgstr "送信先チャネル" -#: client/src/notifications/notificationTemplates.form.js:368 +#: client/src/notifications/notificationTemplates.form.js:371 msgid "Destination Channels or Users" msgstr "送信先チャネルまたはユーザー" -#: client/src/notifications/notificationTemplates.form.js:209 -#: client/src/notifications/notificationTemplates.form.js:214 +#: client/src/notifications/notificationTemplates.form.js:212 +#: client/src/notifications/notificationTemplates.form.js:217 msgid "Destination SMS Number" msgstr "送信先 SMS 番号" #: client/src/license/license.partial.html:5 -#: client/src/shared/form-generator.js:1482 +#: client/src/shared/form-generator.js:1493 msgid "Details" msgstr "詳細" @@ -629,52 +853,88 @@ msgstr "変更の破棄" msgid "Dissasociate permission from team" msgstr "チームからパーミッションの関連付けを解除" -#: client/src/forms/Users.js:221 +#: client/src/forms/Users.js:222 msgid "Dissasociate permission from user" msgstr "ユーザーからパーミッションの関連付けを解除" -#: client/src/forms/Credentials.js:385 client/src/helpers/Credentials.js:134 +#: client/src/forms/Credentials.js:385 +#: client/src/helpers/Credentials.js:134 #: client/src/helpers/Credentials.js:270 msgid "Domain Name" msgstr "ドメイン名" -#: client/src/job-results/job-results.controller.js:7 +#: client/src/job-detail/job-detail.partial.html:420 +#: client/src/job-results/job-results.controller.js:8 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:114 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:137 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:102 msgid "Download Output" -msgstr "" +msgstr "出力のダウンロード" -#: client/src/inventory-scripts/inventory-scripts.form.js:58 +#: client/src/inventory-scripts/inventory-scripts.form.js:61 msgid "" "Drag and drop your custom inventory script file here or create one in the " "field to import your custom inventory." msgstr "" "カスタムインベントリーのスクリプトファイルをここにドラッグアンドドロップするか、またはこのフィールドにカスタムインベントリーをインポートするためのファイルを作成します。" +#: client/src/management-jobs/scheduler/main.js:88 +msgid "EDIT SCHEDULED JOB" +msgstr "スケジュール済みジョブの編集" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:46 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:66 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:59 +msgid "ELAPSED" +msgstr "経過時間" + +#: client/src/job-detail/job-detail.partial.html:391 +#: client/src/job-detail/job-detail.partial.html:394 +msgid "EVENT SUMMARY" +msgstr "イベントの概要" + +#: client/src/shared/smart-search/smart-search.partial.html:40 +msgid "EXAMPLES:" +msgstr "例:" + #: client/src/forms/Projects.js:174 msgid "" "Each time a job runs using this project, perform an update to the local " "repository prior to starting the job." msgstr "このプロジェクトでジョブを実行する際は常に、ジョブの開始前にローカルリポジトリーに対して更新を実行します。" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:63 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:62 #: client/src/inventory-scripts/inventory-scripts.list.js:57 -#: client/src/lists/Credentials.js:72 client/src/lists/Inventories.js:78 -#: client/src/lists/Teams.js:60 client/src/lists/Templates.js:108 +#: client/src/lists/Credentials.js:72 +#: client/src/lists/Inventories.js:78 +#: client/src/lists/Schedules.js:77 +#: client/src/lists/Teams.js:60 +#: client/src/lists/Templates.js:107 #: client/src/lists/Users.js:68 -#: client/src/notifications/notificationTemplates.list.js:64 -#: client/src/notifications/notificationTemplates.list.js:73 +#: client/src/notifications/notificationTemplates.list.js:63 +#: client/src/notifications/notificationTemplates.list.js:72 msgid "Edit" msgstr "編集" -#: client/src/forms/JobTemplates.js:479 client/src/forms/Workflows.js:179 -#: client/src/shared/form-generator.js:1712 +#: client/src/configuration/configuration.route.js:30 +msgid "Edit Configuration" +msgstr "設定の編集" + +#: client/src/forms/JobTemplates.js:482 +#: client/src/forms/Workflows.js:180 +#: client/src/shared/form-generator.js:1723 msgid "Edit Survey" msgstr "Survey の編集" +#: client/src/setup-menu/setup-menu.partial.html:54 +msgid "Edit Tower's configuration." +msgstr "Tower の設定の編集。" + #: client/src/lists/Credentials.js:74 msgid "Edit credential" msgstr "認証情報の編集" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:66 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:65 msgid "Edit host" msgstr "ホストの編集" @@ -686,23 +946,31 @@ msgstr "インベントリーの編集" msgid "Edit inventory script" msgstr "インベントリースクリプトの編集" -#: client/src/notifications/notificationTemplates.list.js:75 +#: client/src/notifications/notificationTemplates.list.js:74 msgid "Edit notification" msgstr "通知の編集" +#: client/src/lists/Schedules.js:80 +msgid "Edit schedule" +msgstr "スケジュールの編集" + #: client/src/lists/Teams.js:64 msgid "Edit team" msgstr "チームの編集" -#: client/src/lists/Templates.js:110 +#: client/src/lists/Templates.js:109 msgid "Edit template" msgstr "テンプレートの編集" -#: client/src/lists/Projects.js:104 +#: client/src/workflow-results/workflow-results.partial.html:109 +msgid "Edit the User" +msgstr "ユーザーの編集" + +#: client/src/lists/Projects.js:103 msgid "Edit the project" msgstr "プロジェクトの編集" -#: client/src/lists/ScheduledJobs.js:67 +#: client/src/lists/ScheduledJobs.js:68 msgid "Edit the schedule" msgstr "スケジュールの編集" @@ -712,23 +980,33 @@ msgstr "ユーザーの編集" #: client/src/controllers/Projects.js:236 msgid "" -"Either you do not have access or the SCM update process completed. Click the" -" %sRefresh%s button to view the latest status." +"Either you do not have access or the SCM update process completed. Click the " +"%sRefresh%s button to view the latest status." msgstr "アクセスがないか、または SCM 更新プロセスが完了しました。%s更新%s ボタンをクリックして最新のステータスを表示します。" -#: client/src/forms/Credentials.js:192 client/src/forms/Users.js:42 +#: client/src/forms/EventsViewer.js:81 +#: client/src/forms/LogViewerStatus.js:50 +#: client/src/job-detail/job-detail.partial.html:210 +#: client/src/job-detail/job-detail.partial.html:268 +#: client/src/job-detail/job-detail.partial.html:86 +msgid "Elapsed" +msgstr "経過時間" + +#: client/src/forms/Credentials.js:192 +#: client/src/forms/Users.js:42 msgid "Email" msgstr "メール" -#: client/src/forms/JobTemplates.js:314 client/src/forms/JobTemplates.js:319 +#: client/src/forms/JobTemplates.js:316 +#: client/src/forms/JobTemplates.js:321 msgid "Enable Concurrent Jobs" -msgstr "" +msgstr "同時実行ジョブの有効化" -#: client/src/forms/JobTemplates.js:290 +#: client/src/forms/JobTemplates.js:292 msgid "Enable Privilege Escalation" msgstr "権限昇格の有効化" -#: client/src/forms/JobTemplates.js:305 +#: client/src/forms/JobTemplates.js:307 msgid "" "Enables creation of a provisioning callback URL. Using the URL a host can " "contact Tower and request a configuration update using this job template." @@ -740,6 +1018,10 @@ msgstr "" msgid "Encrypted credentials are not supported." msgstr "暗号化された認証情報はサポートされていません。" +#: client/src/forms/EventsViewer.js:77 +msgid "End" +msgstr "終了" + #: client/src/license/license.partial.html:108 msgid "End User License Agreement" msgstr "使用許諾契約書" @@ -751,19 +1033,22 @@ msgid "" msgstr "" "JSON または YAML 構文のいずれかを使用してインベントリー変数を入力します。ラジオボタンを使用して 2 つの間の切り替えを行います。" -#: client/src/helpers/Credentials.js:161 client/src/helpers/Credentials.js:297 +#: client/src/helpers/Credentials.js:161 +#: client/src/helpers/Credentials.js:297 msgid "" "Enter the URL for the virtual machine which %scorresponds to your CloudForm " "instance. %sFor example, %s" -msgstr "" +msgstr "CloudForms インスタンスに対応する %s仮想マシンの URL を入力します (%s例: %s)。" -#: client/src/helpers/Credentials.js:151 client/src/helpers/Credentials.js:287 +#: client/src/helpers/Credentials.js:151 +#: client/src/helpers/Credentials.js:287 msgid "" "Enter the URL which corresponds to your %sRed Hat Satellite 6 server. %sFor " "example, %s" -msgstr "" +msgstr "Red Hat Satellite 6 Server に対応する %sURL を入力します (%s例: %s)。" -#: client/src/helpers/Credentials.js:129 client/src/helpers/Credentials.js:265 +#: client/src/helpers/Credentials.js:129 +#: client/src/helpers/Credentials.js:265 msgid "" "Enter the hostname or IP address which corresponds to your VMware vCenter." msgstr "VMware vCenter に対応するホスト名または IP アドレスを入力します。" @@ -781,14 +1066,45 @@ msgstr "VMware vCenter に対応するホスト名または IP アドレスを #: client/src/controllers/Projects.js:403 #: client/src/controllers/Projects.js:597 #: client/src/controllers/Projects.js:663 -#: client/src/controllers/Projects.js:681 client/src/controllers/Users.js:182 -#: client/src/controllers/Users.js:271 client/src/controllers/Users.js:339 -#: client/src/controllers/Users.js:94 client/src/helpers/Credentials.js:418 +#: client/src/controllers/Projects.js:681 +#: client/src/controllers/Users.js:182 +#: client/src/controllers/Users.js:271 +#: client/src/controllers/Users.js:339 +#: client/src/controllers/Users.js:94 +#: client/src/helpers/Credentials.js:418 #: client/src/helpers/Credentials.js:434 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:168 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:187 #: client/src/login/loginModal/thirdPartySignOn/thirdPartySignOn.service.js:119 +#: client/src/management-jobs/card/card.controller.js:150 +#: client/src/management-jobs/card/card.controller.js:240 +#: client/src/management-jobs/card/card.controller.js:29 msgid "Error!" msgstr "エラー!" +#: client/src/forms/EventsViewer.js:21 +#: client/src/forms/EventsViewer.js:25 +#: client/src/forms/EventsViewer.js:29 +#: client/src/forms/EventsViewer.js:33 +#: client/src/forms/EventsViewer.js:37 +#: client/src/forms/EventsViewer.js:42 +#: client/src/forms/EventsViewer.js:46 +#: client/src/forms/EventsViewer.js:50 +#: client/src/forms/EventsViewer.js:54 +#: client/src/forms/EventsViewer.js:58 +#: client/src/lists/JobEvents.js:65 +#: client/src/lists/Streams.js:43 +msgid "Event" +msgstr "イベント" + +#: client/src/widgets/Stream.js:216 +msgid "Event summary not available" +msgstr "イベントの概要はありません" + +#: client/src/lists/JobEvents.js:31 +msgid "Events" +msgstr "イベント" + #: client/src/controllers/Projects.js:421 #: client/src/controllers/Projects.js:704 msgid "Example URLs for GIT SCM include:" @@ -804,21 +1120,29 @@ msgstr "Mercurial SCM のサンプル URL には以下が含まれます:" msgid "Example URLs for Subversion SCM include:" msgstr "Subversion SCM のサンプル URL には以下が含まれます:" -#: client/src/job-results/job-results.controller.js:10 -#: client/src/job-results/job-results.controller.js:195 +#: client/src/job-results/job-results.controller.js:11 +#: client/src/job-results/job-results.controller.js:207 #: client/src/standard-out/standard-out.controller.js:235 #: client/src/standard-out/standard-out.controller.js:25 -#: client/src/workflow-results/workflow-results.controller.js:111 -#: client/src/workflow-results/workflow-results.controller.js:70 +#: client/src/workflow-results/workflow-results.controller.js:133 +#: client/src/workflow-results/workflow-results.controller.js:92 msgid "Expand Output" -msgstr "" +msgstr "出力の展開" #: client/src/license/license.partial.html:39 msgid "Expires On" msgstr "有効期限" -#: client/src/forms/JobTemplates.js:365 client/src/forms/JobTemplates.js:377 -#: client/src/forms/Workflows.js:72 client/src/forms/Workflows.js:84 +#: client/src/job-detail/job-detail.partial.html:31 +msgid "Explanation" +msgstr "説明" + +#: client/src/forms/JobTemplates.js:367 +#: client/src/forms/JobTemplates.js:379 +#: client/src/forms/Workflows.js:72 +#: client/src/forms/Workflows.js:84 +#: client/src/job-detail/job-detail.partial.html:163 +#: client/src/partials/logviewer.html:8 msgid "Extra Variables" msgstr "追加変数" @@ -826,7 +1150,20 @@ msgstr "追加変数" msgid "FAILED" msgstr "失敗" +#: client/src/shared/smart-search/smart-search.partial.html:48 +msgid "FIELDS:" +msgstr "フィールド:" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:39 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:59 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:52 +msgid "FINISHED" +msgstr "完了" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:80 +#: client/src/job-detail/job-detail.partial.html:198 +#: client/src/job-detail/job-detail.partial.html:257 +#: client/src/job-detail/job-detail.partial.html:341 msgid "Failed" msgstr "失敗" @@ -850,11 +1187,16 @@ msgstr "新規プロジェクトを作成できませんでした。POST で返 msgid "Failed to get third-party login types. Returned status:" msgstr "サードパーティーのログインタイプを取得できませんでした。返されたステータス:" +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:188 +msgid "Failed to retrieve job template extra variables." +msgstr "ジョブテンプレートの追加変数を取得できませんでした。" + #: client/src/controllers/Projects.js:598 msgid "Failed to retrieve project: %s. GET status:" msgstr "プロジェクトを取得できませんでした: %s. GET ステータス:" -#: client/src/controllers/Users.js:272 client/src/controllers/Users.js:340 +#: client/src/controllers/Users.js:272 +#: client/src/controllers/Users.js:340 msgid "Failed to retrieve user: %s. GET status:" msgstr "ユーザーを取得できませんでした: %s. GET ステータス:" @@ -874,47 +1216,90 @@ msgstr "認証情報を更新できませんでした。PUT ステータス:" msgid "Failed to update project: %s. PUT status:" msgstr "プロジェクトを更新できませんでした: %s. PUT ステータス:" -#: client/src/notifications/notifications.list.js:49 +#: client/src/job-submission/job-submission-factories/launchjob.factory.js:169 +#: client/src/management-jobs/card/card.controller.js:151 +#: client/src/management-jobs/card/card.controller.js:241 +msgid "Failed updating job %s with variables. POST returned: %d" +msgstr "変数でジョブ %s を更新できませんでした。POST で返されたステータス: %d" + +#: client/src/helpers/Projects.js:73 +msgid "Failed. Click for details" +msgstr "失敗しました。クリックして詳細を確認してください。" + +#: client/src/notifications/notifications.list.js:48 msgid "Failure" msgstr "失敗" -#: client/src/lists/CompletedJobs.js:56 client/src/lists/PortalJobs.js:37 +#: client/src/lists/Schedules.js:50 +msgid "Final Run" +msgstr "初回実行" + +#: client/src/forms/LogViewerStatus.js:44 +#: client/src/job-detail/job-detail.partial.html:74 +#: client/src/lists/AllJobs.js:68 +#: client/src/lists/CompletedJobs.js:56 +#: client/src/lists/PortalJobs.js:37 msgid "Finished" msgstr "終了日時" -#: client/src/forms/Users.js:28 client/src/lists/Users.js:41 +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:27 +#: client/src/forms/Users.js:28 +#: client/src/lists/Users.js:41 msgid "First Name" msgstr "名" -#: client/src/helpers/Credentials.js:143 client/src/helpers/Credentials.js:279 +#: client/src/lists/Schedules.js:40 +msgid "First Run" +msgstr "最終実行" + +#: client/src/shared/smart-search/smart-search.partial.html:54 +msgid "" +"For additional information on advanced search search syntax please see the " +"Ansible Tower documentation." +msgstr "高度な検索の検索構文についての詳細は、Ansible Tower ドキュメントを参照してください。" + +#: client/src/helpers/Credentials.js:143 +#: client/src/helpers/Credentials.js:279 msgid "For example, %s" msgstr "例: %s" -#: client/src/notifications/notificationTemplates.form.js:142 -#: client/src/notifications/notificationTemplates.form.js:159 -#: client/src/notifications/notificationTemplates.form.js:213 -#: client/src/notifications/notificationTemplates.form.js:334 -#: client/src/notifications/notificationTemplates.form.js:372 -#: client/src/notifications/notificationTemplates.form.js:98 +#: client/src/notifications/notificationTemplates.form.js:101 +#: client/src/notifications/notificationTemplates.form.js:145 +#: client/src/notifications/notificationTemplates.form.js:162 +#: client/src/notifications/notificationTemplates.form.js:216 +#: client/src/notifications/notificationTemplates.form.js:337 +#: client/src/notifications/notificationTemplates.form.js:375 msgid "For example:" msgstr "例:" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:53 msgid "" "For hosts that are part of an external inventory, this flag cannot be " "changed. It will be set by the inventory sync process." msgstr "外部インベントリーの一部であるホストの場合、このフラグを変更できません。これはインベントリー同期プロセスで設定されます。" -#: client/src/forms/JobTemplates.js:225 client/src/forms/WorkflowMaker.js:125 +#: client/src/forms/JobTemplates.js:227 +#: client/src/forms/WorkflowMaker.js:125 msgid "" -"For more information and examples see %sthe Patterns topic at " -"docs.ansible.com%s." +"For more information and examples see %sthe Patterns topic at docs.ansible." +"com%s." msgstr "詳細情報およびサンプルについては、docs.ansible.com の %sパターンのトピックを参照してください%s。" -#: client/src/forms/JobTemplates.js:201 client/src/forms/JobTemplates.js:214 +#: client/src/forms/JobTemplates.js:203 +#: client/src/forms/JobTemplates.js:216 +#: client/src/job-detail/job-detail.partial.html:138 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:87 msgid "Forks" msgstr "フォーク" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:172 +msgid "Frequency Details" +msgstr "頻度の詳細" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:89 +msgid "GROUP" +msgstr "グループ" + #: client/src/configuration/auth-form/configuration-auth.controller.js:102 msgid "GitHub" msgstr "GitHub" @@ -925,15 +1310,16 @@ msgstr "GitHub 組織" #: client/src/configuration/auth-form/configuration-auth.controller.js:104 msgid "GitHub Team" -msgstr "" +msgstr "GitHub チーム" #: client/src/configuration/auth-form/configuration-auth.controller.js:105 msgid "Google OAuth2" msgstr "Google OAuth2" -#: client/src/forms/Teams.js:155 client/src/forms/Users.js:210 +#: client/src/forms/Teams.js:155 +#: client/src/forms/Users.js:211 msgid "Grant Permission" -msgstr "" +msgstr "パーミッションの付与" #: client/src/setup-menu/setup-menu.partial.html:5 msgid "" @@ -941,28 +1327,51 @@ msgid "" "company." msgstr "会社内の複数の部署のパーミッションを管理するためにすべてのコンテンツを分類します。" -#: client/src/notifications/notificationTemplates.form.js:324 +#: client/src/dashboard/hosts/main.js:55 +#: client/src/helpers/ActivityStream.js:53 +msgid "HOSTS" +msgstr "ホスト" + +#: client/src/notifications/notificationTemplates.form.js:327 msgid "HTTP Headers" msgstr "HTTP ヘッダー" +#: client/src/bread-crumb/bread-crumb.directive.js:111 +msgid "Hide Activity Stream" +msgstr "アクティビティーストリームの非表示" + #: client/src/forms/Credentials.js:140 -#: client/src/notifications/notificationTemplates.form.js:72 +#: client/src/forms/EventsViewer.js:20 +#: client/src/lists/JobEvents.js:73 +#: client/src/notifications/notificationTemplates.form.js:75 msgid "Host" msgstr "ホスト" -#: client/src/helpers/Credentials.js:132 client/src/helpers/Credentials.js:268 +#: client/src/helpers/Credentials.js:132 +#: client/src/helpers/Credentials.js:268 msgid "Host (Authentication URL)" msgstr "ホスト (認証 URL)" -#: client/src/forms/JobTemplates.js:339 client/src/forms/JobTemplates.js:348 +#: client/src/forms/JobTemplates.js:341 +#: client/src/forms/JobTemplates.js:350 msgid "Host Config Key" msgstr "ホスト設定キー" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:55 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 msgid "Host Enabled" msgstr "有効なホスト" +#: client/src/job-detail/job-detail.partial.html:269 +msgid "Host Status" +msgstr "ホストのステータス" + +#: client/src/lists/JobEvents.js:37 +msgid "Host Summary" +msgstr "ホストの概要" + +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:25 #: client/src/dashboard/counts/dashboard-counts.directive.js:39 +#: client/src/job-detail/job-detail.partial.html:349 msgid "Hosts" msgstr "ホスト" @@ -982,16 +1391,36 @@ msgstr "使用されたホスト" msgid "I agree to the End User License Agreement" msgstr "使用許諾契約書に同意します。" +#: client/src/forms/EventsViewer.js:28 +msgid "ID" +msgstr "ID" + +#: client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html:12 +msgid "INITIATED BY" +msgstr "開始:" + +#: client/src/helpers/ActivityStream.js:26 +#: client/src/inventories/main.js:291 #: client/src/main-menu/main-menu.partial.html:104 #: client/src/main-menu/main-menu.partial.html:27 +#: client/src/organizations/linkout/organizations-linkout.route.js:178 msgid "INVENTORIES" msgstr "インベントリー" -#: client/src/notifications/notificationTemplates.form.js:357 +#: client/src/inventory-scripts/inventory-scripts.form.js:23 +msgid "INVENTORY SCRIPT" +msgstr "インベントリースクリプト" + +#: client/src/helpers/ActivityStream.js:47 +#: client/src/inventory-scripts/main.js:66 +msgid "INVENTORY SCRIPTS" +msgstr "インベントリースクリプト" + +#: client/src/notifications/notificationTemplates.form.js:360 msgid "IRC Nick" msgstr "IRC ニック" -#: client/src/notifications/notificationTemplates.form.js:346 +#: client/src/notifications/notificationTemplates.form.js:349 msgid "IRC Server Address" msgstr "IRC サーバーアドレス" @@ -1003,15 +1432,29 @@ msgstr "IRC サーバーパスワード" msgid "IRC Server Port" msgstr "IRC サーバーポート" -#: client/src/forms/JobTemplates.js:293 +#: client/src/shared/paginate/paginate.partial.html:43 msgid "" -"If enabled, run this playbook as an administrator. This is the equivalent of" -" passing the %s option to the %s command." +"ITEMS \n" +" {{dataRange}}\n" +" of {{dataCount()}}" +msgstr "" +"項目 \n" +" {{dataRange}}\n" +"/{{dataCount()}}" + +#: client/src/login/authenticationServices/timer.factory.js:157 +msgid "Idle Session" +msgstr "アイドル状態のセッション" + +#: client/src/forms/JobTemplates.js:295 +msgid "" +"If enabled, run this playbook as an administrator. This is the equivalent of " +"passing the %s option to the %s command." msgstr "有効な場合、この Playbook を管理者として実行します。これは %s オプションを %s コマンドに渡すことに相当します。" -#: client/src/forms/JobTemplates.js:317 +#: client/src/forms/JobTemplates.js:319 msgid "If enabled, simultaneous runs of this job template will be allowed." -msgstr "" +msgstr "有効にされている場合、このジョブテンプレートの同時実行が許可されます。" #: client/src/forms/Credentials.js:54 msgid "" @@ -1027,11 +1470,16 @@ msgid "" "If you are ready to upgrade, please contact us by clicking the button below" msgstr "アップグレードの準備ができましたら、以下のボタンをクリックしてお問い合わせください。" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:54 +#: client/src/dashboard/hosts/dashboard-hosts.list.js:53 msgid "" "Indicates if a host is available and should be included in running jobs." msgstr "ホストが利用可能かどうか、また実行中のジョブに組み込む必要があるかどうかを示します。" +#: client/src/forms/ActivityDetail.js:33 +#: client/src/lists/Streams.js:36 +msgid "Initiated by" +msgstr "開始:" + #: client/src/forms/JobTemplates.js:58 msgid "" "Instead, %s will check playbook syntax, test environment setup and report " @@ -1051,17 +1499,26 @@ msgstr "無効なファイル形式です。有効な JSON をアップロード msgid "Invalid username and/or password. Please try again." msgstr "無効なユーザー名および/またはパスワードです。やり直してください。" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:116 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:51 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:26 #: client/src/dashboard/counts/dashboard-counts.directive.js:50 -#: client/src/lists/Inventories.js:16 client/src/lists/Inventories.js:17 +#: client/src/lists/Inventories.js:16 +#: client/src/lists/Inventories.js:17 msgid "Inventories" msgstr "インベントリー" #: client/src/dashboard/hosts/dashboard-hosts.list.js:41 -#: client/src/forms/JobTemplates.js:73 client/src/forms/JobTemplates.js:87 -#: client/src/forms/WorkflowMaker.js:79 client/src/forms/WorkflowMaker.js:89 +#: client/src/forms/JobTemplates.js:73 +#: client/src/forms/JobTemplates.js:87 +#: client/src/forms/WorkflowMaker.js:79 +#: client/src/forms/WorkflowMaker.js:89 +#: client/src/job-detail/job-detail.partial.html:98 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:58 msgid "Inventory" msgstr "インベントリー" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:27 #: client/src/inventory-scripts/inventory-scripts.list.js:12 #: client/src/setup-menu/setup-menu.partial.html:34 msgid "Inventory Scripts" @@ -1079,6 +1536,11 @@ msgstr "インベントリーの同期の失敗" msgid "Inventory Variables" msgstr "インベントリー変数" +#: client/src/forms/EventsViewer.js:49 +#: client/src/job-detail/job-detail.partial.html:350 +msgid "Item" +msgstr "項目" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:4 msgid "JOB STATUS" msgstr "ジョブステータス" @@ -1087,15 +1549,27 @@ msgstr "ジョブステータス" msgid "JOB TEMPLATE" msgstr "ジョブテンプレート" -#: client/src/app.js:428 +#: client/src/organizations/linkout/organizations-linkout.route.js:287 +msgid "JOB TEMPLATES" +msgstr "ジョブテンプレート" + +#: client/src/app.js:430 #: client/src/dashboard/graphs/job-status/job-status-graph.directive.js:113 +#: client/src/helpers/ActivityStream.js:44 #: client/src/main-menu/main-menu.partial.html:122 #: client/src/main-menu/main-menu.partial.html:43 msgid "JOBS" msgstr "ジョブ" -#: client/src/forms/JobTemplates.js:250 client/src/forms/JobTemplates.js:258 -#: client/src/forms/WorkflowMaker.js:134 client/src/forms/WorkflowMaker.js:142 +#: client/src/lists/JobEvents.js:15 +msgid "Job Events" +msgstr "ジョブイベント" + +#: client/src/forms/JobTemplates.js:252 +#: client/src/forms/JobTemplates.js:260 +#: client/src/forms/WorkflowMaker.js:134 +#: client/src/forms/WorkflowMaker.js:142 +#: client/src/job-detail/job-detail.partial.html:153 msgid "Job Tags" msgstr "ジョブタグ" @@ -1103,41 +1577,72 @@ msgstr "ジョブタグ" msgid "Job Template" msgstr "ジョブテンプレート" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:35 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:97 #: client/src/lists/PortalJobTemplates.js:15 #: client/src/lists/PortalJobTemplates.js:16 msgid "Job Templates" msgstr "ジョブテンプレート" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:32 -#: client/src/forms/JobTemplates.js:48 client/src/forms/JobTemplates.js:62 -#: client/src/forms/WorkflowMaker.js:110 client/src/forms/WorkflowMaker.js:99 +#: client/src/forms/JobTemplates.js:48 +#: client/src/forms/JobTemplates.js:62 +#: client/src/forms/WorkflowMaker.js:110 +#: client/src/forms/WorkflowMaker.js:99 +#: client/src/job-detail/job-detail.partial.html:69 msgid "Job Type" msgstr "ジョブタイプ" -#: client/src/lists/PortalJobs.js:15 client/src/lists/PortalJobs.js:19 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:28 +#: client/src/configuration/configuration.partial.html:16 +#: client/src/lists/PortalJobs.js:15 +#: client/src/lists/PortalJobs.js:19 #: client/src/partials/jobs.html:7 msgid "Jobs" msgstr "ジョブ" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:90 +#: client/src/shared/smart-search/smart-search.partial.html:14 +msgid "Key" +msgstr "キー" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:73 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:66 +msgid "LAUNCH TYPE" +msgstr "起動タイプ" + #: client/src/configuration/auth-form/configuration-auth.controller.js:106 msgid "LDAP" msgstr "LDAP" +#: client/src/license/license.route.js:18 +msgid "LICENSE" +msgstr "ライセンス" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:45 +msgid "LICENSE ERROR" +msgstr "ライセンスエラー" + #: client/src/main-menu/main-menu.partial.html:83 msgid "LOG OUT" msgstr "ログアウト" -#: client/src/notifications/notificationTemplates.form.js:270 +#: client/src/notifications/notificationTemplates.form.js:273 msgid "Label to be shown with notification" msgstr "通知と共に表示されるラベル" -#: client/src/forms/JobTemplates.js:353 client/src/forms/JobTemplates.js:358 -#: client/src/forms/Workflows.js:60 client/src/forms/Workflows.js:65 +#: client/src/forms/JobTemplates.js:355 +#: client/src/forms/JobTemplates.js:360 +#: client/src/forms/Workflows.js:60 +#: client/src/forms/Workflows.js:65 +#: client/src/lists/AllJobs.js:76 #: client/src/lists/Templates.js:47 msgid "Labels" msgstr "ラベル" -#: client/src/forms/Users.js:35 client/src/lists/Users.js:45 +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:31 +#: client/src/forms/Users.js:35 +#: client/src/lists/Users.js:45 msgid "Last Name" msgstr "姓" @@ -1145,8 +1650,9 @@ msgstr "姓" msgid "Last Updated" msgstr "最終更新日時" -#: client/src/lists/PortalJobTemplates.js:39 client/src/lists/Templates.js:84 -#: client/src/shared/form-generator.js:1704 +#: client/src/lists/PortalJobTemplates.js:39 +#: client/src/lists/Templates.js:84 +#: client/src/shared/form-generator.js:1715 msgid "Launch" msgstr "起動" @@ -1154,11 +1660,25 @@ msgstr "起動" msgid "Launch Management Job" msgstr "管理ジョブの起動" +#: client/src/forms/LogViewerStatus.js:55 +msgid "Launch Type" +msgstr "起動タイプ" + +#: client/src/job-detail/job-detail.partial.html:79 +#: client/src/job-detail/job-detail.partial.html:91 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:76 +msgid "Launched By" +msgstr "起動:" + #: client/src/license/license.controller.js:42 #: client/src/license/license.partial.html:8 msgid "License" msgstr "ライセンス" +#: client/src/forms/LogViewerStatus.js:33 +msgid "License Error" +msgstr "ライセンスエラー" + #: client/src/license/license.partial.html:102 msgid "License File" msgstr "ライセンスファイル" @@ -1175,29 +1695,39 @@ msgstr "ライセンス管理" msgid "License Type" msgstr "ライセンスタイプ" -#: client/src/forms/JobTemplates.js:220 client/src/forms/JobTemplates.js:227 -#: client/src/forms/WorkflowMaker.js:120 client/src/forms/WorkflowMaker.js:127 +#: client/src/forms/JobTemplates.js:222 +#: client/src/forms/JobTemplates.js:229 +#: client/src/forms/WorkflowMaker.js:120 +#: client/src/forms/WorkflowMaker.js:127 +#: client/src/job-detail/job-detail.partial.html:143 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:92 msgid "Limit" msgstr "制限" -#: client/src/shared/socket/socket.service.js:170 +#: client/src/shared/socket/socket.service.js:168 msgid "Live events: attempting to connect to the Tower server." msgstr "ライブイベント: Tower サーバーへの接続を試行しています。" -#: client/src/shared/socket/socket.service.js:174 +#: client/src/shared/socket/socket.service.js:172 msgid "" "Live events: connected. Pages containing job status information will " "automatically update in real-time." msgstr "ライブイベント: 接続されています。ジョブステータス情報を含むページは自動的にリアルタイムで更新されます。" -#: client/src/shared/socket/socket.service.js:178 +#: client/src/shared/socket/socket.service.js:176 msgid "Live events: error connecting to the Tower server." msgstr "ライブイベント: Tower サーバーへの接続時にエラーが発生しました。" -#: client/src/shared/form-generator.js:1977 +#: client/src/job-detail/job-detail.partial.html:316 +#: client/src/job-detail/job-detail.partial.html:371 +#: client/src/shared/form-generator.js:1991 msgid "Loading..." msgstr "ロード中..." +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:133 +msgid "Local Time Zone" +msgstr "ローカルタイムゾーン" + #: client/src/main-menu/main-menu.partial.html:188 msgid "Log Out" msgstr "ログアウト" @@ -1210,11 +1740,16 @@ msgstr "ロギング" msgid "MANAGEMENT JOBS" msgstr "管理ジョブ" +#: client/src/portal-mode/portal-mode.route.js:12 +msgid "MY VIEW" +msgstr "マイビュー" + #: client/src/forms/Credentials.js:68 msgid "Machine" msgstr "マシン" -#: client/src/forms/JobTemplates.js:138 +#: client/src/forms/JobTemplates.js:139 +#: client/src/job-detail/job-detail.partial.html:117 msgid "Machine Credential" msgstr "マシンの認証情報" @@ -1224,7 +1759,8 @@ msgid "" "deletion, and system tracking info." msgstr "古いジョブ履歴、アクティビティーストリーム、削除用にマークされたデータ、およびシステムトラッキング情報のクリーンアップを管理します。" -#: client/src/helpers/Credentials.js:112 client/src/helpers/Credentials.js:248 +#: client/src/helpers/Credentials.js:112 +#: client/src/helpers/Credentials.js:248 msgid "Management Certificate" msgstr "管理証明書" @@ -1246,11 +1782,29 @@ msgstr "手動プロジェクトに SCM 更新は不要です" msgid "Maximum per-user sessions reached. Please sign in." msgstr "ユーザーあたりの最大セッション数に達しました。サインインしてください。" +#: client/src/forms/EventsViewer.js:65 +#: client/src/job-detail/job-detail.partial.html:351 +msgid "Message" +msgstr "メッセージ" + #: client/src/configuration/system-form/configuration-system.controller.js:80 msgid "Misc. System" msgstr "その他のシステム" +#: client/src/helpers/Projects.js:76 +msgid "Missing. Click for details" +msgstr "見つかリません。クリックして詳細を確認してください。" + +#: client/src/forms/EventsViewer.js:53 +msgid "Module" +msgstr "モジュール" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:53 +msgid "Module Args" +msgstr "モジュールの引数" + #: client/src/portal-mode/portal-mode-jobs.partial.html:4 +#: client/src/portal-mode/portal-mode-layout.partial.html:10 msgid "My Jobs" msgstr "マイジョブ" @@ -1258,28 +1812,65 @@ msgstr "マイジョブ" msgid "My View" msgstr "マイビュー" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:19 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:19 +msgid "NAME" +msgstr "名前" + #: client/src/dashboard/hosts/dashboard-hosts.list.js:18 msgid "NO HOSTS FOUND" msgstr "ホストが見つかりませんでした" +#: client/src/login/loginModal/loginModal.partial.html:89 +msgid "NOTICE" +msgstr "通知" + +#: client/src/notifications/notificationTemplates.form.js:21 +msgid "NOTIFICATION TEMPLATE" +msgstr "通知テンプレート" + +#: client/src/helpers/ActivityStream.js:38 +msgid "NOTIFICATION TEMPLATES" +msgstr "通知テンプレート" + +#: client/src/management-jobs/notifications/notification.route.js:46 +#: client/src/notifications/main.js:43 +#: client/src/notifications/main.js:88 +msgid "NOTIFICATIONS" +msgstr "通知" + #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:14 #: client/src/dashboard/lists/jobs/jobs-list.partial.html:13 -#: client/src/forms/Credentials.js:34 client/src/forms/Inventories.js:29 -#: client/src/forms/JobTemplates.js:35 client/src/forms/Organizations.js:26 -#: client/src/forms/Projects.js:31 client/src/forms/Teams.js:124 -#: client/src/forms/Teams.js:27 client/src/forms/Users.js:140 -#: client/src/forms/Users.js:165 client/src/forms/Users.js:190 +#: client/src/forms/Credentials.js:34 +#: client/src/forms/Inventories.js:29 +#: client/src/forms/JobTemplates.js:35 +#: client/src/forms/LogViewerStatus.js:23 +#: client/src/forms/Organizations.js:26 +#: client/src/forms/Projects.js:31 +#: client/src/forms/Teams.js:124 +#: client/src/forms/Teams.js:27 +#: client/src/forms/Users.js:140 +#: client/src/forms/Users.js:165 +#: client/src/forms/Users.js:191 #: client/src/forms/Workflows.js:34 -#: client/src/inventory-scripts/inventory-scripts.form.js:25 +#: client/src/inventory-scripts/inventory-scripts.form.js:28 #: client/src/inventory-scripts/inventory-scripts.list.js:20 -#: client/src/lists/CompletedJobs.js:43 client/src/lists/Credentials.js:29 +#: client/src/lists/AllJobs.js:45 +#: client/src/lists/CompletedJobs.js:43 +#: client/src/lists/Credentials.js:29 #: client/src/lists/Inventories.js:46 -#: client/src/lists/PortalJobTemplates.js:24 client/src/lists/PortalJobs.js:32 -#: client/src/lists/Projects.js:38 client/src/lists/ScheduledJobs.js:32 -#: client/src/lists/Teams.js:25 client/src/lists/Templates.js:26 -#: client/src/notifications/notificationTemplates.form.js:29 -#: client/src/notifications/notificationTemplates.list.js:33 +#: client/src/lists/PortalJobTemplates.js:24 +#: client/src/lists/PortalJobs.js:32 +#: client/src/lists/Projects.js:38 +#: client/src/lists/ScheduledJobs.js:33 +#: client/src/lists/Schedules.js:35 +#: client/src/lists/Teams.js:25 +#: client/src/lists/Templates.js:26 +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:21 +#: client/src/notifications/notificationTemplates.form.js:32 +#: client/src/notifications/notificationTemplates.list.js:32 #: client/src/notifications/notifications.list.js:26 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:19 msgid "Name" msgstr "名前" @@ -1287,14 +1878,16 @@ msgstr "名前" msgid "Network" msgstr "ネットワーク" -#: client/src/forms/JobTemplates.js:184 client/src/forms/JobTemplates.js:195 +#: client/src/forms/JobTemplates.js:186 +#: client/src/forms/JobTemplates.js:197 +#: client/src/job-detail/job-detail.partial.html:131 msgid "Network Credential" msgstr "ネットワークの認証情報" -#: client/src/forms/JobTemplates.js:194 +#: client/src/forms/JobTemplates.js:196 msgid "" -"Network credentials are used by Ansible networking modules to connect to and" -" manage networking devices." +"Network credentials are used by Ansible networking modules to connect to and " +"manage networking devices." msgstr "" "ネットワーク認証情報は、ネットワークデバイスへの接続およびその管理を実行するために Ansible ネットワークモジュールによって使用されます。" @@ -1338,7 +1931,8 @@ msgstr "新規ワークフロージョブテンプレート" msgid "New user successfully created!" msgstr "新規ユーザーが正常に作成されました!" -#: client/src/lists/ScheduledJobs.js:51 +#: client/src/lists/ScheduledJobs.js:52 +#: client/src/lists/Schedules.js:45 msgid "Next Run" msgstr "次回の実行日時" @@ -1350,10 +1944,22 @@ msgstr "認証情報が作成されていません" msgid "No SCM Configuration" msgstr "SCM 設定がありません" +#: client/src/helpers/Projects.js:58 +msgid "No SCM updates have run for this project" +msgstr "このプロジェクトで実行された SCM 更新はありません" + +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:18 +msgid "No Teams exist" +msgstr "チームが存在しません" + #: client/src/controllers/Projects.js:152 msgid "No Updates Available" msgstr "利用可能な更新がありません" +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:24 +msgid "No Users exist" +msgstr "ユーザーが存在しません" + #: client/src/lists/CompletedJobs.js:22 msgid "No completed jobs" msgstr "完了したジョブがありません" @@ -1362,18 +1968,43 @@ msgstr "完了したジョブがありません" msgid "No file selected." msgstr "ファイルが選択されていません。" +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:56 +msgid "No job templates were recently used." +msgstr "最近使用されたジョブテンプレートはありません。" + #: client/src/lists/AllJobs.js:20 msgid "No jobs have yet run." -msgstr "" +msgstr "実行されたジョブがありません。" #: client/src/dashboard/lists/jobs/jobs-list.partial.html:46 msgid "No jobs were recently run." msgstr "最近実行されたジョブがありません。" -#: client/src/forms/Teams.js:121 client/src/forms/Users.js:187 +#: client/src/job-detail/job-detail.partial.html:374 +msgid "No matching host events" +msgstr "一致するホストイベントがありません" + +#: client/src/job-detail/job-detail.partial.html:307 +msgid "No matching hosts." +msgstr "一致するホストがありません。" + +#: client/src/job-detail/job-detail.partial.html:319 +msgid "No matching tasks" +msgstr "一致するタスクがありません" + +#: client/src/forms/Teams.js:121 +#: client/src/forms/Users.js:188 msgid "No permissions have been granted" msgstr "パーミッションが付与されていません" +#: client/src/notifications/notification-templates-list/list.controller.js:88 +msgid "No recent notifications." +msgstr "最新の通知はありません。" + +#: client/src/shared/form-generator.js:1885 +msgid "No records matched your search." +msgstr "検索に一致するレコードはありません" + #: client/src/lists/ScheduledJobs.js:18 msgid "No schedules exist" msgstr "スケジュールがありません" @@ -1386,24 +2017,30 @@ msgstr "標準ユーザー" msgid "Not configured for SCM" msgstr "SCM 用に設定されていません" -#: client/src/notifications/notificationTemplates.form.js:293 +#: client/src/notifications/notificationTemplates.form.js:296 msgid "Notification Color" msgstr "通知の色" +#: client/src/notifications/notification-templates-list/list.controller.js:115 +msgid "Notification Failed." +msgstr "通知に失敗しました。" + +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:29 #: client/src/notifications/notificationTemplates.list.js:14 msgid "Notification Templates" msgstr "通知テンプレート" +#: client/src/management-jobs/notifications/notification.route.js:21 #: client/src/notifications/notifications.list.js:17 #: client/src/setup-menu/setup-menu.partial.html:41 msgid "Notifications" msgstr "通知" -#: client/src/notifications/notificationTemplates.form.js:306 +#: client/src/notifications/notificationTemplates.form.js:309 msgid "Notify Channel" msgstr "通知チャネル" -#: client/src/notifications/notificationTemplates.form.js:198 +#: client/src/notifications/notificationTemplates.form.js:201 msgid "Number associated with the \"Messaging Service\" in Twilio." msgstr "Twilio の \"メッセージングサービス\" に関連付けられた数字。 " @@ -1415,10 +2052,20 @@ msgstr "オフ" msgid "ON" msgstr "オン" +#: client/src/helpers/ActivityStream.js:41 #: client/src/organizations/list/organizations-list.partial.html:6 +#: client/src/organizations/main.js:52 msgid "ORGANIZATIONS" msgstr "組織" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:112 +msgid "OVERWRITE" +msgstr "上書き" + +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:119 +msgid "OVERWRITE VARS" +msgstr "変数の上書き" + #: client/src/forms/WorkflowMaker.js:45 msgid "On Failure" msgstr "失敗した場合 " @@ -1435,7 +2082,8 @@ msgstr "" "OpenStack ドメインは管理上の境界を定義します。これは Keystone v3 認証 URL " "にのみ必要です。共通するシナリオには以下が含まれます:" -#: client/src/forms/JobTemplates.js:360 client/src/forms/Workflows.js:67 +#: client/src/forms/JobTemplates.js:362 +#: client/src/forms/Workflows.js:67 msgid "" "Optional labels that describe this job template, such as 'dev' or 'test'. " "Labels can be used to group and filter job templates and completed jobs in " @@ -1444,22 +2092,30 @@ msgstr "" "「dev」または「test」などのこのジョブテンプレートを説明するオプションラベルです。ラベルを使用し、Tower " "のディスプレイでジョブテンプレートおよび完了したジョブの分類およびフィルターを実行できます。" -#: client/src/forms/JobTemplates.js:286 +#: client/src/forms/JobTemplates.js:288 +#: client/src/notifications/notificationTemplates.form.js:395 +#: client/src/partials/logviewer.html:7 msgid "Options" msgstr "オプション" -#: client/src/forms/Credentials.js:48 client/src/forms/Credentials.js:55 -#: client/src/forms/Inventories.js:42 client/src/forms/Projects.js:43 -#: client/src/forms/Projects.js:49 client/src/forms/Teams.js:39 -#: client/src/forms/Users.js:59 client/src/forms/Workflows.js:47 +#: client/src/forms/Credentials.js:48 +#: client/src/forms/Credentials.js:55 +#: client/src/forms/Inventories.js:42 +#: client/src/forms/Projects.js:43 +#: client/src/forms/Projects.js:49 +#: client/src/forms/Teams.js:39 +#: client/src/forms/Users.js:59 +#: client/src/forms/Workflows.js:47 #: client/src/forms/Workflows.js:53 -#: client/src/inventory-scripts/inventory-scripts.form.js:37 +#: client/src/inventory-scripts/inventory-scripts.form.js:40 #: client/src/inventory-scripts/inventory-scripts.list.js:30 -#: client/src/lists/Inventories.js:52 client/src/lists/Teams.js:35 -#: client/src/notifications/notificationTemplates.form.js:41 +#: client/src/lists/Inventories.js:52 +#: client/src/lists/Teams.js:35 +#: client/src/notifications/notificationTemplates.form.js:44 msgid "Organization" msgstr "組織" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:30 #: client/src/forms/Users.js:130 #: client/src/setup-menu/setup-menu.partial.html:4 msgid "Organizations" @@ -1478,7 +2134,7 @@ msgid "PASSWORD" msgstr "パスワード" #: client/src/organizations/list/organizations-list.partial.html:45 -#: client/src/shared/form-generator.js:1880 +#: client/src/shared/form-generator.js:1891 #: client/src/shared/list-generator/list-generator.factory.js:246 msgid "PLEASE ADD ITEMS TO THIS LIST" msgstr "項目をこの一覧に追加してください" @@ -1487,16 +2143,34 @@ msgstr "項目をこの一覧に追加してください" msgid "PORTAL MODE" msgstr "ポータルモード" +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:73 +msgid "PROJECT" +msgstr "プロジェクト" + +#: client/src/app.js:295 +#: client/src/helpers/ActivityStream.js:23 #: client/src/main-menu/main-menu.partial.html:19 #: client/src/main-menu/main-menu.partial.html:95 +#: client/src/organizations/linkout/organizations-linkout.route.js:229 msgid "PROJECTS" msgstr "プロジェクト" -#: client/src/notifications/notificationTemplates.form.js:237 +#: client/src/shared/paginate/paginate.partial.html:33 +msgid "" +"Page\n" +" {{current()}} of\n" +" {{last()}}" +msgstr "" +"ページ\n" +"{{current()}}/\n" +" {{last()}}" + +#: client/src/notifications/notificationTemplates.form.js:240 msgid "Pagerduty subdomain" msgstr "Pagerduty サブドメイン" -#: client/src/forms/JobTemplates.js:371 client/src/forms/Workflows.js:78 +#: client/src/forms/JobTemplates.js:373 +#: client/src/forms/Workflows.js:78 msgid "" "Pass extra command line variables to the playbook. This is the %s or %s " "command line parameter for %s. Provide key/value pairs using either YAML or " @@ -1505,13 +2179,20 @@ msgstr "" "追加のコマンドライン変数を Playbook に渡します。これは、%s の %s または %s コマンドラインパラメーターです。YAML または " "JSON のいずれかを使用してキーと値のペアを指定します。" -#: client/src/forms/Credentials.js:227 client/src/forms/Users.js:70 -#: client/src/helpers/Credentials.js:120 client/src/helpers/Credentials.js:128 -#: client/src/helpers/Credentials.js:148 client/src/helpers/Credentials.js:158 -#: client/src/helpers/Credentials.js:168 client/src/helpers/Credentials.js:231 -#: client/src/helpers/Credentials.js:256 client/src/helpers/Credentials.js:264 -#: client/src/helpers/Credentials.js:284 client/src/helpers/Credentials.js:294 -#: client/src/helpers/Credentials.js:304 client/src/helpers/Credentials.js:45 +#: client/src/forms/Credentials.js:227 +#: client/src/forms/Users.js:70 +#: client/src/helpers/Credentials.js:120 +#: client/src/helpers/Credentials.js:128 +#: client/src/helpers/Credentials.js:148 +#: client/src/helpers/Credentials.js:158 +#: client/src/helpers/Credentials.js:168 +#: client/src/helpers/Credentials.js:231 +#: client/src/helpers/Credentials.js:256 +#: client/src/helpers/Credentials.js:264 +#: client/src/helpers/Credentials.js:284 +#: client/src/helpers/Credentials.js:294 +#: client/src/helpers/Credentials.js:304 +#: client/src/helpers/Credentials.js:45 #: client/src/helpers/Credentials.js:95 #: client/src/notifications/shared/type-change.service.js:28 msgid "Password" @@ -1534,13 +2215,15 @@ msgstr "過去 1 ヵ月" msgid "Past Week" msgstr "過去 1 週間" -#: client/src/helpers/Credentials.js:103 client/src/helpers/Credentials.js:239 +#: client/src/helpers/Credentials.js:103 +#: client/src/helpers/Credentials.js:239 msgid "" -"Paste the contents of the PEM file associated with the service account " -"email." +"Paste the contents of the PEM file associated with the service account email." +"" msgstr "サービスアカウントメールに関連付けられた PEM ファイルの内容を貼り付けます。" -#: client/src/helpers/Credentials.js:115 client/src/helpers/Credentials.js:251 +#: client/src/helpers/Credentials.js:115 +#: client/src/helpers/Credentials.js:251 msgid "" "Paste the contents of the PEM file that corresponds to the certificate you " "uploaded in the Microsoft Azure console." @@ -1558,18 +2241,30 @@ msgstr "SSH 秘密鍵ファイルの内容を貼り付けます。%s または msgid "Period" msgstr "期間" -#: client/src/controllers/Projects.js:324 client/src/controllers/Users.js:141 +#: client/src/controllers/Projects.js:324 +#: client/src/controllers/Users.js:141 +#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:26 msgid "Permission Error" msgstr "パーミッションのエラー" -#: client/src/forms/Credentials.js:439 client/src/forms/Inventories.js:142 -#: client/src/forms/JobTemplates.js:416 client/src/forms/Organizations.js:64 -#: client/src/forms/Projects.js:227 client/src/forms/Teams.js:117 -#: client/src/forms/Users.js:183 client/src/forms/Workflows.js:116 +#: client/src/forms/Credentials.js:440 +#: client/src/forms/Inventories.js:96 +#: client/src/forms/JobTemplates.js:419 +#: client/src/forms/Organizations.js:65 +#: client/src/forms/Projects.js:228 +#: client/src/forms/Teams.js:117 +#: client/src/forms/Users.js:184 +#: client/src/forms/Workflows.js:117 msgid "Permissions" msgstr "パーミッション" -#: client/src/forms/JobTemplates.js:121 client/src/forms/JobTemplates.js:132 +#: client/src/forms/EventsViewer.js:40 +msgid "Play" +msgstr "プレイ" + +#: client/src/forms/JobTemplates.js:122 +#: client/src/forms/JobTemplates.js:133 +#: client/src/job-detail/job-detail.partial.html:112 msgid "Playbook" msgstr "Playbook" @@ -1581,9 +2276,21 @@ msgstr "Playbook ディレクトリー" msgid "Playbook Run" msgstr "Playbook 実行" +#: client/src/job-detail/job-detail.partial.html:208 +msgid "Plays" +msgstr "プレイ" + #: client/src/forms/Users.js:124 msgid "Please add user to an Organization." -msgstr "" +msgstr "ユーザーを組織に追加してください。" + +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:89 +msgid "Please assign roles to the selected resources" +msgstr "ロールを選択したリソースに割り当ててください。" + +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:62 +msgid "Please assign roles to the selected users/teams" +msgstr "ロールを選択したユーザー/チームに割り当ててください。" #: client/src/license/license.partial.html:84 msgid "" @@ -1591,22 +2298,22 @@ msgid "" "license key." msgstr "以下のボタンをクリックし、Ansible の web サイトに移動して Tower ライセンスキーを取得します。" -#: client/src/shared/form-generator.js:835 -#: client/src/shared/form-generator.js:949 +#: client/src/shared/form-generator.js:836 +#: client/src/shared/form-generator.js:950 msgid "" "Please enter a URL that begins with ssh, http or https. The URL may not " "contain the '@' character." msgstr "ssh、http または https で始まる URL を入力します。URL には「@」文字を含めることはできません。" -#: client/src/shared/form-generator.js:1187 +#: client/src/shared/form-generator.js:1188 msgid "Please enter a number greater than %d and less than %d." msgstr "%d より大きく、%d より小さい数値を入力してください。" -#: client/src/shared/form-generator.js:1189 +#: client/src/shared/form-generator.js:1190 msgid "Please enter a number greater than %d." msgstr "%d より大きい数値を入力してください。" -#: client/src/shared/form-generator.js:1181 +#: client/src/shared/form-generator.js:1182 msgid "Please enter a number." msgstr "数値を入力してください。" @@ -1618,14 +2325,14 @@ msgstr "パスワードを入力してください。" msgid "Please enter a username." msgstr "ユーザー名を入力してください。" -#: client/src/shared/form-generator.js:825 -#: client/src/shared/form-generator.js:939 +#: client/src/shared/form-generator.js:826 +#: client/src/shared/form-generator.js:940 msgid "Please enter a valid email address." msgstr "有効なメールアドレスを入力してください。" -#: client/src/shared/form-generator.js:1041 -#: client/src/shared/form-generator.js:820 -#: client/src/shared/form-generator.js:934 +#: client/src/shared/form-generator.js:1042 +#: client/src/shared/form-generator.js:821 +#: client/src/shared/form-generator.js:935 msgid "Please enter a value." msgstr "値を入力してください。" @@ -1641,14 +2348,18 @@ msgstr "保存してから通知を追加します。" msgid "Please save before adding users" msgstr "保存してからユーザーを追加します。" -#: client/src/forms/Inventories.js:138 client/src/forms/Inventories.js:91 -#: client/src/forms/JobTemplates.js:409 client/src/forms/Organizations.js:57 -#: client/src/forms/Projects.js:219 client/src/forms/Teams.js:113 -#: client/src/forms/Workflows.js:109 +#: client/src/controllers/Credentials.js:161 +#: client/src/forms/Inventories.js:92 +#: client/src/forms/JobTemplates.js:412 +#: client/src/forms/Organizations.js:58 +#: client/src/forms/Projects.js:220 +#: client/src/forms/Teams.js:113 +#: client/src/forms/Workflows.js:110 msgid "Please save before assigning permissions" msgstr "保存してからパーミッションを割り当てます。" -#: client/src/forms/Users.js:122 client/src/forms/Users.js:179 +#: client/src/forms/Users.js:122 +#: client/src/forms/Users.js:180 msgid "Please save before assigning to organizations" msgstr "保存してから組織に割り当てます。" @@ -1656,31 +2367,43 @@ msgstr "保存してから組織に割り当てます。" msgid "Please save before assigning to teams" msgstr "保存してからチームに割り当てます。" -#: client/src/forms/Workflows.js:185 +#: client/src/forms/Workflows.js:186 msgid "Please save before defining the workflow graph" msgstr "保存してからワークフローグラフを定義します。" +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:26 +msgid "Please select Users / Teams from the lists below." +msgstr "以下の一覧からユーザー/チームを選択してください。" + +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:29 +msgid "Please select Users from the list below." +msgstr "以下の一覧からユーザーを選択してください。" + #: client/src/forms/WorkflowMaker.js:65 msgid "Please select a Credential." msgstr "認証情報を選択してください。" -#: client/src/forms/JobTemplates.js:152 +#: client/src/forms/JobTemplates.js:153 msgid "" "Please select a Machine Credential or check the Prompt on launch option." msgstr "マシン認証情報を選択するか、または「起動プロンプト」オプションにチェックを付けます。" -#: client/src/shared/form-generator.js:1222 +#: client/src/shared/form-generator.js:1223 msgid "Please select a number between" msgstr "Please select a number between" -#: client/src/shared/form-generator.js:1218 +#: client/src/shared/form-generator.js:1219 msgid "Please select a number." msgstr "数値を選択してください。" -#: client/src/shared/form-generator.js:1109 -#: client/src/shared/form-generator.js:1178 -#: client/src/shared/form-generator.js:1297 -#: client/src/shared/form-generator.js:1404 +#: client/src/job-detail/job-detail.partial.html:245 +msgid "Please select a task below to view its associated hosts" +msgstr "関連付けられたホストを表示するために以下のタスクを選択してください" + +#: client/src/shared/form-generator.js:1110 +#: client/src/shared/form-generator.js:1179 +#: client/src/shared/form-generator.js:1299 +#: client/src/shared/form-generator.js:1406 msgid "Please select a value." msgstr "値を選択してください。" @@ -1692,15 +2415,20 @@ msgstr "インベントリーを選択するか、または「起動プロンプ msgid "Please select an Inventory." msgstr "インベントリーを選択してください。" -#: client/src/shared/form-generator.js:1215 +#: client/src/shared/form-generator.js:1216 msgid "Please select at least one value." msgstr "1 つ以上の値を選択してください。" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:29 +msgid "Please select resources from the lists below." +msgstr "以下の一覧からリソースを選択してください。" + #: client/src/notifications/shared/type-change.service.js:27 msgid "Port" msgstr "ポート" -#: client/src/forms/Credentials.js:258 client/src/helpers/Credentials.js:36 +#: client/src/forms/Credentials.js:258 +#: client/src/helpers/Credentials.js:36 #: client/src/helpers/Credentials.js:60 msgid "Private Key" msgstr "秘密鍵" @@ -1709,28 +2437,36 @@ msgstr "秘密鍵" msgid "Private Key Passphrase" msgstr "秘密鍵のパスフレーズ" -#: client/src/forms/Credentials.js:280 client/src/forms/Credentials.js:284 +#: client/src/forms/Credentials.js:280 +#: client/src/forms/Credentials.js:284 msgid "Privilege Escalation" msgstr "権限昇格" -#: client/src/helpers/Credentials.js:227 client/src/helpers/Credentials.js:91 +#: client/src/helpers/Credentials.js:227 +#: client/src/helpers/Credentials.js:91 msgid "Privilege Escalation Password" msgstr "権限昇格のパスワード" -#: client/src/helpers/Credentials.js:226 client/src/helpers/Credentials.js:90 +#: client/src/helpers/Credentials.js:226 +#: client/src/helpers/Credentials.js:90 msgid "Privilege Escalation Username" msgstr "権限昇格のユーザー名" -#: client/src/forms/JobTemplates.js:115 client/src/forms/JobTemplates.js:98 -#: client/src/helpers/Credentials.js:104 client/src/helpers/Credentials.js:240 +#: client/src/forms/JobTemplates.js:116 +#: client/src/forms/JobTemplates.js:99 +#: client/src/helpers/Credentials.js:104 +#: client/src/helpers/Credentials.js:240 +#: client/src/job-detail/job-detail.partial.html:105 msgid "Project" msgstr "プロジェクト" -#: client/src/helpers/Credentials.js:133 client/src/helpers/Credentials.js:269 +#: client/src/helpers/Credentials.js:133 +#: client/src/helpers/Credentials.js:269 msgid "Project (Tenant Name)" msgstr "プロジェクト (テナント名)" -#: client/src/forms/Projects.js:75 client/src/forms/Projects.js:83 +#: client/src/forms/Projects.js:75 +#: client/src/forms/Projects.js:83 msgid "Project Base Path" msgstr "プロジェクトのベースパス" @@ -1750,24 +2486,34 @@ msgstr "プロジェクトの同期の失敗" msgid "Project lookup failed. GET returned:" msgstr "プロジェクトの検索に失敗しました。GET で以下が返されました:" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:109 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:46 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:31 #: client/src/dashboard/counts/dashboard-counts.directive.js:61 -#: client/src/lists/Projects.js:16 client/src/lists/Projects.js:17 +#: client/src/lists/Projects.js:16 +#: client/src/lists/Projects.js:17 msgid "Projects" msgstr "プロジェクト" -#: client/src/forms/JobTemplates.js:161 client/src/forms/JobTemplates.js:232 -#: client/src/forms/JobTemplates.js:263 client/src/forms/JobTemplates.js:281 -#: client/src/forms/JobTemplates.js:382 client/src/forms/JobTemplates.js:68 -#: client/src/forms/JobTemplates.js:93 +#: client/src/forms/JobTemplates.js:162 +#: client/src/forms/JobTemplates.js:234 +#: client/src/forms/JobTemplates.js:265 +#: client/src/forms/JobTemplates.js:283 +#: client/src/forms/JobTemplates.js:384 +#: client/src/forms/JobTemplates.js:68 +#: client/src/forms/JobTemplates.js:94 msgid "Prompt on launch" msgstr "起動プロンプト" -#: client/src/forms/JobTemplates.js:255 client/src/forms/JobTemplates.js:273 -#: client/src/forms/WorkflowMaker.js:139 client/src/forms/WorkflowMaker.js:154 +#: client/src/forms/JobTemplates.js:257 +#: client/src/forms/JobTemplates.js:275 +#: client/src/forms/WorkflowMaker.js:139 +#: client/src/forms/WorkflowMaker.js:154 msgid "Provide a comma separated list of tags." msgstr "カンマ区切りのタグの一覧を指定してください。" -#: client/src/forms/JobTemplates.js:223 client/src/forms/WorkflowMaker.js:123 +#: client/src/forms/JobTemplates.js:225 +#: client/src/forms/WorkflowMaker.js:123 msgid "" "Provide a host pattern to further constrain the list of hosts that will be " "managed or affected by the playbook. Multiple patterns can be separated by " @@ -1776,10 +2522,15 @@ msgstr "" "Playbook によって管理されるか、または影響されるホストの一覧をさらに制限するためのホストのパターンを指定してください。複数のパターンは %s " "%s または %s で区切ることができます。" -#: client/src/forms/JobTemplates.js:326 client/src/forms/JobTemplates.js:334 +#: client/src/forms/JobTemplates.js:328 +#: client/src/forms/JobTemplates.js:336 msgid "Provisioning Callback URL" msgstr "プロビジョニングコールバック URL" +#: client/src/helpers/Projects.js:63 +msgid "Queued. Click for details" +msgstr "キューに入れられました。クリックして詳細を確認してください。" + #: client/src/configuration/auth-form/configuration-auth.controller.js:107 msgid "RADIUS" msgstr "RADIUS" @@ -1792,40 +2543,86 @@ msgstr "最近のジョブ実行" msgid "RECENTLY RUN JOBS" msgstr "最近実行されたジョブ" -#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:4 #: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:52 msgid "RECENTLY USED JOB TEMPLATES" msgstr "最近使用されたジョブテンプレート" -#: client/src/lists/Projects.js:70 client/src/partials/jobs.html:15 +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:4 +msgid "RECENTLY USED TEMPLATES" +msgstr "最近使用されたテンプレート" + +#: client/src/lists/JobEvents.js:89 +#: client/src/lists/Projects.js:70 +#: client/src/lists/Schedules.js:63 +#: client/src/lists/Streams.js:57 +#: client/src/partials/jobs.html:15 #: client/src/portal-mode/portal-mode-jobs.partial.html:12 msgid "REFRESH" msgstr "更新" -#: client/src/forms/JobTemplates.js:100 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:105 +msgid "REGIONS" +msgstr "リージョン" + +#: client/src/shared/smart-search/smart-search.partial.html:51 +msgid "RELATED FIELDS:" +msgstr "関連フィールド:" + +#: client/src/shared/directives.js:136 +msgid "REMOVE" +msgstr "削除" + +#: client/src/forms/JobTemplates.js:101 msgid "RESET" msgstr "リセット" -#: client/src/helpers/Credentials.js:235 client/src/helpers/Credentials.js:99 +#: client/src/job-detail/job-detail.partial.html:11 +#: client/src/job-detail/job-detail.partial.html:14 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:7 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:7 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:7 +msgid "RESULTS" +msgstr "結果" + +#: client/src/helpers/Credentials.js:235 +#: client/src/helpers/Credentials.js:99 msgid "RSA Private Key" msgstr "RSA 秘密鍵" -#: client/src/notifications/notificationTemplates.form.js:94 -#: client/src/notifications/notificationTemplates.form.js:99 +#: client/src/inventories/manage/adhoc/adhoc.route.js:26 +msgid "RUN COMMAND" +msgstr "コマンドの実行" + +#: client/src/workflow-results/workflow-results.partial.html:140 +msgid "Read only view of extra variables added to the workflow." +msgstr "追加変数の読み取り専用ビューがワークフローに追加されました。" + +#: client/src/notifications/notificationTemplates.list.js:26 +msgid "Recent Notifications" +msgstr "最近の通知" + +#: client/src/notifications/notificationTemplates.form.js:102 +#: client/src/notifications/notificationTemplates.form.js:97 msgid "Recipient List" msgstr "受信者リスト" #: client/src/bread-crumb/bread-crumb.partial.html:6 #: client/src/lists/Projects.js:66 +#: client/src/lists/Schedules.js:59 +#: client/src/lists/Streams.js:54 msgid "Refresh the page" msgstr "ページの更新" +#: client/src/lists/AllJobs.js:101 #: client/src/lists/CompletedJobs.js:75 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:11 +#: client/src/workflow-results/workflow-results.partial.html:29 msgid "Relaunch using the same parameters" msgstr "同一パラメーターによる起動" #: client/src/access/add-rbac-user-team/rbac-selected-list.directive.js:37 -#: client/src/forms/Teams.js:142 client/src/forms/Users.js:218 +#: client/src/forms/Teams.js:142 +#: client/src/forms/Users.js:219 msgid "Remove" msgstr "削除" @@ -1833,10 +2630,33 @@ msgstr "削除" msgid "Remove any local modifications prior to performing an update." msgstr "更新の実行前にローカルの変更を削除します。" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:149 +msgid "Repeat frequency" +msgstr "繰り返しの頻度" + #: client/src/license/license.partial.html:89 msgid "Request License" msgstr "ライセンスの要求" +#: client/src/shared/form-generator.js:681 +msgid "Reset" +msgstr "リセット" + +#: client/src/forms/EventsViewer.js:62 +#: client/src/forms/EventsViewer.js:66 +#: client/src/forms/EventsViewer.js:69 +#: client/src/forms/EventsViewer.js:70 +msgid "Results" +msgstr "結果" + +#: client/src/job-detail/job-detail.partial.html:52 +msgid "Results Traceback" +msgstr "結果のトレースバック" + +#: client/src/forms/EventsViewer.js:61 +msgid "Return Code" +msgstr "リターンコード" + #: client/src/configuration/auth-form/sub-forms/auth-azure.form.js:46 #: client/src/configuration/auth-form/sub-forms/auth-github-org.form.js:50 #: client/src/configuration/auth-form/sub-forms/auth-github-team.form.js:50 @@ -1845,13 +2665,13 @@ msgstr "ライセンスの要求" #: client/src/configuration/auth-form/sub-forms/auth-ldap.form.js:88 #: client/src/configuration/auth-form/sub-forms/auth-radius.form.js:33 #: client/src/configuration/auth-form/sub-forms/auth-saml.form.js:82 -#: client/src/configuration/jobs-form/configuration-jobs.form.js:67 +#: client/src/configuration/jobs-form/configuration-jobs.form.js:63 #: client/src/configuration/system-form/sub-forms/system-activity-stream.form.js:25 #: client/src/configuration/system-form/sub-forms/system-logging.form.js:52 #: client/src/configuration/system-form/sub-forms/system-misc.form.js:29 #: client/src/configuration/ui-form/configuration-ui.form.js:35 msgid "Revert all to default" -msgstr "" +msgstr "すべてをデフォルトに戻す" #: client/src/lists/Projects.js:49 msgid "Revision" @@ -1861,17 +2681,39 @@ msgstr "リビジョン" msgid "Revision #" msgstr "リビジョン #" -#: client/src/forms/Credentials.js:461 client/src/forms/Inventories.js:120 -#: client/src/forms/Inventories.js:166 client/src/forms/Organizations.js:88 -#: client/src/forms/Projects.js:249 client/src/forms/Teams.js:135 -#: client/src/forms/Teams.js:98 client/src/forms/Users.js:201 +#: client/src/forms/Credentials.js:462 +#: client/src/forms/EventsViewer.js:36 +#: client/src/forms/Inventories.js:121 +#: client/src/forms/Organizations.js:89 +#: client/src/forms/Projects.js:250 +#: client/src/forms/Teams.js:135 +#: client/src/forms/Teams.js:98 +#: client/src/forms/Users.js:202 +#: client/src/forms/Workflows.js:141 msgid "Role" msgstr "ロール" +#: client/src/helpers/Projects.js:67 +msgid "Running! Click for details" +msgstr "実行中です! クリックして詳細を確認してください。" + #: client/src/configuration/auth-form/configuration-auth.controller.js:108 msgid "SAML" msgstr "SAML" +#: client/src/scheduler/main.js:293 +msgid "SCHEDULED" +msgstr "スケジュール済み" + +#: client/src/helpers/ActivityStream.js:50 +#: client/src/inventories/main.js:59 +#: client/src/management-jobs/scheduler/main.js:26 +#: client/src/scheduler/main.js:122 +#: client/src/scheduler/main.js:205 +#: client/src/scheduler/main.js:36 +msgid "SCHEDULES" +msgstr "スケジュール" + #: client/src/controllers/Projects.js:697 msgid "SCM Branch" msgstr "SCM ブランチ" @@ -1888,7 +2730,8 @@ msgstr "SCM 認証情報" msgid "SCM Delete" msgstr "SCM 削除" -#: client/src/helpers/Credentials.js:230 client/src/helpers/Credentials.js:94 +#: client/src/helpers/Credentials.js:230 +#: client/src/helpers/Credentials.js:94 msgid "SCM Private Key" msgstr "SCM 秘密鍵" @@ -1915,6 +2758,7 @@ msgid "SCM update currently running" msgstr "現在実行中の SCM 更新" #: client/src/main-menu/main-menu.partial.html:59 +#: client/src/setup-menu/setup.route.js:8 msgid "SETTINGS" msgstr "設定" @@ -1926,11 +2770,16 @@ msgstr "サインイン" msgid "SIGN IN WITH" msgstr "サインイン:" -#: client/src/app.js:497 +#: client/src/app.js:499 msgid "SOCKETS" msgstr "ソケット" -#: client/src/helpers/Credentials.js:169 client/src/helpers/Credentials.js:305 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:98 +msgid "SOURCE" +msgstr "ソース" + +#: client/src/helpers/Credentials.js:169 +#: client/src/helpers/Credentials.js:305 msgid "SSH Key" msgstr "SSH キー" @@ -1938,11 +2787,31 @@ msgstr "SSH キー" msgid "SSH key description" msgstr "SSH キーの説明" -#: client/src/notifications/notificationTemplates.form.js:385 +#: client/src/notifications/notificationTemplates.form.js:388 msgid "SSL Connection" msgstr "SSL 接続" -#: client/src/forms/Credentials.js:120 client/src/forms/Credentials.js:128 +#: client/src/job-detail/job-detail.partial.html:414 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:108 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:131 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:96 +msgid "STANDARD OUT" +msgstr "標準出力" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:32 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:52 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:45 +msgid "STARTED" +msgstr "開始" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:24 +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:37 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:37 +msgid "STATUS" +msgstr "ステータス" + +#: client/src/forms/Credentials.js:120 +#: client/src/forms/Credentials.js:128 msgid "STS Token" msgstr "STS トークン" @@ -1950,11 +2819,17 @@ msgstr "STS トークン" msgid "SUCCESSFUL" msgstr "成功" -#: client/src/helpers/Credentials.js:150 client/src/helpers/Credentials.js:286 -msgid "Satellite 6 URL" -msgstr "" +#: client/src/system-tracking/system-tracking.route.js:18 +msgid "SYSTEM TRACKING" +msgstr "システムトラッキング" -#: client/src/shared/form-generator.js:1688 +#: client/src/helpers/Credentials.js:150 +#: client/src/helpers/Credentials.js:286 +msgid "Satellite 6 URL" +msgstr "Satellite 6 URL" + +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:176 +#: client/src/shared/form-generator.js:1699 msgid "Save" msgstr "保存" @@ -1989,14 +2864,25 @@ msgstr "将来のジョブテンプレート実行のスケジュール" msgid "Scheduled Jobs" msgstr "スケジュール済みのジョブ" +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:32 +#: client/src/inventories/main.js:93 +#: client/src/management-jobs/scheduler/main.js:32 #: client/src/partials/jobs.html:10 +#: client/src/scheduler/main.js:153 +#: client/src/scheduler/main.js:236 +#: client/src/scheduler/main.js:67 msgid "Schedules" msgstr "スケジュール" -#: client/src/inventory-scripts/inventory-scripts.form.js:59 +#: client/src/inventory-scripts/inventory-scripts.form.js:62 msgid "Script must begin with a hashbang sequence: i.e.... %s" msgstr "スクリプトは hashbang シーケンスで開始する必要があります (例: .... %s)。" +#: client/src/shared/smart-search/smart-search.controller.js:38 +#: client/src/shared/smart-search/smart-search.controller.js:83 +msgid "Search" +msgstr "検索" + #: client/src/forms/Credentials.js:105 msgid "Secret Key" msgstr "シークレットキー" @@ -2010,33 +2896,38 @@ msgstr "" "セキュリティートークンサービス (STS) は、AWS Identity and Access Management (IAM) " "ユーザーの一時的な、権限の制限された認証情報を要求できる web サービスです。" -#: client/src/shared/form-generator.js:1692 +#: client/src/shared/form-generator.js:1703 msgid "Select" msgstr "選択" #: client/src/access/add-rbac-user-team/rbac-user-team.controller.js:67 msgid "Select a role" -msgstr "" +msgstr "ロールの選択" -#: client/src/configuration/jobs-form/configuration-jobs.controller.js:89 -#: client/src/configuration/ui-form/configuration-ui.controller.js:84 +#: client/src/configuration/jobs-form/configuration-jobs.controller.js:90 +#: client/src/configuration/ui-form/configuration-ui.controller.js:85 msgid "Select commands" msgstr "コマンドの選択" #: client/src/forms/Projects.js:98 msgid "" -"Select from the list of directories found in the Project Base Path. Together" -" the base path and the playbook directory provide the full path used to " +"Select from the list of directories found in the Project Base Path. Together " +"the base path and the playbook directory provide the full path used to " "locate playbooks." msgstr "" "プロジェクトのベースパスにあるデイレクトリーの一覧から選択します。ベースパスと Playbook ディレクトリーは、Playbook " "を見つけるために使用される完全なパスを提供します。" -#: client/src/configuration/auth-form/configuration-auth.controller.js:229 +#: client/src/configuration/auth-form/configuration-auth.controller.js:230 msgid "Select group types" msgstr "グループタイプの選択" -#: client/src/forms/JobTemplates.js:154 client/src/forms/WorkflowMaker.js:67 +#: client/src/access/rbac-multiselect/rbac-multiselect-role.directive.js:25 +msgid "Select roles" +msgstr "ロールの選択" + +#: client/src/forms/JobTemplates.js:155 +#: client/src/forms/WorkflowMaker.js:67 msgid "" "Select the credential you want the job to use when accessing the remote " "hosts. Choose the credential containing the username and SSH key or " @@ -2045,24 +2936,25 @@ msgstr "" "リモートホストへのアクセス時にジョブで使用する認証情報を選択します。Ansible がリモートホストにログインするために必要なユーザー名および SSH " "キーまたはパスワードが含まれる認証情報を選択してください。 " -#: client/src/forms/JobTemplates.js:86 client/src/forms/WorkflowMaker.js:88 +#: client/src/forms/JobTemplates.js:86 +#: client/src/forms/WorkflowMaker.js:88 msgid "Select the inventory containing the hosts you want this job to manage." msgstr "このジョブで管理するホストが含まれるインベントリーを選択してください。" -#: client/src/forms/JobTemplates.js:131 +#: client/src/forms/JobTemplates.js:132 msgid "Select the playbook to be executed by this job." msgstr "このジョブで実行される Playbook を選択してください。" -#: client/src/forms/JobTemplates.js:114 +#: client/src/forms/JobTemplates.js:115 msgid "" "Select the project containing the playbook you want this job to execute." msgstr "このジョブで実行する Playbook が含まれるプロジェクトを選択してください。" -#: client/src/configuration/system-form/configuration-system.controller.js:169 +#: client/src/configuration/system-form/configuration-system.controller.js:170 msgid "Select types" msgstr "タイプの選択" -#: client/src/forms/JobTemplates.js:176 +#: client/src/forms/JobTemplates.js:178 msgid "" "Selecting an optional cloud credential in the job template will pass along " "the access credentials to the running playbook, allowing provisioning into " @@ -2071,15 +2963,17 @@ msgstr "" "ジョブテンプレートでオプションのクラウド認証情報を選択すると、アクセス認証情報が実行中の Playbook " "に渡され、パラメーターを組み込みモジュールに手動で渡さなくてもクラウドへのプロビジョニングが許可されます。" -#: client/src/notifications/notificationTemplates.form.js:83 +#: client/src/notifications/notificationTemplates.form.js:86 msgid "Sender Email" msgstr "送信者のメール" -#: client/src/helpers/Credentials.js:234 client/src/helpers/Credentials.js:98 +#: client/src/helpers/Credentials.js:234 +#: client/src/helpers/Credentials.js:98 msgid "Service Account Email Address" msgstr "サービスアカウントのメールアドレス" -#: client/src/forms/JobTemplates.js:60 client/src/forms/WorkflowMaker.js:108 +#: client/src/forms/JobTemplates.js:60 +#: client/src/forms/WorkflowMaker.js:108 msgid "" "Setting the type to %s will execute the playbook and store any scanned " "facts for use with Tower's System Tracking feature." @@ -2092,8 +2986,8 @@ msgstr "タイプを %s に設定すると Playbook は実行されません。" #: client/src/forms/WorkflowMaker.js:106 msgid "" -"Setting the type to %s will not execute the playbook. Instead, %s will check" -" playbook syntax, test environment setup and report problems." +"Setting the type to %s will not execute the playbook. Instead, %s will check " +"playbook syntax, test environment setup and report problems." msgstr "" "タイプを %s に設定すると Playbook は実行されません。その代わりに、%s は Playbook " "構文、テスト環境セットアップおよびレポートの問題を検査します。" @@ -2102,7 +2996,7 @@ msgstr "" msgid "Settings" msgstr "設定" -#: client/src/shared/form-generator.js:850 +#: client/src/shared/form-generator.js:851 msgid "Show" msgstr "表示" @@ -2121,12 +3015,16 @@ msgstr "%s 組織でサインイン" msgid "Sign in with %s Teams" msgstr "%s チームでサインイン" -#: client/src/forms/JobTemplates.js:268 client/src/forms/JobTemplates.js:276 -#: client/src/forms/WorkflowMaker.js:149 client/src/forms/WorkflowMaker.js:157 +#: client/src/forms/JobTemplates.js:270 +#: client/src/forms/JobTemplates.js:278 +#: client/src/forms/WorkflowMaker.js:149 +#: client/src/forms/WorkflowMaker.js:157 +#: client/src/job-detail/job-detail.partial.html:158 msgid "Skip Tags" msgstr "スキップタグ" -#: client/src/forms/JobTemplates.js:274 client/src/forms/WorkflowMaker.js:155 +#: client/src/forms/JobTemplates.js:276 +#: client/src/forms/WorkflowMaker.js:155 msgid "" "Skip tags are useful when you have a large playbook, and you want to skip " "specific parts of a play or task." @@ -2140,11 +3038,15 @@ msgstr "ソースコントロール" msgid "Source Details" msgstr "ソース詳細" -#: client/src/notifications/notificationTemplates.form.js:196 +#: client/src/notifications/notificationTemplates.form.js:199 msgid "Source Phone Number" msgstr "発信元の電話番号" -#: client/src/notifications/notificationTemplates.form.js:333 +#: client/src/partials/logviewer.html:9 +msgid "Source Vars" +msgstr "ソース変数" + +#: client/src/notifications/notificationTemplates.form.js:336 msgid "Specify HTTP Headers in JSON format" msgstr "JSON 形式での HTTP ヘッダーの指定" @@ -2160,7 +3062,24 @@ msgid "" "groups." msgstr "コンテンツを関連付け、グループのパーミッションを制御するために組織を分割します。" -#: client/src/lists/PortalJobTemplates.js:42 client/src/lists/Templates.js:87 +#: client/src/partials/logviewer.html:5 +msgid "Standard Out" +msgstr "標準出力" + +#: client/src/forms/EventsViewer.js:73 +msgid "Start" +msgstr "開始" + +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:41 +msgid "Start Date" +msgstr "開始日" + +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:56 +msgid "Start Time" +msgstr "開始時間" + +#: client/src/lists/PortalJobTemplates.js:42 +#: client/src/lists/Templates.js:87 msgid "Start a job using this template" msgstr "このテンプレートによるジョブの開始" @@ -2169,19 +3088,41 @@ msgstr "このテンプレートによるジョブの開始" msgid "Start an SCM update" msgstr "SCM 更新の開始" -#: client/src/dashboard/hosts/dashboard-hosts.list.js:49 +#: client/src/forms/LogViewerStatus.js:38 +#: client/src/job-detail/job-detail.partial.html:209 +#: client/src/job-detail/job-detail.partial.html:267 +#: client/src/job-detail/job-detail.partial.html:64 +msgid "Started" +msgstr "開始 " + +#: client/src/dashboard/hosts/dashboard-hosts.list.js:48 +#: client/src/forms/EventsViewer.js:24 +#: client/src/forms/LogViewerStatus.js:28 +#: client/src/job-detail/job-detail.partial.html:26 +#: client/src/lists/JobEvents.js:51 +#: client/src/notifications/notification-templates-list/list.controller.js:73 +#: client/src/partials/logviewer.html:4 msgid "Status" msgstr "ステータス" +#: client/src/configuration/auth-form/configuration-auth.partial.html:3 +msgid "Sub Category" +msgstr "サブカテゴリー" + #: client/src/license/license.partial.html:121 msgid "Submit" msgstr "送信" +#: client/src/helpers/Jobs.js:230 +msgid "Submit the request to cancel?" +msgstr "取り消す要求を送信しますか?" + #: client/src/license/license.partial.html:27 msgid "Subscription" msgstr "サブスクリプション" -#: client/src/forms/Credentials.js:152 client/src/forms/Credentials.js:163 +#: client/src/forms/Credentials.js:152 +#: client/src/forms/Credentials.js:163 msgid "Subscription ID" msgstr "サブスクリプション ID" @@ -2193,10 +3134,18 @@ msgstr "サブスクリプション ID は、ユーザー名にマップされ msgid "Success" msgstr "成功" +#: client/src/helpers/Projects.js:70 +msgid "Success! Click for details" +msgstr "成功しました! クリックして詳細を確認してください。" + #: client/src/dashboard/graphs/dashboard-graphs.partial.html:77 msgid "Successful" msgstr "成功" +#: client/src/configuration/configuration.partial.html:17 +msgid "System" +msgstr "システム" + #: client/src/controllers/Users.js:18 msgid "System Administrator" msgstr "システム管理者" @@ -2205,12 +3154,20 @@ msgstr "システム管理者" msgid "System Auditor" msgstr "システム監査者" -#: client/src/app.js:340 +#: client/src/configuration/configuration.partial.html:3 +msgid "System auditors have read-only permissions in this section." +msgstr "システム監査者はこのセクションで読み取り専用パーミッションを持ちます。" + +#: client/src/app.js:343 +#: client/src/helpers/ActivityStream.js:35 +#: client/src/organizations/linkout/organizations-linkout.route.js:132 msgid "TEAMS" msgstr "チーム" +#: client/src/helpers/ActivityStream.js:56 #: client/src/main-menu/main-menu.partial.html:113 #: client/src/main-menu/main-menu.partial.html:35 +#: client/src/templates/list/templates-list.route.js:13 msgid "TEMPLATES" msgstr "テンプレート" @@ -2218,33 +3175,51 @@ msgstr "テンプレート" msgid "TIME" msgstr "時間" -#: client/src/forms/JobTemplates.js:256 client/src/forms/WorkflowMaker.js:140 +#: client/src/forms/JobTemplates.js:258 +#: client/src/forms/WorkflowMaker.js:140 msgid "" "Tags are useful when you have a large playbook, and you want to run a " "specific part of a play or task." msgstr "タグは、Playbook のサイズが大きく、プレイまたはタスクの特定の部分を実行する必要がある場合に役立ちます。" -#: client/src/notifications/notificationTemplates.form.js:313 +#: client/src/notifications/notificationTemplates.form.js:316 msgid "Target URL" msgstr "ターゲット URL" -#: client/src/forms/Credentials.js:468 client/src/forms/Inventories.js:126 -#: client/src/forms/Inventories.js:173 client/src/forms/Organizations.js:95 -#: client/src/forms/Projects.js:255 +#: client/src/forms/EventsViewer.js:45 +msgid "Task" +msgstr "タスク" + +#: client/src/job-detail/job-detail.partial.html:266 +msgid "Tasks" +msgstr "タスク" + +#: client/src/forms/Credentials.js:468 +#: client/src/forms/Inventories.js:127 +#: client/src/forms/Organizations.js:95 +#: client/src/forms/Projects.js:256 +#: client/src/forms/Workflows.js:147 msgid "Team Roles" msgstr "チームロール" -#: client/src/forms/Users.js:156 client/src/lists/Teams.js:16 +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:40 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:33 +#: client/src/forms/Users.js:156 +#: client/src/lists/Teams.js:16 #: client/src/lists/Teams.js:17 #: client/src/setup-menu/setup-menu.partial.html:16 +#: client/src/shared/stateDefinitions.factory.js:342 msgid "Teams" msgstr "チーム" +#: client/src/job-detail/job-detail.partial.html:57 #: client/src/lists/Templates.js:16 msgid "Template" msgstr "テンプレート" -#: client/src/lists/Templates.js:17 client/src/lists/Templates.js:18 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:34 +#: client/src/lists/Templates.js:17 +#: client/src/lists/Templates.js:18 msgid "Templates" msgstr "テンプレート" @@ -2252,15 +3227,17 @@ msgstr "テンプレート" msgid "Tenant ID" msgstr "テナント ID" -#: client/src/notifications/notificationTemplates.list.js:66 +#: client/src/notifications/notificationTemplates.list.js:65 msgid "Test notification" msgstr "テスト通知" -#: client/src/shared/form-generator.js:1410 +#: client/src/shared/form-generator.js:1414 +#: client/src/shared/form-generator.js:1420 msgid "That value was not found. Please enter or select a valid value." msgstr "値が見つかりませんでした。有効な値を入力または選択してください。" -#: client/src/helpers/Credentials.js:106 client/src/helpers/Credentials.js:242 +#: client/src/helpers/Credentials.js:106 +#: client/src/helpers/Credentials.js:242 msgid "" "The Project ID is the GCE assigned identification. It is constructed as two " "words followed by a three digit number. Such as:" @@ -2270,12 +3247,17 @@ msgstr "プロジェクト ID は GCE によって割り当てられる識別情 msgid "The SCM update process is running." msgstr "SCM 更新プロセスが実行中です。" +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:70 +msgid "The credential used to run this command." +msgstr "このコマンドを実行するために使用される認証情報です。" + #: client/src/forms/Credentials.js:191 msgid "" "The email address assigned to the Google Compute Engine %sservice account." msgstr "Google Compute Engine %sサービスアカウントに割り当てられたメールアドレス。" -#: client/src/helpers/Credentials.js:142 client/src/helpers/Credentials.js:278 +#: client/src/helpers/Credentials.js:142 +#: client/src/helpers/Credentials.js:278 msgid "The host to authenticate with." msgstr "認証するホスト。" @@ -2283,7 +3265,11 @@ msgstr "認証するホスト。" msgid "The host value" msgstr "ホスト値" -#: client/src/forms/JobTemplates.js:210 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:61 +msgid "The inventory this command ran on." +msgstr "このコマンドが実行されるインベントリー。" + +#: client/src/forms/JobTemplates.js:212 msgid "" "The number of parallel or simultaneous processes to use while executing the " "playbook. 0 signifies the default value from the %sansible configuration " @@ -2291,9 +3277,9 @@ msgid "" msgstr "" "Playbook の実行中に使用する並列または同時プロセスの数です。0 は %sansible 設定ファイル%s のデフォルト値を表します。" -#: client/src/job-results/job-results.controller.js:538 +#: client/src/job-results/job-results.controller.js:554 msgid "The output is too large to display. Please download." -msgstr "" +msgstr "出力が大きすぎて表示できません。ダウンロードしてください。" #: client/src/helpers/Credentials.js:74 msgid "The project value" @@ -2307,6 +3293,18 @@ msgstr "" "選択されたプロジェクトは SCM に対して設定されていません。SCM の設定を行うには、プロジェクトを編集して SCM " "設定を指定してから更新を実行します。" +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:124 +msgid "The time must be in HH24:MM:SS format." +msgstr "時間は HH24:MM:SS 形式で表示される必要があります。" + +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:79 +msgid "The user who ran this command." +msgstr "このコマンドを実行したユーザー。" + +#: client/src/lists/Streams.js:19 +msgid "There are no events to display at this time" +msgstr "現時点で表示できるイベントはありません" + #: client/src/lists/PortalJobTemplates.js:20 msgid "There are no job templates to display at this time" msgstr "現時点で表示できるジョブテンプレートはありません" @@ -2317,8 +3315,8 @@ msgstr "現時点で表示できるジョブはありません" #: client/src/controllers/Projects.js:152 msgid "" -"There is no SCM update information available for this project. An update has" -" not yet been completed. If you have not already done so, start an update " +"There is no SCM update information available for this project. An update has " +"not yet been completed. If you have not already done so, start an update " "for this project." msgstr "" "このプロジェクトに利用できる SCM " @@ -2332,7 +3330,12 @@ msgstr "値のリセット中にエラーが発生しました。返されたス msgid "There was an error resetting values. Returned status:" msgstr "値のリセット中にエラーが発生しました。返されたステータス:" -#: client/src/helpers/Credentials.js:139 client/src/helpers/Credentials.js:275 +#: client/src/management-jobs/scheduler/schedulerForm.partial.html:168 +msgid "This is not a valid number." +msgstr "これは無効な数値です。" + +#: client/src/helpers/Credentials.js:139 +#: client/src/helpers/Credentials.js:275 msgid "" "This is the tenant name. This value is usually the same as the username." msgstr "これはテナント名です。通常、この値はユーザー名と同じです。" @@ -2343,7 +3346,7 @@ msgid "" "%sNotifications%s section" msgstr "この一覧は、%s通知%s セクションで追加される通知テンプレートで事前に設定されます。" -#: client/src/notifications/notificationTemplates.form.js:199 +#: client/src/notifications/notificationTemplates.form.js:202 msgid "This must be of the form %s." msgstr "これは %s 形式でなければなりません。" @@ -2351,8 +3354,8 @@ msgstr "これは %s 形式でなければなりません。" msgid "This user is not a member of any teams" msgstr "このユーザーはいずれのチームのメンバーでもありません。" -#: client/src/shared/form-generator.js:830 -#: client/src/shared/form-generator.js:944 +#: client/src/shared/form-generator.js:831 +#: client/src/shared/form-generator.js:945 msgid "" "This value does not match the password you entered previously. Please " "confirm that password." @@ -2365,6 +3368,8 @@ msgid "" msgstr "これにより、すべての設定値が出荷時の設定にリセットされます。本当に続行してもよいですか?" #: client/src/dashboard/lists/jobs/jobs-list.partial.html:14 +#: client/src/lists/Streams.js:28 +#: client/src/notifications/notification-templates-list/list.controller.js:74 msgid "Time" msgstr "時間" @@ -2376,19 +3381,29 @@ msgstr "残りの時間" msgid "" "Time in seconds to consider a project to be current. During job runs and " "callbacks the task system will evaluate the timestamp of the latest project " -"update. If it is older than Cache Timeout, it is not considered current, and" -" a new project update will be performed." +"update. If it is older than Cache Timeout, it is not considered current, and " +"a new project update will be performed." msgstr "" "プロジェクトが最新であることを判別するための時間 (秒単位) " "です。ジョブ実行およびコールバック時に、タスクシステムは最新のプロジェクト更新のタイムスタンプを評価します。これがキャッシュタイムアウトよりも古い場合には、最新とは見なされず、新規のプロジェクト更新が実行されます。" +#: client/src/forms/EventsViewer.js:74 +#: client/src/forms/EventsViewer.js:78 +#: client/src/forms/EventsViewer.js:82 +msgid "Timing" +msgstr "タイミング" + #: client/src/forms/Credentials.js:126 msgid "" -"To learn more about the IAM STS Token, refer to the %sAmazon " -"documentation%s." +"To learn more about the IAM STS Token, refer to the %sAmazon documentation%s." +"" msgstr "IAM STS トークンについての詳細は、%sAmazon ドキュメント%s を参照してください。" -#: client/src/shared/form-generator.js:855 +#: client/src/job-detail/job-detail.partial.html:416 +msgid "Toggle Output" +msgstr "出力の切り替え" + +#: client/src/shared/form-generator.js:856 msgid "Toggle the display of plaintext." msgstr "プレーンテキストの表示を切り替えます。" @@ -2397,30 +3412,40 @@ msgstr "プレーンテキストの表示を切り替えます。" msgid "Token" msgstr "トークン" -#: client/src/forms/Credentials.js:61 client/src/forms/Credentials.js:85 -#: client/src/forms/Teams.js:130 client/src/forms/Users.js:196 -#: client/src/forms/WorkflowMaker.js:34 client/src/lists/CompletedJobs.js:50 -#: client/src/lists/Credentials.js:39 client/src/lists/Projects.js:43 -#: client/src/lists/ScheduledJobs.js:43 client/src/lists/Templates.js:31 -#: client/src/notifications/notificationTemplates.form.js:54 -#: client/src/notifications/notificationTemplates.list.js:38 +#: client/src/partials/logviewer.html:6 +msgid "Traceback" +msgstr "トレースバック" + +#: client/src/forms/Credentials.js:61 +#: client/src/forms/Credentials.js:85 +#: client/src/forms/Teams.js:130 +#: client/src/forms/Users.js:197 +#: client/src/forms/WorkflowMaker.js:34 +#: client/src/lists/AllJobs.js:61 +#: client/src/lists/CompletedJobs.js:50 +#: client/src/lists/Credentials.js:39 +#: client/src/lists/Projects.js:43 +#: client/src/lists/ScheduledJobs.js:44 +#: client/src/lists/Templates.js:31 +#: client/src/notifications/notificationTemplates.form.js:57 +#: client/src/notifications/notificationTemplates.list.js:37 #: client/src/notifications/notifications.list.js:31 msgid "Type" msgstr "タイプ" #: client/src/forms/Credentials.js:25 -#: client/src/notifications/notificationTemplates.form.js:23 +#: client/src/notifications/notificationTemplates.form.js:26 msgid "Type Details" msgstr "タイプの詳細" -#: client/src/notifications/notificationTemplates.form.js:212 -#: client/src/notifications/notificationTemplates.form.js:97 +#: client/src/notifications/notificationTemplates.form.js:100 +#: client/src/notifications/notificationTemplates.form.js:215 msgid "Type an option on each line." msgstr "各行にオプションを入力します。" -#: client/src/notifications/notificationTemplates.form.js:141 -#: client/src/notifications/notificationTemplates.form.js:158 -#: client/src/notifications/notificationTemplates.form.js:371 +#: client/src/notifications/notificationTemplates.form.js:144 +#: client/src/notifications/notificationTemplates.form.js:161 +#: client/src/notifications/notificationTemplates.form.js:374 msgid "Type an option on each line. The pound symbol (#) is not required." msgstr "各行にオプションを入力します。シャープ記号 (#) は不要です。" @@ -2433,7 +3458,9 @@ msgstr "URL ポップオーバーテキスト" msgid "USERNAME" msgstr "ユーザー名" -#: client/src/app.js:364 +#: client/src/app.js:367 +#: client/src/helpers/ActivityStream.js:32 +#: client/src/organizations/linkout/organizations-linkout.route.js:59 msgid "USERS" msgstr "ユーザー" @@ -2453,30 +3480,50 @@ msgstr "起動時の更新" msgid "Upgrade" msgstr "アップグレード" +#: client/src/notifications/notificationTemplates.form.js:408 +msgid "Use SSL" +msgstr "SSL の使用" + +#: client/src/notifications/notificationTemplates.form.js:403 +msgid "Use TLS" +msgstr "TLS の使用" + #: client/src/forms/Credentials.js:77 msgid "" -"Used to check out and synchronize playbook repositories with a remote source" -" control management system such as Git, Subversion (svn), or Mercurial (hg)." -" These credentials are used by Projects." +"Used to check out and synchronize playbook repositories with a remote source " +"control management system such as Git, Subversion (svn), or Mercurial (hg). " +"These credentials are used by Projects." msgstr "" "Git、Subversion (svn)、または Mercurial (hg) などのリモートソースコントロール管理システムで Playbook " "リポジトリーをチェックアウトし、同期するために使用されます。これらの認証情報はプロジェクトで使用されます。" -#: client/src/forms/Credentials.js:456 client/src/forms/Inventories.js:115 -#: client/src/forms/Inventories.js:161 client/src/forms/Organizations.js:83 -#: client/src/forms/Projects.js:244 client/src/forms/Teams.js:93 +#: client/src/forms/Credentials.js:457 +#: client/src/forms/Inventories.js:116 +#: client/src/forms/Organizations.js:84 +#: client/src/forms/Projects.js:245 +#: client/src/forms/Teams.js:93 +#: client/src/forms/Workflows.js:136 msgid "User" msgstr "ユーザー" +#: client/src/configuration/configuration.partial.html:18 +msgid "User Interface" +msgstr "ユーザーインターフェース" + #: client/src/forms/Users.js:94 msgid "User Type" msgstr "ユーザータイプ" -#: client/src/forms/Users.js:49 client/src/helpers/Credentials.js:118 -#: client/src/helpers/Credentials.js:225 client/src/helpers/Credentials.js:254 -#: client/src/helpers/Credentials.js:32 client/src/helpers/Credentials.js:56 -#: client/src/helpers/Credentials.js:89 client/src/lists/Users.js:37 -#: client/src/notifications/notificationTemplates.form.js:64 +#: client/src/access/rbac-multiselect/permissionsUsers.list.js:36 +#: client/src/forms/Users.js:49 +#: client/src/helpers/Credentials.js:118 +#: client/src/helpers/Credentials.js:225 +#: client/src/helpers/Credentials.js:254 +#: client/src/helpers/Credentials.js:32 +#: client/src/helpers/Credentials.js:56 +#: client/src/helpers/Credentials.js:89 +#: client/src/lists/Users.js:37 +#: client/src/notifications/notificationTemplates.form.js:67 msgid "Username" msgstr "ユーザー名" @@ -2486,10 +3533,13 @@ msgid "" "cloud or infrastructure provider. These are used for dynamic inventory " "sources and for cloud provisioning and deployment in playbook runs." msgstr "" -"指定されたクラウドまたはインフラストラクチャープロバイダーに対する認証を行うためのユーザー名、パスワード、およびアクセスキーです。これらは動的なインベントリーソースおよび" -" Playbook 実行のクラウドプロビジョニングおよびデプロイメントに使用されます。" +"指定されたクラウドまたはインフラストラクチャープロバイダーに対する認証を行うためのユーザー名、パスワード、およびアクセスキーです。これらは動的なインベントリーソースおよび " +"Playbook 実行のクラウドプロビジョニングおよびデプロイメントに使用されます。" -#: client/src/forms/Teams.js:75 client/src/lists/Users.js:26 +#: client/src/access/add-rbac-resource/rbac-resource.partial.html:35 +#: client/src/activity-stream/streamDropdownNav/stream-dropdown-nav.directive.js:35 +#: client/src/forms/Teams.js:75 +#: client/src/lists/Users.js:26 #: client/src/lists/Users.js:27 #: client/src/setup-menu/setup-menu.partial.html:10 msgid "Users" @@ -2520,7 +3570,10 @@ msgstr "変数" msgid "Vault Password" msgstr "Vault パスワード" -#: client/src/forms/JobTemplates.js:237 client/src/forms/JobTemplates.js:244 +#: client/src/forms/JobTemplates.js:239 +#: client/src/forms/JobTemplates.js:246 +#: client/src/job-detail/job-detail.partial.html:148 +#: client/src/standard-out/adhoc/standard-out-adhoc.partial.html:99 msgid "Verbosity" msgstr "詳細" @@ -2531,13 +3584,22 @@ msgstr "バージョン" #: client/src/dashboard/graphs/dashboard-graphs.partial.html:58 #: client/src/inventory-scripts/inventory-scripts.list.js:65 -#: client/src/lists/Credentials.js:81 client/src/lists/Inventories.js:85 -#: client/src/lists/Teams.js:69 client/src/lists/Templates.js:117 +#: client/src/lists/Credentials.js:81 +#: client/src/lists/Inventories.js:85 +#: client/src/lists/JobEvents.js:98 +#: client/src/lists/Schedules.js:85 +#: client/src/lists/Streams.js:66 +#: client/src/lists/Teams.js:69 +#: client/src/lists/Templates.js:116 #: client/src/lists/Users.js:78 -#: client/src/notifications/notificationTemplates.list.js:81 +#: client/src/notifications/notificationTemplates.list.js:80 msgid "View" msgstr "表示" +#: client/src/bread-crumb/bread-crumb.directive.js:111 +msgid "View Activity Stream" +msgstr "アクティビティーストリームの表示" + #: client/src/main-menu/main-menu.partial.html:173 msgid "View Documentation" msgstr "ドキュメントの表示" @@ -2546,8 +3608,9 @@ msgstr "ドキュメントの表示" msgid "View JSON examples at %s" msgstr "JSON サンプルを %s に表示" -#: client/src/forms/JobTemplates.js:463 client/src/forms/Workflows.js:163 -#: client/src/shared/form-generator.js:1716 +#: client/src/forms/JobTemplates.js:466 +#: client/src/forms/Workflows.js:164 +#: client/src/shared/form-generator.js:1727 msgid "View Survey" msgstr "Survey の表示" @@ -2567,6 +3630,11 @@ msgstr "ライセンス情報を表示し、編集します。" msgid "View credential" msgstr "認証情報の表示" +#: client/src/lists/JobEvents.js:100 +#: client/src/lists/Streams.js:70 +msgid "View event details" +msgstr "イベント詳細の表示" + #: client/src/setup-menu/setup-menu.partial.html:60 msgid "View information about this version of Ansible Tower." msgstr "本バージョンの Ansible Tower 情報を表示します。" @@ -2579,23 +3647,31 @@ msgstr "インベントリーの表示" msgid "View inventory script" msgstr "インベントリースクリプトの表示" -#: client/src/notifications/notificationTemplates.list.js:83 +#: client/src/notifications/notificationTemplates.list.js:82 msgid "View notification" msgstr "通知の表示" +#: client/src/lists/Schedules.js:87 +msgid "View schedule" +msgstr "スケジュールの表示" + #: client/src/lists/Teams.js:72 msgid "View team" msgstr "チームの表示" -#: client/src/lists/Templates.js:119 +#: client/src/lists/Templates.js:118 msgid "View template" msgstr "テンプレートの表示" -#: client/src/lists/Projects.js:110 +#: client/src/lists/AllJobs.js:94 +msgid "View the job" +msgstr "ジョブの表示" + +#: client/src/lists/Projects.js:109 msgid "View the project" msgstr "プロジェクトの表示" -#: client/src/lists/ScheduledJobs.js:74 +#: client/src/lists/ScheduledJobs.js:75 msgid "View the schedule" msgstr "スケジュールの表示" @@ -2603,10 +3679,20 @@ msgstr "スケジュールの表示" msgid "View user" msgstr "ユーザーの表示" +#: client/src/standard-out/inventory-sync/standard-out-inventory-sync.partial.html:25 +#: client/src/standard-out/scm-update/standard-out-scm-update.partial.html:25 +msgid "View workflow results" +msgstr "ワークフロー結果の表示" + #: client/src/forms/Workflows.js:22 msgid "WORKFLOW" msgstr "ワークフロー" +#: client/src/job-detail/job-detail.partial.html:313 +#: client/src/job-detail/job-detail.partial.html:368 +msgid "Waiting..." +msgstr "待機中..." + #: client/src/configuration/auth-form/configuration-auth.controller.js:68 #: client/src/configuration/configuration.controller.js:179 #: client/src/configuration/configuration.controller.js:241 @@ -2624,14 +3710,16 @@ msgid "" "license." msgstr "Ansible Tower へようこそ! ライセンスを取得するために以下のステップを完了してください。" -#: client/src/forms/JobTemplates.js:55 client/src/forms/WorkflowMaker.js:104 +#: client/src/forms/JobTemplates.js:55 +#: client/src/forms/WorkflowMaker.js:104 msgid "" "When this template is submitted as a job, setting the type to %s will " "execute the playbook, running tasks on the selected hosts." msgstr "" "このテンプレートがジョブとして送信される場合、タイプを %s に設定すると Playbook が実行され、選択されたホストでタスクが実行されます。" -#: client/src/forms/Workflows.js:187 client/src/shared/form-generator.js:1720 +#: client/src/forms/Workflows.js:188 +#: client/src/shared/form-generator.js:1731 msgid "Workflow Editor" msgstr "ワークフローエディター" @@ -2639,10 +3727,25 @@ msgstr "ワークフローエディター" msgid "Workflow Job Template" msgstr "ワークフロージョブテンプレート" +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:103 +#: client/src/access/add-rbac-user-team/rbac-user-team.partial.html:40 +msgid "Workflow Templates" +msgstr "ワークフローテンプレート" + +#: client/src/dashboard/lists/job-templates/job-templates-list.partial.html:58 +msgid "" +"You can create a job template here." +msgstr "ジョブテンプレートをここに作成できます。" + #: client/src/controllers/Projects.js:508 msgid "You do not have access to view this property" msgstr "これを適切に表示するためのアクセス権がありません。" +#: client/src/templates/job_templates/add-job-template/job-template-add.controller.js:26 +msgid "You do not have permission to add a job template." +msgstr "ジョブテンプレートを追加するパーミッションがありません。" + #: client/src/controllers/Projects.js:324 msgid "You do not have permission to add a project." msgstr "プロジェクトを追加するパーミッションがありません。" @@ -2656,27 +3759,27 @@ msgstr "ユーザーを追加するパーミッションがありません。" #: client/src/configuration/configuration.controller.js:240 #: client/src/configuration/system-form/configuration-system.controller.js:46 msgid "" -"You have unsaved changes. Would you like to proceed without" -" saving?" +"You have unsaved changes. Would you like to proceed without " +"saving?" msgstr "保存されていない変更があります。変更せずに次に進みますか?" -#: client/src/shared/form-generator.js:956 +#: client/src/shared/form-generator.js:957 msgid "Your password must be %d characters long." msgstr "パスワードの長さは %d 文字にしてください。" -#: client/src/shared/form-generator.js:961 +#: client/src/shared/form-generator.js:962 msgid "Your password must contain a lowercase letter." msgstr "パスワードには小文字を含める必要があります。" -#: client/src/shared/form-generator.js:971 +#: client/src/shared/form-generator.js:972 msgid "Your password must contain a number." msgstr "パスワードには数字を含める必要があります。" -#: client/src/shared/form-generator.js:966 +#: client/src/shared/form-generator.js:967 msgid "Your password must contain an uppercase letter." msgstr "パスワードには大文字を含める必要があります。" -#: client/src/shared/form-generator.js:976 +#: client/src/shared/form-generator.js:977 msgid "Your password must contain one of the following characters: %s" msgstr "パスワードには以下の文字のいずれかを使用する必要があります: %s" @@ -2688,11 +3791,20 @@ msgstr "更新を取り消す要求がタスクマネージャーに送信され msgid "Your session timed out due to inactivity. Please sign in." msgstr "アイドル時間によりセッションがタイムアウトしました。サインインしてください。" -#: client/src/shared/form-generator.js:1222 +#: client/src/shared/form-generator.js:1223 msgid "and" msgstr "and" -#: client/src/forms/Credentials.js:139 client/src/forms/Credentials.js:365 +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:22 +msgid "name" +msgstr "名前" + +#: client/src/access/rbac-multiselect/permissionsTeams.list.js:25 +msgid "organization" +msgstr "組織" + +#: client/src/forms/Credentials.js:139 +#: client/src/forms/Credentials.js:365 msgid "set in helpers/credentials" msgstr "ヘルパー/認証情報で設定" diff --git a/awx/ui/tests/spec/column-sort/column-sort.directive-test.js b/awx/ui/tests/spec/column-sort/column-sort.directive-test.js index 4cb1a3ec53..494f1d41d1 100644 --- a/awx/ui/tests/spec/column-sort/column-sort.directive-test.js +++ b/awx/ui/tests/spec/column-sort/column-sort.directive-test.js @@ -38,16 +38,17 @@ describe('Directive: column-sort', () =>{ go: jasmine.createSpy('go') }; + this.$stateParams = {}; angular.mock.module('ColumnSortModule', ($provide) =>{ - - QuerySet = jasmine.createSpyObj('qs', ['search']); - QuerySet.search.and.callFake(() => { return { then: function(){} } }); - GetBasePath = jasmine.createSpy('GetBasePath'); - $provide.value('QuerySet', QuerySet); - $provide.value('GetBasePath', GetBasePath); - $provide.value('$state', this.$state); + QuerySet = jasmine.createSpyObj('qs', ['search']); + QuerySet.search.and.callFake(() => { return { then: function(){} }; }); + GetBasePath = jasmine.createSpy('GetBasePath'); + $provide.value('QuerySet', QuerySet); + $provide.value('GetBasePath', GetBasePath); + $provide.value('$state', this.$state); + $provide.value('$stateParams', this.$stateParams); }); }); @@ -55,7 +56,7 @@ describe('Directive: column-sort', () =>{ beforeEach(angular.mock.inject(($templateCache, _$rootScope_, _$compile_) => { template = window.__html__['client/src/shared/column-sort/column-sort.partial.html']; $templateCache.put('/static/partials/shared/column-sort/column-sort.partial.html', template); - + $compile = _$compile_; $scope = _$rootScope_.$new(); })); @@ -67,11 +68,11 @@ describe('Directive: column-sort', () =>{ }; $compile(this.name_field)($scope); - $compile(this.idx_field)($scope) + $compile(this.idx_field)($scope); $scope.$digest(); expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true); - expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); + expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); }); it('should toggle to ascending name order, then ascending idx, then descending idx', function(){ @@ -81,21 +82,21 @@ describe('Directive: column-sort', () =>{ }; $compile(this.name_field)($scope); - $compile(this.idx_field)($scope) + $compile(this.idx_field)($scope); $scope.$digest(); $(this.name_field).click(); expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true); - expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); + expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); - $(this.idx_field).click(); + $(this.idx_field).click(); expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-up') ).toEqual(true); $(this.idx_field).click(); expect( $(this.name_field).find('.columnSortIcon').hasClass('fa-sort') ).toEqual(true); - expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-down') ).toEqual(true) + expect( $(this.idx_field).find('.columnSortIcon').hasClass('fa-sort-down') ).toEqual(true); }); -}); \ No newline at end of file +}); diff --git a/awx/ui/tests/spec/job-results/job-results.controller-test.js b/awx/ui/tests/spec/job-results/job-results.controller-test.js index 585d7d75e8..f0b7f3ecea 100644 --- a/awx/ui/tests/spec/job-results/job-results.controller-test.js +++ b/awx/ui/tests/spec/job-results/job-results.controller-test.js @@ -1,10 +1,11 @@ 'use strict'; +import moment from 'moment'; describe('Controller: jobResultsController', () => { // Setup let jobResultsController; - let jobData, jobDataOptions, jobLabels, jobFinished, count, $scope, ParseTypeChange, ParseVariableString, jobResultsService, eventQueue, $compile, eventResolve, populateResolve, $rScope, q, $log, Dataset, Rest, $state, QuerySet, i18n,fieldChoices, fieldLabels; + let jobData, jobDataOptions, jobLabels, jobFinished, count, $scope, ParseTypeChange, ParseVariableString, jobResultsService, eventQueue, $compile, eventResolve, populateResolve, $rScope, q, $log, Dataset, Rest, $state, QuerySet, i18n,fieldChoices, fieldLabels, $interval, workflowResultsService; jobData = { related: {} @@ -37,7 +38,8 @@ describe('Controller: jobResultsController', () => { 'deleteJob', 'cancelJob', 'relaunchJob', - 'getEvents' + 'getEvents', + 'getJobData', ]); eventQueue = jasmine.createSpyObj('eventQueue', [ 'populate', @@ -64,6 +66,10 @@ describe('Controller: jobResultsController', () => { } }; + $provide.service('workflowResultsService', () => { + return jasmine.createSpyObj('workflowResultsService', ['createOneSecondTimer', 'destroyTimer']); + }); + $provide.value('jobData', jobData); $provide.value('jobDataOptions', jobDataOptions); $provide.value('jobLabels', jobLabels); @@ -84,7 +90,7 @@ describe('Controller: jobResultsController', () => { }; let injectVals = () => { - angular.mock.inject((_jobData_, _jobDataOptions_, _jobLabels_, _jobFinished_, _count_, _ParseTypeChange_, _ParseVariableString_, _jobResultsService_, _eventQueue_, _$compile_, $rootScope, $controller, $q, $httpBackend, _$log_, _Dataset_, _Rest_, _$state_, _QuerySet_) => { + angular.mock.inject((_jobData_, _jobDataOptions_, _jobLabels_, _jobFinished_, _count_, _ParseTypeChange_, _ParseVariableString_, _jobResultsService_, _eventQueue_, _$compile_, $rootScope, $controller, $q, $httpBackend, _$log_, _Dataset_, _Rest_, _$state_, _QuerySet_, _$interval_, _workflowResultsService_) => { // when you call $scope.$apply() (which you need to do to // to get inside of .then blocks to test), something is // causing a request for all static files. @@ -119,12 +125,20 @@ describe('Controller: jobResultsController', () => { Rest = _Rest_; $state = _$state_; QuerySet = _QuerySet_; + $interval = _$interval_; + workflowResultsService = _workflowResultsService_; jobResultsService.getEvents.and .returnValue(eventResolve); eventQueue.populate.and .returnValue(populateResolve); + jobResultsService.getJobData = function(blah) { + var deferred = $q.defer(); + deferred.resolve({}); + return deferred.promise; + }; + $compile = _$compile_; jobResultsController = $controller('jobResultsController', { @@ -230,6 +244,57 @@ describe('Controller: jobResultsController', () => { }); }); + describe('elapsed timer', () => { + describe('job running', () => { + beforeEach(() => { + jobData.started = moment(); + jobData.status = 'running'; + + bootstrapTest(); + }); + + it('should start timer', () => { + expect(workflowResultsService.createOneSecondTimer).toHaveBeenCalled(); + }); + }); + + describe('job waiting', () => { + beforeEach(() => { + jobData.started = null; + jobData.status = 'waiting'; + + bootstrapTest(); + }); + + it('should not start timer', () => { + expect(workflowResultsService.createOneSecondTimer).not.toHaveBeenCalled(); + }); + }); + + describe('job transitions to running', () => { + beforeEach(() => { + jobData.started = null; + jobData.status = 'waiting'; + jobData.id = 13; + + bootstrapTest(); + + $rScope.$broadcast('ws-jobs', { unified_job_id: jobData.id, status: 'running' }); + }); + + it('should start timer', () => { + expect(workflowResultsService.createOneSecondTimer).toHaveBeenCalled(); + }); + + describe('job transitions from running to finished', () => { + it('should cleanup timer', () => { + $rScope.$broadcast('ws-jobs', { unified_job_id: jobData.id, status: 'successful' }); + expect(workflowResultsService.destroyTimer).toHaveBeenCalled(); + }); + }); + }); + }); + describe('extra vars stuff', () => { let extraVars = "foo"; diff --git a/awx/ui/tests/spec/job-results/parse-stdout.service-test.js b/awx/ui/tests/spec/job-results/parse-stdout.service-test.js index c4aeace3e7..069a7d47eb 100644 --- a/awx/ui/tests/spec/job-results/parse-stdout.service-test.js +++ b/awx/ui/tests/spec/job-results/parse-stdout.service-test.js @@ -129,7 +129,7 @@ describe('parseStdoutService', () => { end_line: 11, stdout: "a\r\nb\r\nc..." }; - let expectedReturn = [[8, "a"],[9, "b"], [10,"c..."], [11, "[1;imLine capped.[0m"]]; + let expectedReturn = [[8, "a"],[9, "b"], [10,"c..."], [11, ""]]; let returnedEvent = parseStdoutService.getLineArr(mockEvent); diff --git a/awx/ui/tests/spec/workflow--results/data/workflow_job.js b/awx/ui/tests/spec/workflow--results/data/workflow_job.js new file mode 100644 index 0000000000..997c488e7a --- /dev/null +++ b/awx/ui/tests/spec/workflow--results/data/workflow_job.js @@ -0,0 +1,63 @@ +export default { + "id": 109, + "type": "workflow_job", + "url": "/api/v1/workflow_jobs/109/", + "related": { + "created_by": "/api/v1/users/1/", + "unified_job_template": "/api/v1/workflow_job_templates/27/", + "workflow_job_template": "/api/v1/workflow_job_templates/27/", + "notifications": "/api/v1/workflow_jobs/109/notifications/", + "workflow_nodes": "/api/v1/workflow_jobs/109/workflow_nodes/", + "labels": "/api/v1/workflow_jobs/109/labels/", + "activity_stream": "/api/v1/workflow_jobs/109/activity_stream/", + "relaunch": "/api/v1/workflow_jobs/109/relaunch/", + "cancel": "/api/v1/workflow_jobs/109/cancel/" + }, + "summary_fields": { + "workflow_job_template": { + "id": 27, + "name": "workflow timer", + "description": "" + }, + "unified_job_template": { + "id": 27, + "name": "workflow timer", + "description": "", + "unified_job_type": "workflow_job" + }, + "created_by": { + "id": 1, + "username": "admin", + "first_name": "", + "last_name": "" + }, + "user_capabilities": { + "start": true, + "delete": true + }, + "labels": { + "count": 0, + "results": [] + } + }, + "created": "2017-02-01T14:56:47.416Z", + "modified": "2017-02-01T14:57:14.189Z", + "name": "workflow timer", + "description": "", + "unified_job_template": 27, + "launch_type": "manual", + "status": "successful", + "failed": false, + "started": "2017-02-01T14:56:47.754897Z", + "finished": "2017-02-01T14:57:14.182780Z", + "elapsed": 26.428, + "job_args": "", + "job_cwd": "", + "job_env": {}, + "job_explanation": "", + "result_stdout": "stdout capture is missing", + "execution_node": "", + "result_traceback": "", + "workflow_job_template": 27, + "extra_vars": "{}" +}; \ No newline at end of file diff --git a/awx/ui/tests/spec/workflow--results/data/workflow_job_options.js b/awx/ui/tests/spec/workflow--results/data/workflow_job_options.js new file mode 100644 index 0000000000..657d6f41fe --- /dev/null +++ b/awx/ui/tests/spec/workflow--results/data/workflow_job_options.js @@ -0,0 +1,203 @@ +export default { + "name": "Workflow Job Detail", + "description": "# Retrieve Workflow Job:\n\nMake GET request to this resource to retrieve a single workflow job\nrecord containing the following fields:\n\n* `id`: Database ID for this workflow job. (integer)\n* `type`: Data type for this workflow job. (choice)\n* `url`: URL for this workflow job. (string)\n* `related`: Data structure with URLs of related resources. (object)\n* `summary_fields`: Data structure with name/description for related resources. (object)\n* `created`: Timestamp when this workflow job was created. (datetime)\n* `modified`: Timestamp when this workflow job was last modified. (datetime)\n* `name`: Name of this workflow job. (string)\n* `description`: Optional description of this workflow job. (string)\n* `unified_job_template`: (field)\n* `launch_type`: (choice)\n - `manual`: Manual\n - `relaunch`: Relaunch\n - `callback`: Callback\n - `scheduled`: Scheduled\n - `dependency`: Dependency\n - `workflow`: Workflow\n - `sync`: Sync\n* `status`: (choice)\n - `new`: New\n - `pending`: Pending\n - `waiting`: Waiting\n - `running`: Running\n - `successful`: Successful\n - `failed`: Failed\n - `error`: Error\n - `canceled`: Canceled\n* `failed`: (boolean)\n* `started`: The date and time the job was queued for starting. (datetime)\n* `finished`: The date and time the job finished execution. (datetime)\n* `elapsed`: Elapsed time in seconds that the job ran. (decimal)\n* `job_args`: (string)\n* `job_cwd`: (string)\n* `job_env`: (field)\n* `job_explanation`: A status field to indicate the state of the job if it wasn't able to run and capture stdout (string)\n* `result_stdout`: (field)\n* `execution_node`: The Tower node the job executed on. (string)\n* `result_traceback`: (string)\n* `workflow_job_template`: (field)\n* `extra_vars`: (string)\n\n\n\n# Delete Workflow Job:\n\nMake a DELETE request to this resource to delete this workflow job.\n\n\n\n\n\n\n\n\n\n\n\n> _New in Ansible Tower 3.1.0_", + "renders": [ + "application/json", + "text/html" + ], + "parses": [ + "application/json" + ], + "actions": { + "GET": { + "id": { + "type": "integer", + "label": "ID", + "help_text": "Database ID for this workflow job." + }, + "type": { + "type": "choice", + "label": "Type", + "help_text": "Data type for this workflow job.", + "choices": [ + [ + "workflow_job", + "Workflow Job" + ] + ] + }, + "url": { + "type": "string", + "label": "Url", + "help_text": "URL for this workflow job." + }, + "related": { + "type": "object", + "label": "Related", + "help_text": "Data structure with URLs of related resources." + }, + "summary_fields": { + "type": "object", + "label": "Summary fields", + "help_text": "Data structure with name/description for related resources." + }, + "created": { + "type": "datetime", + "label": "Created", + "help_text": "Timestamp when this workflow job was created." + }, + "modified": { + "type": "datetime", + "label": "Modified", + "help_text": "Timestamp when this workflow job was last modified." + }, + "name": { + "type": "string", + "label": "Name", + "help_text": "Name of this workflow job." + }, + "description": { + "type": "string", + "label": "Description", + "help_text": "Optional description of this workflow job." + }, + "unified_job_template": { + "type": "field", + "label": "unified job template" + }, + "launch_type": { + "type": "choice", + "label": "Launch type", + "choices": [ + [ + "manual", + "Manual" + ], + [ + "relaunch", + "Relaunch" + ], + [ + "callback", + "Callback" + ], + [ + "scheduled", + "Scheduled" + ], + [ + "dependency", + "Dependency" + ], + [ + "workflow", + "Workflow" + ], + [ + "sync", + "Sync" + ] + ] + }, + "status": { + "type": "choice", + "label": "Status", + "choices": [ + [ + "new", + "New" + ], + [ + "pending", + "Pending" + ], + [ + "waiting", + "Waiting" + ], + [ + "running", + "Running" + ], + [ + "successful", + "Successful" + ], + [ + "failed", + "Failed" + ], + [ + "error", + "Error" + ], + [ + "canceled", + "Canceled" + ] + ] + }, + "failed": { + "type": "boolean", + "label": "Failed" + }, + "started": { + "type": "datetime", + "label": "Started", + "help_text": "The date and time the job was queued for starting." + }, + "finished": { + "type": "datetime", + "label": "Finished", + "help_text": "The date and time the job finished execution." + }, + "elapsed": { + "type": "decimal", + "label": "Elapsed", + "help_text": "Elapsed time in seconds that the job ran." + }, + "job_args": { + "type": "string", + "label": "Job args" + }, + "job_cwd": { + "type": "string", + "label": "Job cwd" + }, + "job_env": { + "type": "field", + "label": "job_env" + }, + "job_explanation": { + "type": "string", + "label": "Job explanation", + "help_text": "A status field to indicate the state of the job if it wasn't able to run and capture stdout" + }, + "result_stdout": { + "type": "field", + "label": "Result stdout" + }, + "execution_node": { + "type": "string", + "label": "Execution node", + "help_text": "The Tower node the job executed on." + }, + "result_traceback": { + "type": "string", + "label": "Result traceback" + }, + "workflow_job_template": { + "type": "field", + "label": "Workflow job template" + }, + "extra_vars": { + "type": "string", + "label": "Extra vars" + } + } + }, + "added_in_version": "3.1.0", + "types": [ + "workflow_job" + ] +} \ No newline at end of file diff --git a/awx/ui/tests/spec/workflow--results/workflow-results.controller-test.js b/awx/ui/tests/spec/workflow--results/workflow-results.controller-test.js new file mode 100644 index 0000000000..90bc6f582f --- /dev/null +++ b/awx/ui/tests/spec/workflow--results/workflow-results.controller-test.js @@ -0,0 +1,136 @@ +'use strict'; +import moment from 'moment'; +import workflow_job_options_json from './data/workflow_job_options.js'; +import workflow_job_json from './data/workflow_job.js'; + +describe('Controller: workflowResults', () => { + let $controller; + let workflowResults; + let $rootScope; + let ParseVariableString; + let workflowResultsService; + let $interval; + + let treeData = { + data: { + children: [] + } + }; + + beforeEach(angular.mock.module('VariablesHelper')); + + beforeEach(angular.mock.module('workflowResults', ($provide) => { + ['PromptDialog', 'Prompt', 'Wait', 'Rest', '$state', 'ProcessErrors', + 'InitiatePlaybookRun', 'jobLabels', 'workflowNodes', 'count', + ].forEach((item) => { + $provide.value(item, {}); + }); + $provide.value('$stateExtender', { addState: jasmine.createSpy('addState'), }); + $provide.value('moment', moment); + $provide.value('workflowData', workflow_job_json); + $provide.value('workflowDataOptions', workflow_job_options_json); + $provide.value('ParseTypeChange', function() {}); + $provide.value('i18n', { '_': (a) => { return a; } }); + $provide.provider('$stateProvider', { '$get': function() { return function() {} } }); + $provide.service('WorkflowService', function($q) { + return { + buildTree: function() { + var deferred = $q.defer(); + deferred.resolve(treeData); + return deferred.promise; + } + } + }); + })); + + beforeEach(angular.mock.inject(function(_$controller_, _$rootScope_, _ParseVariableString_, _workflowResultsService_, _$interval_){ + $controller = _$controller_; + $rootScope = _$rootScope_; + ParseVariableString = _ParseVariableString_; + workflowResultsService = _workflowResultsService_; + $interval = _$interval_; + + })); + + describe('elapsed timer', () => { + let scope; + + beforeEach(() => { + scope = $rootScope.$new(); + spyOn(workflowResultsService, 'createOneSecondTimer').and.callThrough(); + spyOn(workflowResultsService, 'destroyTimer').and.callThrough(); + }); + + + function jobWaitingWorkflowResultsControllerFixture(started, status) { + workflow_job_json.started = started; + workflow_job_json.status = status; + workflowResults = $controller('workflowResultsController', { + $scope: scope, + $rootScope: $rootScope, + }); + } + + describe('init()', () => { + describe('job running', () => { + beforeEach(() => { + jobWaitingWorkflowResultsControllerFixture(moment(), 'running'); + }); + + // Note: Ensuring the outside service method is called to create a timer may + // be overkill. Especially since we validate the side effect in the next test. + it('should call to start timer on load when job is already running', () => { + expect(workflowResultsService.createOneSecondTimer).toHaveBeenCalled(); + expect(workflowResultsService.createOneSecondTimer.calls.argsFor(0)[0]).toBe(workflow_job_json.started); + }); + + it('should set update scope var with elapsed time', () => { + $interval.flush(10 * 1000); + + // TODO: mock moment() so when we fast-forward time with $interval + // the system clocks seems to fast forward too. + //expect(scope.workflow.elapsed).toBe(10); + }); + + it('should call to destroy timer on destroy', () => { + scope.$destroy(); + expect(workflowResultsService.destroyTimer).toHaveBeenCalled(); + expect(workflowResultsService.destroyTimer.calls.argsFor(0)[0]).not.toBe(null); + }); + }); + + describe('job waiting', () => { + beforeEach(() => { + jobWaitingWorkflowResultsControllerFixture(null, 'waiting'); + }); + + it('should not start elapsed timer', () => { + expect(workflowResultsService.createOneSecondTimer).not.toHaveBeenCalled(); + }); + + }); + + describe('job finished', () => { + beforeEach(() => { + jobWaitingWorkflowResultsControllerFixture(moment(), 'successful'); + }); + + it('should start elapsed timer', () => { + expect(workflowResultsService.createOneSecondTimer).not.toHaveBeenCalled(); + }); + }); + }); + + describe('job transitions to running', () => { + beforeEach(() => { + jobWaitingWorkflowResultsControllerFixture(null, 'waiting'); + $rootScope.$broadcast('ws-jobs', { unified_job_id: workflow_job_json.id, status: "running" }); + }); + + it('should start elapsed timer', () => { + expect(scope.workflow.status).toBe("running"); + expect(workflowResultsService.createOneSecondTimer).toHaveBeenCalled(); + }); + }); + }); +}); \ No newline at end of file diff --git a/awx/ui/tests/spec/workflow--results/workflow-results.service-test.js b/awx/ui/tests/spec/workflow--results/workflow-results.service-test.js new file mode 100644 index 0000000000..9010de6d7f --- /dev/null +++ b/awx/ui/tests/spec/workflow--results/workflow-results.service-test.js @@ -0,0 +1,59 @@ +'use strict'; +import moment from 'moment'; + +describe('workflowResultsService', () => { + let workflowResultsService; + let $interval; + + beforeEach(angular.mock.module('workflowResults', ($provide) => { + ['PromptDialog', 'Prompt', 'Wait', 'Rest', 'ProcessErrors', 'InitiatePlaybookRun', '$state'].forEach(function(item) { + $provide.value(item, {}); + }); + $provide.value('$stateExtender', { addState: jasmine.createSpy('addState'), }); + $provide.value('moment', moment); + })); + + beforeEach(angular.mock.inject((_workflowResultsService_, _$interval_) => { + workflowResultsService = _workflowResultsService_; + $interval = _$interval_; + })); + + describe('createOneSecondTimer()', () => { + it('should create a timer that runs every second, incremented by a second', (done) => { + let ticks = 0; + let ticks_expected = 10; + + workflowResultsService.createOneSecondTimer(moment(), function(time) { + ticks += 1; + if (ticks >= ticks_expected) { + expect(ticks).toBe(ticks_expected); + // TODO: should verify time is 10 but this requires mocking moment() + // because we "artificially" accelerate time. + done(); + } + }); + + $interval.flush(ticks_expected * 1000); + }); + }); + + describe('destroyTimer()', () => { + beforeEach(() => { + $interval.cancel = jasmine.createSpy('cancel'); + }); + + it('should not destroy null timer', () => { + workflowResultsService.destroyTimer(null); + + expect($interval.cancel).not.toHaveBeenCalled(); + }); + + it('should destroy passed in timer', () => { + let timer = jasmine.createSpy('timer'); + + workflowResultsService.destroyTimer(timer); + + expect($interval.cancel).toHaveBeenCalledWith(timer); + }); + }); +}); \ No newline at end of file diff --git a/awx/ui/webpack.config.js b/awx/ui/webpack.config.js index ba5dd5d2bf..522e2061bd 100644 --- a/awx/ui/webpack.config.js +++ b/awx/ui/webpack.config.js @@ -44,115 +44,75 @@ var vendorPkgs = [ 'reconnectingwebsocket' ]; -var dev = { - entry: { - app: './client/src/app.js', - vendor: vendorPkgs - }, - output: { - path: './static/', - filename: 'tower.js' - }, - plugins: [ - // vendor shims: - // [{expected_local_var : dependency}, ...] - new webpack.ProvidePlugin({ - '$': 'jquery', - 'jQuery': 'jquery', - 'window.jQuery': 'jquery', - '_': 'lodash', - 'CodeMirror': 'codemirror', - 'jsyaml': 'js-yaml', - 'jsonlint': 'codemirror.jsonlint', - }), - // (chunkName, outfileName) - new webpack.optimize.CommonsChunkPlugin('vendor', 'tower.vendor.js'), - new webpack.DefinePlugin({ $ENV: JSON.stringify(awx_env) }) - ], - module: { - preLoaders: [{ - test: /\.js?$/, - loader: 'jshint-loader', - exclude: ['/(node_modules)/'], - include: [path.resolve() + '/client/src/'], - jshint: { - emitErrors: true +var baseConfig = function() { + return { + entry: { + app: './client/src/app.js', + vendor: vendorPkgs + }, + output: { + path: './static/', + filename: 'tower.js' + }, + plugins: [ + // vendor shims: + // [{expected_local_var : dependency}, ...] + new webpack.ProvidePlugin({ + '$': 'jquery', + 'jQuery': 'jquery', + 'window.jQuery': 'jquery', + '_': 'lodash', + 'CodeMirror': 'codemirror', + 'jsyaml': 'js-yaml', + 'jsonlint': 'codemirror.jsonlint' + }), + new webpack.optimize.CommonsChunkPlugin('vendor', 'tower.vendor.js') + ], + module: { + loaders: [{ + // disable AMD loading (broken in this lib) and default to CommonJS (not broken) + test: /\.angular-tz-extensions.js$/, + loader: 'imports?define=>false' + }, { + // es6 -> es5 + test: /\.js$/, + loader: 'babel-loader', + exclude: /(node_modules)/, + query: { + presets: ['es2015'] + } + }] + }, + resolve: { + alias: { + 'codemirror.jsonlint': path.resolve() + '/node_modules/codemirror/addon/lint/json-lint.js', + 'jquery.resize': path.resolve() + '/node_modules/javascript-detect-element-resize/jquery.resize.js', + 'select2': path.resolve() + '/node_modules/select2/dist/js/select2.full.js' } - }], - loaders: [{ - // disable AMD loading (broken in this lib) and default to CommonJS (not broken) - test: /\.angular-tz-extensions.js$/, - loader: 'imports?define=>false' - }, { - // es6 -> es5 - test: /\.js$/, - loader: 'babel-loader', - exclude: /(node_modules)/, - query: { - presets: ['es2015'] - } - }] - }, - resolve: { - alias: { - 'codemirror.jsonlint': path.resolve() + '/node_modules/codemirror/addon/lint/json-lint.js', - 'jquery.resize': path.resolve() + '/node_modules/javascript-detect-element-resize/jquery.resize.js', - 'select2': path.resolve() + '/node_modules/select2/dist/js/select2.full.js' } - }, - devtool: 'inline-source-map', - watch: true, + }; }; -var release = { - entry: { - app: './client/src/app.js', - vendor: vendorPkgs - }, - output: { - path: './static/', - filename: 'tower.js' - }, - plugins: [ - // vendor shims: - // [{expected_local_var : dependency}, ...] - new webpack.ProvidePlugin({ - $: 'jquery', - jQuery: 'jquery', - 'window.jQuery': 'jquery', - _: 'lodash', - 'CodeMirror': 'codemirror', - 'jsyaml': 'js-yaml', - 'jsonlint': 'codemirror.jsonlint' - }), - new webpack.DefinePlugin({ $ENV: {} }), - new webpack.optimize.CommonsChunkPlugin('vendor', 'tower.vendor.js'), - new webpack.optimize.UglifyJsPlugin({ - mangle: false - }) - ], - module: { - loaders: [{ - // disable AMD loading (broken in this lib) and default to CommonJS (not broken) - test: /\.angular-tz-extensions.js$/, - loader: 'imports?define=>false!' - }, { - // es6 -> es5 - test: /\.js$/, - loader: 'babel-loader', - exclude: /(node_modules)/, - query: { - presets: ['es2015'] - } - }, ] - }, - resolve: { - alias: { - 'codemirror.jsonlint': path.resolve() + '/node_modules/codemirror/addon/lint/json-lint.js', - 'jquery.resize': path.resolve() + '/node_modules/javascript-detect-element-resize/jquery.resize.js', - 'select2': path.resolve() + '/node_modules/select2/dist/js/select2.full.js' +var dev = baseConfig(); + +dev.devtool = 'inline-source-map'; +dev.watch = true; +dev.plugins.push(new webpack.DefinePlugin({ $ENV: JSON.stringify(awx_env) })); +dev.module.preLoaders = [ + { + test: /\.js?$/, + loader: 'jshint-loader', + exclude: ['/(node_modules)/'], + include: [path.resolve() + '/client/src/'], + jshint: { + emitErrors: true } } -}; +]; + +var release = baseConfig(); + +release.plugins.push(new webpack.DefinePlugin({ $ENV: {} })); +release.plugins.push(new webpack.optimize.UglifyJsPlugin({ mangle: false })); module.exports = { dev: dev, release: release }; diff --git a/docs/build_system.md b/docs/build_system.md index fff0900141..94400a99c2 100644 --- a/docs/build_system.md +++ b/docs/build_system.md @@ -239,7 +239,7 @@ Repositories The nightly repositories are hosted on the AnsibleWorks Jenkins server, and can be found at the following location: - http://jenkins.testing.ansible.com/ansible-tower_nightlies_RTYUIOPOIUYTYU/devel + http://jenkins.testing.ansible.com/ansible-tower_nightlies_f8b8c5588b2505970227a7b0900ef69040ad5a00/devel There are several sub-folders, including `deb/`, `rpm/`, `docs/` and `setup/` @@ -260,7 +260,7 @@ The `setup/` folder contains the Ansible Tower setup playbook tar.gz file. These nightly repositories can be used by the Ansible Tower setup playbook by running the `setup.sh` shell script with the following option: - ./setup.sh -e "aw_repo_url=http://jenkins.testing.ansible.com/ansible-tower_nightlies_RTYUIOPOIUYTYU/devel gpgcheck=0" + ./setup.sh -e "aw_repo_url=http://jenkins.testing.ansible.com/ansible-tower_nightlies_f8b8c5588b2505970227a7b0900ef69040ad5a00/devel gpgcheck=0" ### Official Releases ### diff --git a/docs/process_isolation.md b/docs/process_isolation.md new file mode 100644 index 0000000000..e6e8bd4619 --- /dev/null +++ b/docs/process_isolation.md @@ -0,0 +1,38 @@ +## Process Isolation Overview + +In older version of Ansible Tower we used a system called `proot` to isolate tower job processes from the rest of the system. + +For Tower 3.1 and later we have switched to using `bubblewrap` which is a much lighter weight and maintained process isolation system. + +### Activating Process Isolation + +By default `bubblewrap` is enabled, this can be turned off via Tower Config or from a tower settings file: + + AWX_PROOT_ENABLED = False + +Process isolation, when enabled, will be used for the following Job Types: + +* Job Templates - Launching jobs from regular job templates +* Ad-hoc Commands - Launching ad-hoc commands against one or more hosts in inventory + +### Tunables + +Process Isolation will, by default, hide the following directories from the tasks mentioned above: + +* /etc/tower - To prevent exposing Tower configuration +* /var/lib/awx - With the exception of the current project being used (for regular job templates) +* /var/log +* /tmp (or whatever the system temp dir is) - With the exception of the processes's own temp files + +If there is other information on the system that is sensitive and should be hidden that can be added via the Tower Configuration Screen +or by updating the following entry in a tower settings file: + + AWX_PROOT_HIDE_PATHS = ['/list/of/', '/paths'] + +If there are any directories that should specifically be exposed that can be set in a similar way: + + AWX_PROOT_SHOW_PATHS = ['/list/of/', '/paths'] + +By default the system will use the system's tmp dir (/tmp by default) as it's staging area. This can be changed: + + AWX_PROOT_BASE_PATH = "/opt/tmp" diff --git a/tools/data_generators/presets.tsv b/tools/data_generators/presets.tsv index c07e33fd13..ef4a0f8ffa 100644 --- a/tools/data_generators/presets.tsv +++ b/tools/data_generators/presets.tsv @@ -1,15 +1,15 @@ -resource medium Jan2017 jobs1k jobs10k jobs50k jobs100k -organizations 500 1 1 1 1 1 -users 5000 3 3 3 3 3 -teams 500 2 2 2 2 2 -projects 1000 30 30 30 30 30 -job_templates 2000 127 127 127 127 127 -credentials 2000 50 50 50 50 50 -inventories 2000 6 6 6 6 6 -inventory_groups 500 15 15 15 15 15 -inventory_hosts 2500 15 15 15 15 15 -wfjts 100 0 0 0 0 0 -nodes 1000 0 0 0 0 0 -labels 1000 0 0 0 0 0 -jobs 1000 157208 1000 10000 50000 100000 -job_events 1000 3370942 20000 200000 1000000 2000000 \ No newline at end of file +resource small medium Jan2017 jobs1k jobs10k jobs50k jobs100k jobs200k +organizations 50 500 1 1 1 1 1 1 +users 500 5000 3 3 3 3 3 3 +teams 200 500 2 2 2 2 2 2 +projects 150 1000 30 30 30 30 30 30 +job_templates 300 2000 127 127 127 127 127 127 +credentials 150 2000 50 50 50 50 50 50 +inventories 150 2000 6 6 6 6 6 6 +inventory_groups 700 500 15 15 15 15 15 15 +inventory_hosts 1100 2500 15 15 15 15 15 15 +wfjts 50 100 0 0 0 0 0 0 +nodes 1000 1000 0 0 0 0 0 0 +labels 1000 1000 0 0 0 0 0 0 +jobs 2000 5000 157208 1000 10000 50000 100000 200000 +job_events 40000 100000 3370942 20000 200000 1000000 2000000 4000000 \ No newline at end of file diff --git a/tools/data_generators/rbac_dummy_data_generator.py b/tools/data_generators/rbac_dummy_data_generator.py index 5907e7a34a..b7bc2c7720 100755 --- a/tools/data_generators/rbac_dummy_data_generator.py +++ b/tools/data_generators/rbac_dummy_data_generator.py @@ -40,6 +40,11 @@ from django.db import transaction # noqa # awx from awx.main.models import * # noqa +from awx.main.signals import ( # noqa + emit_update_inventory_on_created_or_deleted, + emit_update_inventory_computed_fields +) +from django.db.models.signals import post_save, post_delete, m2m_changed # noqa option_list = [ @@ -182,9 +187,32 @@ def mock_save(self, *args, **kwargs): return super(PrimordialModel, self).save(*args, **kwargs) +def mock_computed_fields(self, **kwargs): + pass + + PrimordialModel.save = mock_save +sigstat = [] +sigstat.append(post_save.disconnect(emit_update_inventory_on_created_or_deleted, sender=Host)) +sigstat.append(post_delete.disconnect(emit_update_inventory_on_created_or_deleted, sender=Host)) +sigstat.append(post_save.disconnect(emit_update_inventory_on_created_or_deleted, sender=Group)) +sigstat.append(post_delete.disconnect(emit_update_inventory_on_created_or_deleted, sender=Group)) +sigstat.append(m2m_changed.disconnect(emit_update_inventory_computed_fields, sender=Group.hosts.through)) +sigstat.append(m2m_changed.disconnect(emit_update_inventory_computed_fields, sender=Group.parents.through)) +sigstat.append(m2m_changed.disconnect(emit_update_inventory_computed_fields, sender=Host.inventory_sources.through)) +sigstat.append(m2m_changed.disconnect(emit_update_inventory_computed_fields, sender=Group.inventory_sources.through)) +sigstat.append(post_save.disconnect(emit_update_inventory_on_created_or_deleted, sender=InventorySource)) +sigstat.append(post_delete.disconnect(emit_update_inventory_on_created_or_deleted, sender=InventorySource)) +sigstat.append(post_save.disconnect(emit_update_inventory_on_created_or_deleted, sender=Job)) +sigstat.append(post_delete.disconnect(emit_update_inventory_on_created_or_deleted, sender=Job)) + +print ' status of signal disconnects ' +print ' (True means successful disconnect)' +print str(sigstat) + + startTime = datetime.now() @@ -594,6 +622,8 @@ try: print('# Adding labels to job templates') jt_idx = 0 for n in spread(n_labels * 7, n_job_templates): + if n == 0: + continue jt = job_templates[jt_idx] if not jt._is_new: continue @@ -676,17 +706,24 @@ try: # Check if job already has events, for idempotence if not job._is_new: continue - sys.stdout.write('\r Creating %d job events for job %d' % (n, job.id)) - sys.stdout.flush() - JobEvent.objects.bulk_create([ - JobEvent( - created=now(), - modified=now(), - job=job, - event='runner_on_ok' - ) - for i in range(n) - ]) + # Bulk create in chunks with maximum chunk size + MAX_BULK_CREATE = 100 + for j in range((n / MAX_BULK_CREATE) + 1): + n_subgroup = MAX_BULK_CREATE + if j == n / MAX_BULK_CREATE: + # on final pass, create the remainder + n_subgroup = n % MAX_BULK_CREATE + sys.stdout.write('\r Creating %d job events for job %d, subgroup: %d' % (n, job.id, j)) + sys.stdout.flush() + JobEvent.objects.bulk_create([ + JobEvent( + created=now(), + modified=now(), + job=job, + event='runner_on_ok' + ) + for i in range(n_subgroup) + ]) job_idx += 1 if n: print('') diff --git a/tools/docker-compose.yml b/tools/docker-compose.yml index e97591be1e..edcddcbe43 100644 --- a/tools/docker-compose.yml +++ b/tools/docker-compose.yml @@ -9,11 +9,13 @@ services: RABBITMQ_USER: guest RABBITMQ_PASS: guest RABBITMQ_VHOST: / + CELERY_RDB_HOST: 0.0.0.0 ports: - "8080:8080" - "5555:5555" - "8013:8013" - "8043:8043" + - "6899-6999:6899-6999" # default port range for celery.contrib.rdb links: - postgres - memcached diff --git a/tools/docker-compose/Dockerfile b/tools/docker-compose/Dockerfile index 2cd053f0fb..19b699ab36 100644 --- a/tools/docker-compose/Dockerfile +++ b/tools/docker-compose/Dockerfile @@ -1,9 +1,5 @@ FROM centos:7 -# RUN locale-gen en_US.UTF-8 -# ENV LANG en_US.UTF-8 -# ENV LANGUAGE en_US:en -# ENV LC_ALL en_US.UTF-8 ADD Makefile /tmp/Makefile RUN mkdir /tmp/requirements ADD requirements/requirements.txt \ @@ -16,7 +12,7 @@ requirements/requirements_dev_uninstall.txt \ RUN yum -y update && yum -y install curl epel-release RUN curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - RUN yum -y localinstall http://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-3.noarch.rpm -RUN yum -y update && yum -y install openssh-server ansible mg vim tmux git mercurial subversion python-devel python-psycopg2 make postgresql postgresql-devel nginx nodejs python-psutil libxml2-devel libxslt-devel libstdc++.so.6 gcc cyrus-sasl-devel cyrus-sasl openldap-devel libffi-devel zeromq-devel python-pip xmlsec1-devel swig krb5-devel xmlsec1-openssl xmlsec1 xmlsec1-openssl-devel libtool-ltdl-devel rabbitmq-server bubblewrap zanata-python-client gettext +RUN yum -y update && yum -y install openssh-server ansible mg vim tmux git mercurial subversion python-devel python-psycopg2 make postgresql postgresql-devel nginx nodejs python-psutil libxml2-devel libxslt-devel libstdc++.so.6 gcc cyrus-sasl-devel cyrus-sasl openldap-devel libffi-devel zeromq-devel python-pip xmlsec1-devel swig krb5-devel xmlsec1-openssl xmlsec1 xmlsec1-openssl-devel libtool-ltdl-devel rabbitmq-server bubblewrap zanata-python-client gettext gcc-c++ RUN pip install virtualenv RUN /usr/bin/ssh-keygen -q -t rsa -N "" -f /root/.ssh/id_rsa RUN mkdir -p /etc/tower @@ -35,6 +31,10 @@ RUN openssl req -nodes -newkey rsa:2048 -keyout /etc/nginx/nginx.key -out /etc/n RUN openssl x509 -req -days 365 -in /etc/nginx/nginx.csr -signkey /etc/nginx/nginx.key -out /etc/nginx/nginx.crt WORKDIR /tmp RUN SWIG_FEATURES="-cpperraswarn -includeall -D__`uname -m`__ -I/usr/include/openssl" VENV_BASE="/venv" make requirements_dev +RUN localedef -c -i en_US -f UTF-8 en_US.UTF-8 +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 WORKDIR / EXPOSE 8043 8013 8080 22 ENTRYPOINT ["/usr/bin/dumb-init"] diff --git a/tools/docker-compose/unit-tests/docker-compose.yml b/tools/docker-compose/unit-tests/docker-compose.yml index e878fbc419..6cb9096ec9 100644 --- a/tools/docker-compose/unit-tests/docker-compose.yml +++ b/tools/docker-compose/unit-tests/docker-compose.yml @@ -8,7 +8,7 @@ services: image: gcr.io/ansible-tower-engineering/unit-test-runner:latest environment: SWIG_FEATURES: "-cpperraswarn -includeall -I/usr/include/openssl" - TEST_DIRS: awx/main/tests/functional awx/main/tests/unit + TEST_DIRS: awx/main/tests/functional awx/main/tests/unit awx/conf/tests awx/sso/tests command: ["make test"] volumes: - ../../../:/tower_devel diff --git a/tools/scripts/request_tower_configuration.sh b/tools/scripts/request_tower_configuration.sh index 5e13e34414..05d75a69dd 100755 --- a/tools/scripts/request_tower_configuration.sh +++ b/tools/scripts/request_tower_configuration.sh @@ -20,16 +20,14 @@ OPTIONS: -c Host config key (required) -t Job template ID (required) -e Extra variables - -s Number of seconds between retries (default: ${NUM_SECONDS}) EOF } # Initialize variables INSECURE="" -NUM_SECONDS=60 # Parse arguments -while getopts “hks:c:t:s:” OPTION +while getopts “hks:c:t:s:e:” OPTION do case ${OPTION} in h) @@ -51,9 +49,6 @@ do e) EXTRA_VARS=${OPTARG} ;; - 2) - NUM_SECONDS=${OPTARG} - ;; ?) usage exit diff --git a/tox.ini b/tox.ini index 14726b2bd0..cc7b0f1012 100644 --- a/tox.ini +++ b/tox.ini @@ -48,7 +48,7 @@ commands = python setup.py develop # coverage run --help # coverage run -p --source awx/main/tests -m pytest {posargs} - py.test awx/main/tests {posargs:-k 'not old'} + py.test awx/main/tests awx/conf/tests awx/sso/tests {posargs:-k 'not old'} [testenv:ui] deps =