diff --git a/python/GafferArnoldUI/ArnoldAOVShaderUI.py b/python/GafferArnoldUI/ArnoldAOVShaderUI.py index 3f1c97c2837..3400aa8d21b 100644 --- a/python/GafferArnoldUI/ArnoldAOVShaderUI.py +++ b/python/GafferArnoldUI/ArnoldAOVShaderUI.py @@ -39,25 +39,26 @@ import Gaffer import GafferUI import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldAOVShader, "description", - """ + _(""" Sets up global shaders in the Arnold options which can be used to populate global AOVs. - """, + """), plugs = { "optionSuffix" : { "description" : - """ + _(""" This suffix defines where the aov shader is stored in the render options. If you use an existing suffix, you will overwrite instead of creating a new AOV shader. - """, + """), }, } diff --git a/python/GafferArnoldUI/ArnoldAtmosphereUI.py b/python/GafferArnoldUI/ArnoldAtmosphereUI.py index 7305ada599d..fa732db35ba 100644 --- a/python/GafferArnoldUI/ArnoldAtmosphereUI.py +++ b/python/GafferArnoldUI/ArnoldAtmosphereUI.py @@ -36,17 +36,18 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldAtmosphere, "description", - """ + _(""" Assigns a global atmosphere shader that applies to all objects in the scene. This is stored as an "ai:atmosphere" option in Gaffer's globals, and translated onto the `options.atmosphere` parameter in Arnold. - """, + """), ) diff --git a/python/GafferArnoldUI/ArnoldAttributesUI.py b/python/GafferArnoldUI/ArnoldAttributesUI.py index 6e3b7276cc0..20803f36dbb 100644 --- a/python/GafferArnoldUI/ArnoldAttributesUI.py +++ b/python/GafferArnoldUI/ArnoldAttributesUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI import GafferArnold +from GafferUI.i18n import _ def __visibilitySummary( plug ) : @@ -57,10 +58,10 @@ def __visibilitySummary( plug ) : ) : if plug["ai:visibility:" + childName]["enabled"].getValue() : - info.append( label + ( " On" if plug["ai:visibility:" + childName]["value"].getValue() else " Off" ) ) + info.append( label + ( " " + _("On") if plug["ai:visibility:" + childName]["value"].getValue() else " " + _("Off") ) ) if plug["ai:visibility:shadow_group"]["enabled"].getValue() : - info.append( "ShadowGroup Applied" ) + info.append( _("ShadowGroup Applied") ) return ", ".join( info ) @@ -83,7 +84,7 @@ def __autoBumpVisibilitySummary( plug ) : ) : if plug["ai:autobump_visibility:" + childName]["enabled"].getValue() : - info.append( label + ( " On" if plug["ai:autobump_visibility:" + childName]["value"].getValue() else " Off" ) ) + info.append( label + ( " " + _("On") if plug["ai:autobump_visibility:" + childName]["value"].getValue() else " " + _("Off") ) ) return ", ".join( info ) @@ -92,7 +93,7 @@ def __transformSummary( plug ) : info = [] if plug["ai:transform_type"]["enabled"].getValue() : - info.append( "Transform Type " + __transformTypeEnumNames[ plug["ai:transform_type"]["value"].getValue() ] ) + info.append( _("Transform Type") + " " + __transformTypeEnumNames[ plug["ai:transform_type"]["value"].getValue() ] ) return ", ".join( info ) @@ -106,10 +107,10 @@ def __shadingSummary( plug ) : ( "ai:self_shadows", "Self Shadows" ), ) : if plug[childName]["enabled"].getValue() : - info.append( label + ( " On" if plug[childName]["value"].getValue() else " Off" ) ) + info.append( label + ( " " + _("On") if plug[childName]["value"].getValue() else " " + _("Off") ) ) if plug["ai:sss_setname"]["enabled"].getValue() : - info.append( "SSS Set Name " + plug["ai:sss_setname"]["value"].getValue() ) + info.append( _("SSS Set Name") + " " + plug["ai:sss_setname"]["value"].getValue() ) return ", ".join( info ) @@ -117,9 +118,9 @@ def __subdivisionSummary( plug ) : info = [] if plug["ai:polymesh:subdiv_iterations"]["enabled"].getValue() : - info.append( "Iterations %d" % plug["ai:polymesh:subdiv_iterations"]["value"].getValue() ) + info.append( _("Iterations %d") % plug["ai:polymesh:subdiv_iterations"]["value"].getValue() ) if plug["ai:polymesh:subdiv_adaptive_error"]["enabled"].getValue() : - info.append( "Error %s" % GafferUI.NumericWidget.valueToString( plug["ai:polymesh:subdiv_adaptive_error"]["value"].getValue() ) ) + info.append( _("Error %s") % GafferUI.NumericWidget.valueToString( plug["ai:polymesh:subdiv_adaptive_error"]["value"].getValue() ) ) if plug["ai:polymesh:subdiv_adaptive_metric"]["enabled"].getValue() : info.append( string.capwords( plug["ai:polymesh:subdiv_adaptive_metric"]["value"].getValue().replace( "_", " " ) ) + " Metric" ) if plug["ai:polymesh:subdiv_adaptive_space"]["enabled"].getValue() : @@ -134,11 +135,11 @@ def __subdivisionSummary( plug ) : }.get( plug["ai:polymesh:subdiv_uv_smoothing"]["value"].getValue() ) ) if plug["ai:polymesh:subdiv_smooth_derivs"]["enabled"].getValue() : - info.append( "Smooth Derivs " + ( "On" if plug["ai:polymesh:subdiv_smooth_derivs"]["value"].getValue() else "Off" ) ) + info.append( _("Smooth Derivs") + " " + ( _("On") if plug["ai:polymesh:subdiv_smooth_derivs"]["value"].getValue() else _("Off") ) ) if plug["ai:polymesh:subdiv_frustum_ignore"]["enabled"].getValue() : - info.append( "Frustum Ignore " + ( "On" if plug["ai:polymesh:subdiv_frustum_ignore"]["value"].getValue() else "Off" ) ) + info.append( _("Frustum Ignore") + " " + ( _("On") if plug["ai:polymesh:subdiv_frustum_ignore"]["value"].getValue() else _("Off") ) ) if plug["ai:polymesh:subdivide_polygons"]["enabled"].getValue() : - info.append( "Subdivide Polygons " + ( "On" if plug["ai:polymesh:subdivide_polygons"]["value"].getValue() else "Off" ) ) + info.append( _("Subdivide Polygons") + " " + ( _("On") if plug["ai:polymesh:subdivide_polygons"]["value"].getValue() else _("Off") ) ) return ", ".join( info ) @@ -148,7 +149,7 @@ def __curvesSummary( plug ) : if plug["ai:curves:mode"]["enabled"].getValue() : info.append( string.capwords( plug["ai:curves:mode"]["value"].getValue() ) ) if plug["ai:curves:min_pixel_width"]["enabled"].getValue() : - info.append( "Min Pixel Width %s" % GafferUI.NumericWidget.valueToString( plug["ai:curves:min_pixel_width"]["value"].getValue() ) ) + info.append( _("Min Pixel Width %s") % GafferUI.NumericWidget.valueToString( plug["ai:curves:min_pixel_width"]["value"].getValue() ) ) return ", ".join( info ) @@ -156,7 +157,7 @@ def __pointsSummary( plug ) : info = [] if plug["ai:points:min_pixel_width"]["enabled"].getValue() : - info.append( "Min Pixel Width {}".format( GafferUI.NumericWidget.valueToString( plug["ai:points:min_pixel_width"]["value"].getValue() ) ) ) + info.append( _("Min Pixel Width {}").format( GafferUI.NumericWidget.valueToString( plug["ai:points:min_pixel_width"]["value"].getValue() ) ) ) return ", ".join( info ) @@ -164,21 +165,21 @@ def __volumeSummary( plug ) : info = [] if plug["ai:volume:step_scale"]["enabled"].getValue() : - info.append( "Volume Step Scale %s" % GafferUI.NumericWidget.valueToString( plug["ai:volume:step_scale"]["value"].getValue() ) ) + info.append( _("Volume Step Scale %s") % GafferUI.NumericWidget.valueToString( plug["ai:volume:step_scale"]["value"].getValue() ) ) if plug["ai:volume:step_size"]["enabled"].getValue() : - info.append( "Volume Step Size %s" % GafferUI.NumericWidget.valueToString( plug["ai:volume:step_size"]["value"].getValue() ) ) + info.append( _("Volume Step Size %s") % GafferUI.NumericWidget.valueToString( plug["ai:volume:step_size"]["value"].getValue() ) ) if plug["ai:shape:step_scale"]["enabled"].getValue() : - info.append( "Shape Step Scale %s" % GafferUI.NumericWidget.valueToString( plug["ai:shape:step_scale"]["value"].getValue() ) ) + info.append( _("Shape Step Scale %s") % GafferUI.NumericWidget.valueToString( plug["ai:shape:step_scale"]["value"].getValue() ) ) if plug["ai:shape:step_size"]["enabled"].getValue() : - info.append( "Shape Step Size %s" % GafferUI.NumericWidget.valueToString( plug["ai:shape:step_size"]["value"].getValue() ) ) + info.append( _("Shape Step Size %s") % GafferUI.NumericWidget.valueToString( plug["ai:shape:step_size"]["value"].getValue() ) ) if plug["ai:shape:volume_padding"]["enabled"].getValue() : - info.append( "Padding %s" % GafferUI.NumericWidget.valueToString( plug["ai:shape:volume_padding"]["value"].getValue() ) ) + info.append( _("Padding %s") % GafferUI.NumericWidget.valueToString( plug["ai:shape:volume_padding"]["value"].getValue() ) ) if plug["ai:volume:velocity_scale"]["enabled"].getValue() : - info.append( "Velocity Scale %s" % GafferUI.NumericWidget.valueToString( plug["ai:volume:velocity_scale"]["value"].getValue() ) ) + info.append( _("Velocity Scale %s") % GafferUI.NumericWidget.valueToString( plug["ai:volume:velocity_scale"]["value"].getValue() ) ) if plug["ai:volume:velocity_fps"]["enabled"].getValue() : - info.append( "Velocity FPS %s" % GafferUI.NumericWidget.valueToString( plug["ai:volume:velocity_fps"]["value"].getValue() ) ) + info.append( _("Velocity FPS %s") % GafferUI.NumericWidget.valueToString( plug["ai:volume:velocity_fps"]["value"].getValue() ) ) if plug["ai:volume:velocity_outlier_threshold"]["enabled"].getValue() : - info.append( "Velocity Outlier Threshold %s" % GafferUI.NumericWidget.valueToString( plug["ai:volume:velocity_outlier_threshold"]["value"].getValue() ) ) + info.append( _("Velocity Outlier Threshold %s") % GafferUI.NumericWidget.valueToString( plug["ai:volume:velocity_outlier_threshold"]["value"].getValue() ) ) return ", ".join( info ) @@ -186,7 +187,7 @@ def __toonSummary( plug ) : info = [] if plug["ai:toon_id"]["enabled"].getValue() : - info.append( "Toon Id " + plug["ai:toon_id"]["value"].getValue() ) + info.append( _("Toon Id") + " " + plug["ai:toon_id"]["value"].getValue() ) return ", ".join( info ) @@ -195,9 +196,9 @@ def __toonSummary( plug ) : GafferArnold.ArnoldAttributes, "description", - """ + _(""" Applies Arnold attributes to objects in the scene. - """, + """), plugs = { diff --git a/python/GafferArnoldUI/ArnoldBackgroundUI.py b/python/GafferArnoldUI/ArnoldBackgroundUI.py index fc3bf19514c..77a439f4cdb 100644 --- a/python/GafferArnoldUI/ArnoldBackgroundUI.py +++ b/python/GafferArnoldUI/ArnoldBackgroundUI.py @@ -36,16 +36,17 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldBackground, "description", - """ + _(""" Assigns a background shader. This is stored as an "ai:background" option in Gaffer's globals, and translated onto the `options.background` parameter in Arnold. - """, + """), ) diff --git a/python/GafferArnoldUI/ArnoldCameraShadersUI.py b/python/GafferArnoldUI/ArnoldCameraShadersUI.py index 2c19b6abde5..c9d43003575 100644 --- a/python/GafferArnoldUI/ArnoldCameraShadersUI.py +++ b/python/GafferArnoldUI/ArnoldCameraShadersUI.py @@ -36,16 +36,17 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldCameraShaders, "description", - """ + _(""" Creates shaders for use with Arnold cameras. Use a ShaderAssignment node to assign the shaders to the cameras they should affect. - """, + """), plugs = { @@ -58,14 +59,14 @@ "filterMap" : { "description" : - """ + _(""" A shader used to weight the samples taken by an Arnold camera. This can be used to create vignetting effects or to completely mask out areas of the render, causing no rays to be fired for those pixels. The shader is evaluated across a 0-1 UV range that is mapped to the camera's screen space. - """, + """), "nodule:type" : "GafferUI::StandardNodule", "noduleLayout:section" : "left", @@ -75,12 +76,12 @@ "uvRemap" : { "description" : - """ + _(""" A shader used to simulate lens distortion effects. The shader is evaluated across a 0-1 UV range that is mapped to the camera's screen space, and should output a red/green UV image of distorted UV positions. - """, + """), "nodule:type" : "GafferUI::StandardNodule", "noduleLayout:section" : "left", diff --git a/python/GafferArnoldUI/ArnoldColorManagerUI.py b/python/GafferArnoldUI/ArnoldColorManagerUI.py index b2884611f97..3a1bb0f22f4 100644 --- a/python/GafferArnoldUI/ArnoldColorManagerUI.py +++ b/python/GafferArnoldUI/ArnoldColorManagerUI.py @@ -40,6 +40,7 @@ import GafferUI import GafferImageUI import GafferArnold +from GafferUI.i18n import _ def __parameterUserDefault( plug ) : @@ -97,10 +98,10 @@ def __colorSpacePlugValueWidget( plug ) : GafferArnold.ArnoldColorManager, "description", - """ + _(""" Specifies the colour manager to be used in Arnold renders. This is represented in the scene as an option called `ai:color_manager`. - """, + """), plugs = { @@ -109,9 +110,9 @@ def __colorSpacePlugValueWidget( plug ) : "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "description" : - """ + _(""" The parameters for the colour manager. - """, + """), }, diff --git a/python/GafferArnoldUI/ArnoldDisplacementUI.py b/python/GafferArnoldUI/ArnoldDisplacementUI.py index cd59275d0a5..ed082ae3ed3 100644 --- a/python/GafferArnoldUI/ArnoldDisplacementUI.py +++ b/python/GafferArnoldUI/ArnoldDisplacementUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldDisplacement, "description", - """ + _(""" Creates displacements to be applied to meshes for rendering in Arnold. A displacement consists of a shader to provide the displacement map and several @@ -53,7 +54,7 @@ settings of the mesh, which in turn controls the detail of the displacement. Use a ShaderAssignment node to assign the ArnoldDisplacement to specific objects. - """, + """), "layout:activator:autoBumpVisibility", lambda node : not node["autoBump"].isSetToDefault(), @@ -70,12 +71,12 @@ "map" : { "description" : - """ + _(""" The Arnold shader that provides the displacement map. Connect a float or colour input to displace along the object normals or a vector input to displace in a specific direction. - """, + """), "nodule:type" : "GafferUI::StandardNodule", "noduleLayout:section" : "left", @@ -85,10 +86,10 @@ "height" : { "description" : - """ + _(""" Controls the amount of displacement. Only used when performing displacement along the normal. - """, + """), "nodule:type" : "", @@ -97,7 +98,7 @@ "padding" : { "description" : - """ + _(""" Padding added to an object's bounding box to take into account displacement. Arnold will subdivide and displace an object the first time a ray intersects @@ -105,7 +106,7 @@ parts of the object will be clipped. If the padding is too large, rendertime will suffer and Arnold will emit a warning message. - """, + """), "nodule:type" : "", @@ -114,13 +115,13 @@ "zeroValue" : { "description" : - """ + _(""" Defines a value that will cause no displacement to occur. For instance, if the displacement map contains a greyscale noise between 0 and 1, a zero value of 0.5 will mean that the displacement pushes into the object in some places and out in others. - """, + """), "nodule:type" : "", @@ -129,11 +130,11 @@ "autoBump" : { "description" : - """ + _(""" Automatically turns the details of the displacement map into bump, wherever the mesh is not subdivided enough to properly capture them. - """, + """), "nodule:type" : "", "layout:visibilityActivator" : "autoBumpVisibility", diff --git a/python/GafferArnoldUI/ArnoldImagerUI.py b/python/GafferArnoldUI/ArnoldImagerUI.py index 073639132a2..acd4f16c3b0 100644 --- a/python/GafferArnoldUI/ArnoldImagerUI.py +++ b/python/GafferArnoldUI/ArnoldImagerUI.py @@ -36,32 +36,33 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldImager, "description", - """ + _(""" Assigns an imager. This is stored as an `ai:imager` option in Gaffer's globals, and applied to all render outputs. > Tip : Use the `layer_selection` parameter on each imager to control > which AOVs the imager applies to. - """, + """), plugs = { "imager" : { "description" : - """ + _(""" The imager to be assigned. The output of an ArnoldShader node holding an imager should be connected here. Multiple imagers may be assigned at once by chaining them together via their `input` parameters, and then assigning the final imager via the ArnoldImager node. - """, + """), "noduleLayout:section" : "left", "nodule:type" : "GafferUI::StandardNodule", @@ -71,7 +72,7 @@ "mode" : { "description" : - """ + _(""" The mode used to combine the `imager` input with any imagers that already exist in the globals. @@ -81,7 +82,7 @@ any pre-existing imagers. - InsertLast : Inserts the new imagers so that they will be run after any pre-existing imagers. - """, + """), "preset:Replace" : GafferArnold.ArnoldImager.Mode.Replace, "preset:InsertFirst" : GafferArnold.ArnoldImager.Mode.InsertFirst, diff --git a/python/GafferArnoldUI/ArnoldLightFilterUI.py b/python/GafferArnoldUI/ArnoldLightFilterUI.py index b809a9727fc..575ba418d27 100644 --- a/python/GafferArnoldUI/ArnoldLightFilterUI.py +++ b/python/GafferArnoldUI/ArnoldLightFilterUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( @@ -44,11 +45,11 @@ "description", - """ + _(""" LightFilter that can be positioned in space to filter light in a particular region. Note that this is a non-physical effect. LightFilters need to get linked to lights which you can do via a StandardAttributes node. - """, + """), plugs = { @@ -57,11 +58,11 @@ "parameters.shader" : { "description" : - """ + _(""" Shader to be used for the light_blocker filter. UVs are only available if the geometry type is set to "box". Shading will need to be based on P otherwise. - """, + """), }, diff --git a/python/GafferArnoldUI/ArnoldMeshLightUI.py b/python/GafferArnoldUI/ArnoldMeshLightUI.py index d5ee3119b56..6af1e276ff7 100644 --- a/python/GafferArnoldUI/ArnoldMeshLightUI.py +++ b/python/GafferArnoldUI/ArnoldMeshLightUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ def __shaderMetadata( plug, name ) : @@ -48,21 +49,21 @@ def __shaderMetadata( plug, name ) : GafferArnold.ArnoldMeshLight, "description", - """ + _(""" Turns mesh primitives into Arnold mesh lights by assigning a mesh_light shader, turning off all visibility except for camera rays, and adding the meshes to the default lights set. - """, + """), plugs = { "cameraVisibility" : { "description" : - """ + _(""" Whether or not the mesh light is visible to camera rays. - """, + """), "nameValuePlugPlugValueWidget:ignoreNamePlug" : True, @@ -71,10 +72,10 @@ def __shaderMetadata( plug, name ) : "parameters" : { "description" : - """ + _(""" The parameters of the Arnold mesh_light shader that is applied to the meshes. - """, + """), ## \todo Extend the Metadata API so we can register a provider for "*", # which can automatically transfer all internal metadata. @@ -88,10 +89,10 @@ def __shaderMetadata( plug, name ) : "parameters.*" : { "description" : - """ + _(""" Refer to Arnold's documentation for the mesh_light shader. - """, + """), "nodule:type" : functools.partial( __shaderMetadata, name = "nodule:type" ), "noduleLayout:section" : functools.partial( __shaderMetadata, name = "noduleLayout:section" ), @@ -105,12 +106,12 @@ def __shaderMetadata( plug, name ) : "defaultLight" : { "description" : - """ + _(""" Whether this light illuminates all geometry by default. When toggled, the light will be added to the \"defaultLights\" set, which can be referenced in set expressions and manipulated by downstream nodes. - """, + """), "layout:section" : "Light Linking", diff --git a/python/GafferArnoldUI/ArnoldOptionsUI.py b/python/GafferArnoldUI/ArnoldOptionsUI.py index 00b3f63380f..e1c516ec14f 100644 --- a/python/GafferArnoldUI/ArnoldOptionsUI.py +++ b/python/GafferArnoldUI/ArnoldOptionsUI.py @@ -38,113 +38,114 @@ import Gaffer import GafferUI import GafferArnold +from GafferUI.i18n import _ def __renderingSummary( plug ) : info = [] if plug["ai:bucket_size"]["enabled"].getValue() : - info.append( "Bucket Size %d" % plug["ai:bucket_size"]["value"].getValue() ) + info.append( _("Bucket Size %d") % plug["ai:bucket_size"]["value"].getValue() ) if plug["ai:bucket_scanning"]["enabled"].getValue() : - info.append( "Bucket Scanning %s" % plug["ai:bucket_scanning"]["value"].getValue().capitalize() ) + info.append( _("Bucket Scanning %s") % plug["ai:bucket_scanning"]["value"].getValue().capitalize() ) if plug["ai:parallel_node_init"]["enabled"].getValue() : - info.append( "Parallel Init %s" % ( "On" if plug["ai:parallel_node_init"]["value"].getValue() else "Off" ) ) + info.append( _("Parallel Init %s") % ( _("On") if plug["ai:parallel_node_init"]["value"].getValue() else _("Off") ) ) if plug["ai:threads"]["enabled"].getValue() : - info.append( "Threads %d" % plug["ai:threads"]["value"].getValue() ) + info.append( _("Threads %d") % plug["ai:threads"]["value"].getValue() ) return ", ".join( info ) def __samplingSummary( plug ) : info = [] if plug["ai:AA_samples"]["enabled"].getValue() : - info.append( "AA %d" % plug["ai:AA_samples"]["value"].getValue() ) + info.append( _("AA %d") % plug["ai:AA_samples"]["value"].getValue() ) if plug["ai:GI_diffuse_samples"]["enabled"].getValue() : - info.append( "Diffuse %d" % plug["ai:GI_diffuse_samples"]["value"].getValue() ) + info.append( _("Diffuse %d") % plug["ai:GI_diffuse_samples"]["value"].getValue() ) if plug["ai:GI_specular_samples"]["enabled"].getValue() : - info.append( "Specular %d" % plug["ai:GI_specular_samples"]["value"].getValue() ) + info.append( _("Specular %d") % plug["ai:GI_specular_samples"]["value"].getValue() ) if plug["ai:GI_transmission_samples"]["enabled"].getValue() : - info.append( "Transmission %d" % plug["ai:GI_transmission_samples"]["value"].getValue() ) + info.append( _("Transmission %d") % plug["ai:GI_transmission_samples"]["value"].getValue() ) if plug["ai:GI_sss_samples"]["enabled"].getValue() : - info.append( "SSS %d" % plug["ai:GI_sss_samples"]["value"].getValue() ) + info.append( _("SSS %d") % plug["ai:GI_sss_samples"]["value"].getValue() ) if plug["ai:GI_volume_samples"]["enabled"].getValue() : - info.append( "Volume %d" % plug["ai:GI_volume_samples"]["value"].getValue() ) + info.append( _("Volume %d") % plug["ai:GI_volume_samples"]["value"].getValue() ) if plug["ai:light_samples"]["enabled"].getValue() : - info.append( "Light %d" % plug["ai:light_samples"]["value"].getValue() ) + info.append( _("Light %d") % plug["ai:light_samples"]["value"].getValue() ) if plug["ai:AA_seed"]["enabled"].getValue() : - info.append( "Seed {0}".format( plug["ai:AA_seed"]["value"].getValue() ) ) + info.append( _("Seed {0}").format( plug["ai:AA_seed"]["value"].getValue() ) ) if plug["ai:AA_sample_clamp"]["enabled"].getValue() : - info.append( "Clamp {0}".format( GafferUI.NumericWidget.valueToString( plug["ai:AA_sample_clamp"]["value"].getValue() ) ) ) + info.append( _("Clamp {0}").format( GafferUI.NumericWidget.valueToString( plug["ai:AA_sample_clamp"]["value"].getValue() ) ) ) if plug["ai:AA_sample_clamp_affects_aovs"]["enabled"].getValue() : - info.append( "Clamp AOVs {0}".format( "On" if plug["ai:AA_sample_clamp_affects_aovs"]["value"].getValue() else "Off" ) ) + info.append( _("Clamp AOVs {0}").format( _("On") if plug["ai:AA_sample_clamp_affects_aovs"]["value"].getValue() else _("Off") ) ) if plug["ai:indirect_sample_clamp"]["enabled"].getValue() : - info.append( "Indirect Clamp {0}".format( GafferUI.NumericWidget.valueToString( plug["ai:indirect_sample_clamp"]["value"].getValue() ) ) ) + info.append( _("Indirect Clamp {0}").format( GafferUI.NumericWidget.valueToString( plug["ai:indirect_sample_clamp"]["value"].getValue() ) ) ) if plug["ai:low_light_threshold"]["enabled"].getValue() : - info.append( "Low Light {0}".format( GafferUI.NumericWidget.valueToString( plug["ai:low_light_threshold"]["value"].getValue() ) ) ) + info.append( _("Low Light {0}").format( GafferUI.NumericWidget.valueToString( plug["ai:low_light_threshold"]["value"].getValue() ) ) ) return ", ".join( info ) def __adaptiveSamplingSummary( plug ) : info = [] if plug["ai:enable_adaptive_sampling"]["enabled"].getValue() : - info.append( "Enable %d" % plug["ai:enable_adaptive_sampling"]["value"].getValue() ) + info.append( _("Enable %d") % plug["ai:enable_adaptive_sampling"]["value"].getValue() ) if plug["ai:AA_samples_max"]["enabled"].getValue() : - info.append( "AA Max %d" % plug["ai:AA_samples_max"]["value"].getValue() ) + info.append( _("AA Max %d") % plug["ai:AA_samples_max"]["value"].getValue() ) if plug["ai:AA_adaptive_threshold"]["enabled"].getValue() : - info.append( "Threshold %s" % GafferUI.NumericWidget.valueToString( plug["ai:AA_adaptive_threshold"]["value"].getValue() ) ) + info.append( _("Threshold %s") % GafferUI.NumericWidget.valueToString( plug["ai:AA_adaptive_threshold"]["value"].getValue() ) ) return ", ".join( info ) def __interactiveRenderingSummary( plug ) : info = [] if plug["ai:enable_progressive_render"]["enabled"].getValue() : - info.append( "Progressive %s" % ( "On" if plug["ai:enable_progressive_render"]["value"].getValue() else "Off" ) ) + info.append( _("Progressive %s") % ( _("On") if plug["ai:enable_progressive_render"]["value"].getValue() else _("Off") ) ) if plug["ai:progressive_min_AA_samples"]["enabled"].getValue() : - info.append( "Min AA %d" % plug["ai:progressive_min_AA_samples"]["value"].getValue() ) + info.append( _("Min AA %d") % plug["ai:progressive_min_AA_samples"]["value"].getValue() ) return ", ".join( info ) def __rayDepthSummary( plug ) : info = [] if plug["ai:GI_total_depth"]["enabled"].getValue() : - info.append( "Total %d" % plug["ai:GI_total_depth"]["value"].getValue() ) + info.append( _("Total %d") % plug["ai:GI_total_depth"]["value"].getValue() ) if plug["ai:GI_diffuse_depth"]["enabled"].getValue() : - info.append( "Diffuse %d" % plug["ai:GI_diffuse_depth"]["value"].getValue() ) + info.append( _("Diffuse %d") % plug["ai:GI_diffuse_depth"]["value"].getValue() ) if plug["ai:GI_specular_depth"]["enabled"].getValue() : - info.append( "Specular %d" % plug["ai:GI_specular_depth"]["value"].getValue() ) + info.append( _("Specular %d") % plug["ai:GI_specular_depth"]["value"].getValue() ) if plug["ai:GI_transmission_depth"]["enabled"].getValue() : - info.append( "Transmission %d" % plug["ai:GI_transmission_depth"]["value"].getValue() ) + info.append( _("Transmission %d") % plug["ai:GI_transmission_depth"]["value"].getValue() ) if plug["ai:GI_volume_depth"]["enabled"].getValue() : - info.append( "Volume %d" % plug["ai:GI_volume_depth"]["value"].getValue() ) + info.append( _("Volume %d") % plug["ai:GI_volume_depth"]["value"].getValue() ) if plug["ai:auto_transparency_depth"]["enabled"].getValue() : - info.append( "Transparency %d" % plug["ai:auto_transparency_depth"]["value"].getValue() ) + info.append( _("Transparency %d") % plug["ai:auto_transparency_depth"]["value"].getValue() ) return ", ".join( info ) def __subdivisionSummary( plug ) : info = [] if plug["ai:max_subdivisions"]["enabled"].getValue(): - info.append( "Max Subdivisions %d" % plug["ai:max_subdivisions"]["value"].getValue() ) + info.append( _("Max Subdivisions %d") % plug["ai:max_subdivisions"]["value"].getValue() ) if plug["ai:subdiv_dicing_camera"]["enabled"].getValue(): - info.append( "Dicing Camera %s" % plug["ai:subdiv_dicing_camera"]["value"].getValue() ) + info.append( _("Dicing Camera %s") % plug["ai:subdiv_dicing_camera"]["value"].getValue() ) if plug["ai:subdiv_frustum_culling"]["enabled"].getValue(): - info.append( "Frustum Culling %s" % ( "On" if plug["ai:subdiv_frustum_culling"]["value"].getValue() else "Off" ) ) + info.append( _("Frustum Culling %s") % ( _("On") if plug["ai:subdiv_frustum_culling"]["value"].getValue() else _("Off") ) ) if plug["ai:subdiv_frustum_padding"]["enabled"].getValue(): - info.append( "Frustum Padding %s" % GafferUI.NumericWidget.valueToString( plug["ai:subdiv_frustum_padding"]["value"].getValue() ) ) + info.append( _("Frustum Padding %s") % GafferUI.NumericWidget.valueToString( plug["ai:subdiv_frustum_padding"]["value"].getValue() ) ) return ", ".join( info ) def __texturingSummary( plug ) : info = [] if plug["ai:texture_max_memory_MB"]["enabled"].getValue() : - info.append( "Memory {0}".format( GafferUI.NumericWidget.valueToString( plug["ai:texture_max_memory_MB"]["value"].getValue() ) ) ) + info.append( _("Memory {0}").format( GafferUI.NumericWidget.valueToString( plug["ai:texture_max_memory_MB"]["value"].getValue() ) ) ) if plug["ai:texture_per_file_stats"]["enabled"].getValue() : - info.append( "Per File Stats {0}".format( "On" if plug["ai:texture_per_file_stats"]["value"].getValue() else "Off" ) ) + info.append( _("Per File Stats {0}").format( _("On") if plug["ai:texture_per_file_stats"]["value"].getValue() else _("Off") ) ) if plug["ai:texture_max_sharpen"]["enabled"].getValue() : - info.append( "Sharpen {0}".format( GafferUI.NumericWidget.valueToString( plug["ai:texture_max_sharpen"]["value"].getValue() ) ) ) + info.append( _("Sharpen {0}").format( GafferUI.NumericWidget.valueToString( plug["ai:texture_max_sharpen"]["value"].getValue() ) ) ) if plug["ai:texture_use_existing_tx"]["enabled"].getValue() : - info.append( "Use `.tx` {0}".format( "On" if plug["ai:texture_use_existing_tx"]["value"].getValue() else "Off" ) ) + info.append( _("Use `.tx` {0}").format( _("On") if plug["ai:texture_use_existing_tx"]["value"].getValue() else _("Off") ) ) if plug["ai:texture_auto_generate_tx"]["enabled"].getValue() : - info.append( "Auto `.tx` {0}".format( "On" if plug["ai:texture_auto_generate_tx"]["value"].getValue() else "Off" ) ) + info.append( _("Auto `.tx` {0}").format( _("On") if plug["ai:texture_auto_generate_tx"]["value"].getValue() else _("Off") ) ) if plug["ai:texture_auto_tx_path"]["enabled"].getValue() : - info.append( "Auto `.tx` path" ) + info.append( _("Auto `.tx` path") ) return ", ".join( info ) def __featuresSummary( plug ) : @@ -163,7 +164,7 @@ def __featuresSummary( plug ) : ( "ai:ignore_imagers", "Imagers" ), ) : if plug[childName]["enabled"].getValue() : - info.append( label + ( " Off " if plug[childName]["value"].getValue() else " On" ) ) + info.append( label + ( " " + _("Off") + " " if plug[childName]["value"].getValue() else " " + _("On") ) ) return ", ".join( info ) @@ -180,7 +181,7 @@ def __errorHandlingSummary( plug ) : info = [] if plug["ai:abort_on_error"]["enabled"].getValue() : - info.append( "Abort on Error " + ( "On" if plug["ai:abort_on_error"]["value"].getValue() else "Off" ) ) + info.append( _("Abort on Error") + " " + ( _("On") if plug["ai:abort_on_error"]["value"].getValue() else _("Off") ) ) for suffix in ( "texture", "pixel", "shader" ) : if plug["ai:error_color_bad_" + suffix]["enabled"].getValue() : info.append( suffix.capitalize() ) @@ -191,9 +192,9 @@ def __loggingSummary( plug ) : info = [] if plug["ai:log:filename"]["enabled"].getValue() : - info.append( "File name" ) + info.append( _("File name") ) if plug["ai:log:max_warnings"]["enabled"].getValue() : - info.append( "Max Warnings %d" % plug["ai:log:max_warnings"]["value"].getValue() ) + info.append( _("Max Warnings %d") % plug["ai:log:max_warnings"]["value"].getValue() ) return ", ".join( info ) @@ -201,11 +202,11 @@ def __statisticsSummary( plug ) : info = [] if plug["ai:statisticsFileName"]["enabled"].getValue() : - info.append( "Stats File: " + plug["ai:statisticsFileName"]["value"].getValue() ) + info.append( _("Stats File:") + " " + plug["ai:statisticsFileName"]["value"].getValue() ) if plug["ai:profileFileName"]["enabled"].getValue() : - info.append( "Profile File: " + plug["ai:profileFileName"]["value"].getValue() ) + info.append( _("Profile File:") + " " + plug["ai:profileFileName"]["value"].getValue() ) if plug["ai:reportFileName"]["enabled"].getValue() : - info.append( "Report File: " + plug["ai:reportFileName"]["value"].getValue() ) + info.append( _("Report File:") + " " + plug["ai:reportFileName"]["value"].getValue() ) return ", ".join( info ) @@ -217,7 +218,7 @@ def __licensingSummary( plug ) : ( "ai:skip_license_check", "Skip Check" ) ) : if plug[name]["enabled"].getValue() : - info.append( label + " " + ( "On" if plug[name]["value"].getValue() else "Off" ) ) + info.append( label + " " + ( _("On") if plug[name]["value"].getValue() else _("Off") ) ) return ", ".join( info ) @@ -225,10 +226,10 @@ def __gpuSummary( plug ) : info = [] if plug["ai:render_device"]["enabled"].getValue() : - info.append( "Device: %s" % plug["ai:render_device"]["value"].getValue() ) + info.append( _("Device: %s") % plug["ai:render_device"]["value"].getValue() ) if plug["ai:gpu_max_texture_resolution"]["enabled"].getValue() : - info.append( "Max Res: %i" % plug["ai:gpu_max_texture_resolution"]["value"].getValue() ) + info.append( _("Max Res: %i") % plug["ai:gpu_max_texture_resolution"]["value"].getValue() ) return ", ".join( info ) Gaffer.Metadata.registerNode( @@ -236,11 +237,11 @@ def __gpuSummary( plug ) : GafferArnold.ArnoldOptions, "description", - """ + _(""" Sets global scene options applicable to the Arnold renderer. Use the StandardOptions node to set global options applicable to all renderers. - """, + """), plugs = { diff --git a/python/GafferArnoldUI/ArnoldShaderBallUI.py b/python/GafferArnoldUI/ArnoldShaderBallUI.py index d1b88d7cf48..634fac7d993 100644 --- a/python/GafferArnoldUI/ArnoldShaderBallUI.py +++ b/python/GafferArnoldUI/ArnoldShaderBallUI.py @@ -36,25 +36,26 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldShaderBall, "description", - """ + _(""" Generates scenes suitable for rendering shader balls with Arnold. - """, + """), plugs = { "environment" : { "description" : - """ + _(""" An environment map used for lighting. Should be in latlong format. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -66,12 +67,12 @@ "threads" : { "description" : - """ + _(""" The number of threads used by Arnold to render the shader ball. A value of 0 uses all cores, and negative values reserve cores for other uses - to be used by the rest of the UI for instance. - """ + """) }, diff --git a/python/GafferArnoldUI/ArnoldShaderUI.py b/python/GafferArnoldUI/ArnoldShaderUI.py index 37971948f24..def0db0027a 100644 --- a/python/GafferArnoldUI/ArnoldShaderUI.py +++ b/python/GafferArnoldUI/ArnoldShaderUI.py @@ -50,6 +50,7 @@ import GafferImageUI import GafferSceneUI import GafferArnold +from GafferUI.i18n import _ ########################################################################## # Utilities to make it easier to work with the Arnold API, which has a @@ -446,12 +447,12 @@ def __nodeDescription( node ) : if isinstance( node, GafferArnold.ArnoldShader ) : return __metadata[node["name"].getValue()].get( "description", - """Loads shaders for use in Arnold renders. Use the ShaderAssignment node to assign shaders to objects in the scene.""", + _("""Loads shaders for use in Arnold renders. Use the ShaderAssignment node to assign shaders to objects in the scene."""), ) else : return __metadata[node["__shader"]["name"].getValue()].get( "description", - """Loads an Arnold light shader and uses it to output a scene with a single light.""" + _("""Loads an Arnold light shader and uses it to output a scene with a single light.""") ) def __nodeMetadata( node, name ) : diff --git a/python/GafferArnoldUI/ArnoldTextureBakeUI.py b/python/GafferArnoldUI/ArnoldTextureBakeUI.py index de001ee06c8..a14beff2ea1 100644 --- a/python/GafferArnoldUI/ArnoldTextureBakeUI.py +++ b/python/GafferArnoldUI/ArnoldTextureBakeUI.py @@ -36,17 +36,18 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldTextureBake, "description", - """ + _(""" Render meshes in Arnold, storing the results into images in the texture space of the meshes. Supports multiple meshes and UDIMs, and any AOVs output by Arnold. The file name and resolution can be overridden per mesh using the "bake:fileName" and "bake:resolution" attributes. - """, + """), "layout:activator:medianActivator", lambda parent : parent["applyMedianFilter"].getValue(), plugs = { @@ -54,19 +55,19 @@ "in" : { "description" : - """ + _(""" The input scene containing the meshes to bake, and any lights which affect them. - """, + """), "nodule:type" : "GafferUI::StandardNodule", }, "filter" : { "description" : - """ + _(""" The filter used to control which meshes the textures will be baked for. A Filter node should be connected here. - """, + """), "layout:section" : "Filter", "noduleLayout:section" : "right", @@ -79,106 +80,106 @@ "bakeDirectory" : { "description" : - """ + _(""" Sets the Context Variable used in the default file name to control where all the bakes will be stored. - """, + """), }, "defaultFileName" : { "description" : - """ + _(""" The file name to use for each texture file written. will be replaced by the UDIM number, and will be replaced by the aov name specified in "aovs". If you want to do an animated bake, you can also use #### which will be replaced by the frame number. May be overridden per mesh by specifying the "bake:fileName" string attribute on the meshes to be baked. - """, + """), }, "defaultResolution" : { "description" : - """ + _(""" The resolution to use for each texture file written. May be overridden per mesh by specifying the "bake:resolution" integer attribute on the meshes to be baked. - """, + """), }, "uvSet" : { "description" : - """ + _(""" The name of the primitive variable containing uvs which will determine how the mesh is unwrapped for baking. Must be a Face-Varying or Vertex V2f primitive variable. - """, + """), }, "udims" : { "description" : - """ + _(""" If non-empty, only UDIMs in this list will be baked. The formatting is the same as a frame list: comma separated, with dashes indicating ranges. - """, + """), }, "normalOffset" : { "description" : - """ + _(""" How far Arnold steps away from the surface before tracing back. If too large for your scene, you will incorrectly capture occluders near the mesh instead of the mesh itself. If too small, everything will go speckly because Arnold has insufficient precision to hit the mesh. For objects which are fairly large and simple, the default 0.1 should work. Smaller objects may require smaller values. - """, + """), }, "aovs" : { "description" : - """ + _(""" A space separated list of colon separated pairs of image name and data to render. For example, you could set this to "myName1:RGBA myName2:diffuse myName3:diffuse_albedo", to render 3 sets of images for every UDIM and mesh baked, containing all lighting, just diffuse lighting, and the diffuse albedo. - """, + """), }, "tasks" : { "description" : - """ + _(""" How many tasks the bake process will be split into. UDIMs cannot be split across tasks, so if you have few UDIMs available, the extra tasks won't do anything, but if you have a large number of UDIMs, and are dispatching to a pool of machines, increasing the number of tasks used will speed up bakes, at the cost of using more machines. - """, + """), }, "cleanupIntermediateFiles" : { "description" : - """ + _(""" During baking, we first render exrs ( potentially multiple EXRs per udim if multiple objects are present ). We then combine them, fill in the background, and convert to textures. This causes all intermediate EXRs, and the index txt file to be removed, and just the final .tx to be kept. - """, + """), "divider" : True, }, "applyMedianFilter" : { "description" : - """ + _(""" Adds a simple denoising filter to the texture bake. Mostly preserves high-contrast edges. - """, + """), }, "medianRadius" : { "description" : - """ + _(""" The radius of the median filter. Values greater than 1 will likely remove small details from the texture. - """, + """), "layout:activator" : "medianActivator", }, diff --git a/python/GafferArnoldUI/ArnoldVDBUI.py b/python/GafferArnoldUI/ArnoldVDBUI.py index 8c4203fab0f..bde3cdf8ce8 100644 --- a/python/GafferArnoldUI/ArnoldVDBUI.py +++ b/python/GafferArnoldUI/ArnoldVDBUI.py @@ -38,25 +38,26 @@ import Gaffer import GafferArnold +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferArnold.ArnoldVDB, "description", - """ + _(""" Creates an external procedural for rendering VDB volumes in Arnold. - """, + """), plugs = { "fileName" : { "description" : - """ + _(""" The name of the VDB file to be loaded. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -70,37 +71,37 @@ "grids" : { "description" : - """ + _(""" A space separated list of grids to be loaded and made available as channels in the volume shader. - """, + """), }, "velocityGrids" : { "description" : - """ + _(""" A space separated list of grids used to be used to generate motion blur. Should either contain a single vector grid or 3 float grids. - """ + """) }, "velocityScale" : { "description" : - """ + _(""" A scale factor applied to the velocity grids, to either increase or decrease motion blur. - """, + """), }, "stepSize" : { "description" : - """ + _(""" The ray marching step size. This should be small enough to capture the smallest details in the volume. Values which are too large will cause aliasing artifacts, and values which are too small will cause @@ -108,20 +109,20 @@ size to be calculated automatically based on the resolution of the VDB file. The step scale can then be used to make relative adjustments on top of this automatic size. - """, + """), }, "stepScale" : { "description" : - """ + _(""" A multiplier applied to the step size. This is most useful when the step size is computed automatically. Typically stepScale would be increased above 1 to give improved render times when it is known that the VDB file doesn't have a lot of fine detail at the voxel level - a value of 4 might be a good starting point for such a file. - """, + """), }, diff --git a/python/GafferCyclesUI/CyclesAttributesUI.py b/python/GafferCyclesUI/CyclesAttributesUI.py index a252c076640..e37aa6c3de5 100644 --- a/python/GafferCyclesUI/CyclesAttributesUI.py +++ b/python/GafferCyclesUI/CyclesAttributesUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferCycles +from GafferUI.i18n import _ def __attributeSummary( plug, attributes ) : @@ -119,9 +120,9 @@ def __shaderSummary( plug ) : GafferCycles.CyclesAttributes, "description", - """ + _(""" Applies Cycles attributes to objects in the scene. - """, + """), plugs = { diff --git a/python/GafferCyclesUI/CyclesLightUI.py b/python/GafferCyclesUI/CyclesLightUI.py index 0af446112dd..6080f48259b 100644 --- a/python/GafferCyclesUI/CyclesLightUI.py +++ b/python/GafferCyclesUI/CyclesLightUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferCycles +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( @@ -81,7 +82,7 @@ "parameters.is_sphere" : { "description" : - """ + _(""" Treat the light as a sphere. Disable to avoid sharp boundaries when the light intersects with other geometry. @@ -90,7 +91,7 @@ > enabling "Soft Falloff" in Blender and > matches the behaviour of Cycles 3.6 and > earlier. - """, + """), }, diff --git a/python/GafferCyclesUI/CyclesMeshLightUI.py b/python/GafferCyclesUI/CyclesMeshLightUI.py index 0a59f01933b..ff4211fd943 100644 --- a/python/GafferCyclesUI/CyclesMeshLightUI.py +++ b/python/GafferCyclesUI/CyclesMeshLightUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferCycles +from GafferUI.i18n import _ def __shaderMetadata( plug, name ) : @@ -48,21 +49,21 @@ def __shaderMetadata( plug, name ) : GafferCycles.CyclesMeshLight, "description", - """ + _(""" Turns mesh primitives into Cycles mesh lights by assigning an emission shader, turning off all visibility except for camera rays, and adding the meshes to the default lights set. - """, + """), plugs = { "cameraVisibility" : { "description" : - """ + _(""" Whether or not the mesh light is visible to camera rays. - """, + """), "nameValuePlugPlugValueWidget:ignoreNamePlug" : True, @@ -71,9 +72,9 @@ def __shaderMetadata( plug, name ) : "lightGroup" : { "description" : - """ + _(""" The light group that the mesh light will contribute to. - """, + """), "nameValuePlugPlugValueWidget:ignoreNamePlug" : True, @@ -82,10 +83,10 @@ def __shaderMetadata( plug, name ) : "parameters" : { "description" : - """ + _(""" The parameters of the Cycles emission shader that is applied to the meshes. - """, + """), ## \todo Extend the Metadata API so we can register a provider for "*", # which can automatically transfer all internal metadata. @@ -99,10 +100,10 @@ def __shaderMetadata( plug, name ) : "parameters.*" : { "description" : - """ + _(""" Refer to Cycles's documentation of the emission shader. - """, + """), "nodule:type" : functools.partial( __shaderMetadata, name = "nodule:type" ), "noduleLayout:section" : functools.partial( __shaderMetadata, name = "noduleLayout:section" ), @@ -116,12 +117,12 @@ def __shaderMetadata( plug, name ) : "defaultLight" : { "description" : - """ + _(""" Whether this light illuminates all geometry by default. When toggled, the light will be added to the \"defaultLights\" set, which can be referenced in set expressions and manipulated by downstream nodes. - """, + """), "layout:section" : "Light Linking", diff --git a/python/GafferCyclesUI/CyclesOptionsUI.py b/python/GafferCyclesUI/CyclesOptionsUI.py index a05748867e3..3b4185c177a 100644 --- a/python/GafferCyclesUI/CyclesOptionsUI.py +++ b/python/GafferCyclesUI/CyclesOptionsUI.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI import GafferCycles +from GafferUI.i18n import _ def __deviceSummary( plug ) : @@ -187,7 +188,7 @@ def __denoisingSummary( plug ) : info = [] if plug["cycles:denoise_device"]["enabled"].getValue() : - info.append( "Device {}".format( __deviceSummary( plug["cycles:denoise_device"]["value"] ) ) ) + info.append( _("Device {}").format( __deviceSummary( plug["cycles:denoise_device"]["value"] ) ) ) options = [ "integrator:denoiser_type", @@ -214,7 +215,7 @@ def __backgroundSummary( plug ) : for childName in ( "camera", "diffuse", "glossy", "transmission", "shadow", "scatter" ) : if plug[f"cycles:background:visibility:{childName}"]["enabled"].getValue() : - info.append( childName.capitalize() + ( " On" if plug[f"cycles:background:visibility:{childName}"]["value"].getValue() else " Off" ) ) + info.append( childName.capitalize() + ( " " + _("On") if plug[f"cycles:background:visibility:{childName}"]["value"].getValue() else " " + _("Off") ) ) return ", ".join( info ) @@ -322,11 +323,11 @@ def __registerPassPresets() : GafferCycles.CyclesOptions, "description", - """ + _(""" Sets global scene options applicable to the Cycles renderer. Use the StandardOptions node to set global options applicable to all renderers. - """, + """), plugs = { diff --git a/python/GafferCyclesUI/CyclesShaderBallUI.py b/python/GafferCyclesUI/CyclesShaderBallUI.py index 307b307912c..4ca6fe876b8 100644 --- a/python/GafferCyclesUI/CyclesShaderBallUI.py +++ b/python/GafferCyclesUI/CyclesShaderBallUI.py @@ -37,15 +37,16 @@ import IECore import Gaffer import GafferCycles +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferCycles.CyclesShaderBall, "description", - """ + _(""" Generates scenes suitable for rendering shader balls with Cycles. - """, + """), "layout:activator:deviceIncludesCPU", lambda node : IECore.StringAlgo.matchMultiple( "CPU", node["device"]["value"].getValue(), ), @@ -54,10 +55,10 @@ "environment" : { "description" : - """ + _(""" An environment map used for lighting. Should be in latlong format. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -69,21 +70,21 @@ "device" : { "description" : - """ + _(""" The device to render the shader ball on. - """, + """), }, "threads" : { "description" : - """ + _(""" The number of threads used by Cycles to render the shader ball. A value of 0 uses all cores, and negative values reserve cores for other uses - to be used by the rest of the UI for instance. - """, + """), "layout:activator" : "deviceIncludesCPU", diff --git a/python/GafferCyclesUI/CyclesShaderUI.py b/python/GafferCyclesUI/CyclesShaderUI.py index 9878108e286..3e100911bfd 100644 --- a/python/GafferCyclesUI/CyclesShaderUI.py +++ b/python/GafferCyclesUI/CyclesShaderUI.py @@ -45,6 +45,7 @@ import GafferCycles import GafferImage import GafferImageUI +from GafferUI.i18n import _ ########################################################################## # Build a registry of information retrieved from GafferCycles metadata. @@ -123,12 +124,12 @@ def __nodeDescription( node ) : if isinstance( node, GafferCycles.CyclesShader ) : return __metadata[node["name"].getValue()].get( "description", - """Loads shaders for use in Cycles renders. Use the ShaderAssignment node to assign shaders to objects in the scene.""", + _("""Loads shaders for use in Cycles renders. Use the ShaderAssignment node to assign shaders to objects in the scene."""), ) else : return __metadata[node["__shader"]["name"].getValue()].get( "description", - """Loads an Cycles light shader and uses it to output a scene with a single light.""" + _("""Loads an Cycles light shader and uses it to output a scene with a single light.""") ) def __nodeMetadata( node, name ) : diff --git a/python/GafferDispatchUI/DispatchDialogue.py b/python/GafferDispatchUI/DispatchDialogue.py index 48569303f63..5e02a56ea10 100644 --- a/python/GafferDispatchUI/DispatchDialogue.py +++ b/python/GafferDispatchUI/DispatchDialogue.py @@ -48,6 +48,7 @@ import GafferDispatch import GafferUI +from GafferUI.i18n import _ ## A dialogue which can be used to dispatch tasks class DispatchDialogue( GafferUI.Dialogue ) : @@ -62,7 +63,7 @@ class DispatchDialogue( GafferUI.Dialogue ) : __dispatchDialogueMenuDefinition = None ## \todo `tasks` should be a list of TaskPlugs instead of a list of nodes. - def __init__( self, tasks, dispatchers, nodesToShow, postDispatchBehaviour=PostDispatchBehaviour.Confirm, title="Dispatch Tasks", sizeMode=GafferUI.Window.SizeMode.Manual, **kw ) : + def __init__( self, tasks, dispatchers, nodesToShow, postDispatchBehaviour=PostDispatchBehaviour.Confirm, title=_("Dispatch Tasks"), sizeMode=GafferUI.Window.SizeMode.Manual, **kw ) : GafferUI.Dialogue.__init__( self, title, sizeMode=sizeMode, **kw ) @@ -105,7 +106,7 @@ def __init__( self, tasks, dispatchers, nodesToShow, postDispatchBehaviour=PostD with GafferUI.ListContainer() as dispatcherTab : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing=2, borderWidth=4 ) as dispatcherMenuColumn : - GafferUI.Label( "

Dispatcher

" ) + GafferUI.Label( "

" + _("Dispatcher") + "

" ) self.__dispatchersMenu = GafferUI.MultiSelectionMenu( allowMultipleSelection = False, allowEmptySelection = False ) self.__dispatchersMenu.append( [ x.getName() for x in self.__dispatchers ] ) self.__dispatchersMenu.setSelection( [ self.__dispatchers[0].getName() ] ) @@ -113,11 +114,11 @@ def __init__( self, tasks, dispatchers, nodesToShow, postDispatchBehaviour=PostD dispatcherMenuColumn.setVisible( len(self.__dispatchers) > 1 ) self.__dispatcherFrame = GafferUI.Frame( borderStyle=GafferUI.Frame.BorderStyle.None_, borderWidth=0 ) - self.__tabs.setLabel( dispatcherTab, "Dispatcher" ) + self.__tabs.setLabel( dispatcherTab, _("Dispatcher") ) with GafferUI.Frame( borderStyle=GafferUI.Frame.BorderStyle.None_, borderWidth=4 ) as contextTab : GafferUI.PlugValueWidget.create( self.__script["variables"] ) - self.__tabs.setLabel( contextTab, "Context Variables" ) + self.__tabs.setLabel( contextTab, _("Context Variables") ) # build a ui element for progress feedback and messages with GafferUI.ListContainer( spacing = 4 ) as self.__progressUI : @@ -128,7 +129,7 @@ def __init__( self, tasks, dispatchers, nodesToShow, postDispatchBehaviour=PostD self.__progressIconFrame = GafferUI.Frame( borderStyle = GafferUI.Frame.BorderStyle.None_, parenting = { "horizontalAlignment" : GafferUI.HorizontalAlignment.Center } ) self.__progressLabel = GafferUI.Label( parenting = { "horizontalAlignment" : GafferUI.HorizontalAlignment.Center } ) - with GafferUI.Collapsible( "Details", collapsed = True, parenting = { "expand" : True } ) as self.__messageCollapsible : + with GafferUI.Collapsible( _("Details"), collapsed = True, parenting = { "expand" : True } ) as self.__messageCollapsible : self.__messageWidget = GafferUI.MessageWidget( toolbars = True ) # connect to the collapsible state change so we can increase the window # size when the details pane is first shown. @@ -136,17 +137,17 @@ def __init__( self, tasks, dispatchers, nodesToShow, postDispatchBehaviour=PostD GafferUI.Spacer( imath.V2i( 0 ) ) - self.__backButton = self._addButton( "Back" ) + self.__backButton = self._addButton( _("Back") ) self.__backButton.clickedSignal().connectFront( Gaffer.WeakMethod( self.__initiateSettings ) ) - self.__primaryButton = self._addButton( "Dispatch" ) + self.__primaryButton = self._addButton( _("Dispatch") ) self.__setDispatcher( dispatchers[0] ) self.__initiateSettings( self.__primaryButton ) @staticmethod - def createWithDefaultDispatchers( tasks, nodesToShow, defaultDispatcherType=None, postDispatchBehaviour=PostDispatchBehaviour.Confirm, title="Dispatch Tasks", sizeMode=GafferUI.Window.SizeMode.Manual, **kw ) : + def createWithDefaultDispatchers( tasks, nodesToShow, defaultDispatcherType=None, postDispatchBehaviour=PostDispatchBehaviour.Confirm, title=_("Dispatch Tasks"), sizeMode=GafferUI.Window.SizeMode.Manual, **kw ) : defaultType = defaultDispatcherType if defaultDispatcherType else GafferDispatch.Dispatcher.getDefaultDispatcherType() dispatcherTypes = list(GafferDispatch.Dispatcher.registeredDispatchers()) @@ -213,7 +214,7 @@ def __initiateSettings( self, button ) : self.__backButton.setEnabled( False ) self.__backButton.setVisible( False ) - self.__primaryButton.setText( "Dispatch" ) + self.__primaryButton.setText( _("Dispatch") ) self.__primaryButton.setEnabled( True ) self.__primaryButton.setVisible( True ) self.__primaryButtonConnection = self.__primaryButton.clickedSignal().connectFront( Gaffer.WeakMethod( self.__initiateDispatch ), scoped = True ) @@ -224,7 +225,7 @@ def __initiateSettings( self, button ) : def __initiateDispatch( self, button ) : self.__progressIconFrame.setChild( GafferUI.BusyWidget() ) - self.__progressLabel.setText( "

Dispatching...

" ) + self.__progressLabel.setText( "

" + _("Dispatching...") + "

" ) self.__backButton.setVisible( False ) self.__backButton.setEnabled( False ) @@ -264,7 +265,7 @@ def __finish( self, result ) : def __initiateErrorDisplay( self, exceptionInfo ) : self.__progressIconFrame.setChild( GafferUI.Image( "failure.png" ) ) - self.__progressLabel.setText( "

Failed

" ) + self.__progressLabel.setText( "

" + _("Failed") + "

" ) self.__messageCollapsible.setCollapsed( False ) @@ -290,7 +291,7 @@ def __initiateErrorDisplay( self, exceptionInfo ) : self.__backButton.setVisible( True ) self.__backButton._qtWidget().setFocus() - self.__primaryButton.setText( "Quit" ) + self.__primaryButton.setText( _("Quit") ) self.__primaryButton.setEnabled( True ) self.__primaryButton.setVisible( True ) self.__primaryButtonConnection = self.__primaryButton.clickedSignal().connect( Gaffer.WeakMethod( self.__close ), scoped = True ) @@ -313,7 +314,7 @@ def __initiateResultDisplay( self ) : GafferUI.Image( "successWarning.png" if problems else "success.png" ) ) - completionMessage = "Completed" + completionMessage = _("Completed") if problems : completionMessage += " with " + " and ".join( problems ) self.__messageCollapsible.setCollapsed( False ) @@ -325,7 +326,7 @@ def __initiateResultDisplay( self ) : self.__backButton.setEnabled( True ) self.__backButton.setVisible( True ) - self.__primaryButton.setText( "Close" ) + self.__primaryButton.setText( _("Close") ) self.__primaryButton.setEnabled( True ) self.__primaryButton.setVisible( True ) self.__primaryButtonConnection = self.__primaryButton.clickedSignal().connect( Gaffer.WeakMethod( self.__close ), scoped = True ) diff --git a/python/GafferDispatchUI/DispatcherUI.py b/python/GafferDispatchUI/DispatcherUI.py index b573e888ce0..1ce7f9d28c4 100644 --- a/python/GafferDispatchUI/DispatcherUI.py +++ b/python/GafferDispatchUI/DispatcherUI.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferDispatch from GafferUI._StyleSheet import _styleColors @@ -53,10 +54,10 @@ GafferDispatch.Dispatcher, "description", - """ + _(""" Used to schedule the execution of a network of TaskNodes. - """, + """), "layout:activator:framesModeIsCustomRange", lambda node : node["framesMode"].getValue() == GafferDispatch.Dispatcher.FramesMode.CustomRange, "layout:customWidget:dispatchButton:widgetType", "GafferDispatchUI.DispatcherUI._DispatchButton", @@ -72,9 +73,9 @@ "tasks" : { "description" : - """ + _(""" The tasks to be executed by this dispatcher. - """, + """), "nodule:type" : "GafferUI::CompoundNodule", "noduleLayout:spacing" : 0.4, @@ -94,7 +95,7 @@ "framesMode" : { "description" : - """ + _(""" Determines the active frame range to be dispatched as follows : @@ -105,7 +106,7 @@ context variables. - CustomRange uses a user defined range, as specified by the `frameRange` plug. - """, + """), "preset:Current Frame" : GafferDispatch.Dispatcher.FramesMode.CurrentFrame, "preset:Full Range" : GafferDispatch.Dispatcher.FramesMode.FullRange, @@ -118,9 +119,9 @@ "frameRange" : { "description" : - """ + _(""" The frame range to be used when framesMode is "CustomRange". - """, + """), "layout:visibilityActivator" : "framesModeIsCustomRange", @@ -129,18 +130,18 @@ "jobName" : { "description" : - """ + _(""" A descriptive name for the job. - """ + """) }, "jobsDirectory" : { "description" : - """ + _(""" A directory to store temporary files used by the dispatcher. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : False, @@ -170,7 +171,7 @@ def _dispatch( dispatcher, parentWindow ) : with dispatcher.scriptNode().context() : with GafferUI.ErrorDialogue.ErrorHandler( - title = "Errors Occurred During Dispatch", + title = _("Errors Occurred During Dispatch"), parentWindow = parentWindow ) : dispatcher["task"].execute() @@ -231,10 +232,10 @@ def __clicked( self, button ) : "dispatcher.batchSize" : { "description" : - """ + _(""" Maximum number of frames to batch together when dispatching tasks. If the node requires sequence execution `batchSize` will be ignored. - """, + """), "layout:activator" : "doesNotRequireSequenceExecution", @@ -243,7 +244,7 @@ def __clicked( self, button ) : "dispatcher.immediate" : { "description" : - """ + _(""" Causes this node to be executed immediately upon dispatch, rather than have its execution be scheduled normally by the dispatcher. For instance, when using the LocalDispatcher, @@ -252,18 +253,18 @@ def __clicked( self, button ) : When a node is made immediate, all upstream nodes are automatically considered to be immediate too, regardless of their settings. - """ + """) }, "dispatcher.isolated" : { "description" : - """ + _(""" Causes this node to be executed from a script containing *only* this node. This is a useful optimisation when the load time for the full script is high compared to the time taken to execute the task. - """, + """), "layout:activator" : "immediateIsOff", diff --git a/python/GafferDispatchUI/FrameMaskUI.py b/python/GafferDispatchUI/FrameMaskUI.py index e0359e30c97..e970d3c1f59 100644 --- a/python/GafferDispatchUI/FrameMaskUI.py +++ b/python/GafferDispatchUI/FrameMaskUI.py @@ -37,30 +37,31 @@ import Gaffer import GafferUI import GafferDispatch +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.FrameMask, "description", - """ + _(""" Masks upstream tasks so that they will only be executed for a subset of the Dispatcher's frame range. - """, + """), plugs = { "mask" : { "description" : - """ + _(""" The subset of frames that will be executed by upstream tasks. Any frames not included here will be ignored, regardless of the dispatcher's frame range. > Note : This can only remove frames. To add frames, edit the > settings on the Dispatcher. - """, + """), }, diff --git a/python/GafferDispatchUI/LocalDispatcherUI.py b/python/GafferDispatchUI/LocalDispatcherUI.py index 20efe63426d..da3304b4301 100644 --- a/python/GafferDispatchUI/LocalDispatcherUI.py +++ b/python/GafferDispatchUI/LocalDispatcherUI.py @@ -36,16 +36,17 @@ import Gaffer import GafferDispatch +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.LocalDispatcher, "description", - """ + _(""" Schedules execution of task graphs on the local machine. Tasks may be dispatched in the background to keep the UI responsive. - """, + """), "layout:activator:executeInBackgroundIsOn", lambda node : node["executeInBackground"].getValue(), @@ -54,20 +55,20 @@ "executeInBackground" : { "description" : - """ + _(""" Executes the dispatched tasks in separate processes via a background thread. - """, + """), }, "ignoreScriptLoadErrors" : { "description" : - """ + _(""" Ignores errors loading the script when executing in the background. This is not recommended - fix the problem instead. - """, + """), "layout:activator" : "executeInBackgroundIsOn", @@ -76,7 +77,7 @@ "environmentCommand" : { "description" : - """ + _(""" Optional system command to modify the environment when launching tasks in the background. Background tasks are launched in a separate process using a `gaffer execute ...` command, and they inherit the @@ -91,7 +92,7 @@ ``` /usr/bin/env FOO=BAR TOTO=TATA ``` - """, + """), "layout:activator" : "executeInBackgroundIsOn", diff --git a/python/GafferDispatchUI/LocalJobs.py b/python/GafferDispatchUI/LocalJobs.py index c4570351321..7a1a7745425 100644 --- a/python/GafferDispatchUI/LocalJobs.py +++ b/python/GafferDispatchUI/LocalJobs.py @@ -43,6 +43,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferDispatch from GafferUI.PlugValueWidget import sole @@ -142,7 +143,7 @@ def cellData( self, path, canceller ) : def headerData( self, canceller ) : - return GafferUI.PathColumn.CellData( value = "Status" ) + return GafferUI.PathColumn.CellData( value = _("Status") ) class _RunningTimeColumn( GafferUI.PathColumn ) : @@ -161,7 +162,7 @@ def cellData( self, path, canceller ) : def headerData( self, canceller ) : - return GafferUI.PathColumn.CellData( value = "Running Time" ) + return GafferUI.PathColumn.CellData( value = _("Running Time") ) class _CPUUsageColumn( GafferUI.PathColumn ) : @@ -172,12 +173,12 @@ def cellData( self, path, canceller ) : return GafferUI.PathColumn.CellData( value = f"{cpu:.2f}" if cpu is not None else "---", sortValue = cpu if cpu is not None else 0.0, - toolTip = "CPU usage for current batch" + toolTip = _("CPU usage for current batch") ) def headerData( self, canceller ) : - return GafferUI.PathColumn.CellData( value = "CPU" ) + return GafferUI.PathColumn.CellData( value = _("CPU") ) class _MemoryUsageColumn( GafferUI.PathColumn ) : @@ -188,12 +189,12 @@ def cellData( self, path, canceller ) : return GafferUI.PathColumn.CellData( value = "{:.2f}GB".format( memory / (1024 ** 3) ) if memory is not None else "---", sortValue = IECore.UInt64Data( memory if memory is not None else 0 ), - toolTip = "Memory usage for current batch" + toolTip = _("Memory usage for current batch") ) def headerData( self, canceller ) : - return GafferUI.PathColumn.CellData( value = "Memory" ) + return GafferUI.PathColumn.CellData( value = _("Memory") ) class LocalJobs( GafferUI.Editor ) : @@ -212,9 +213,9 @@ def __init__( self, scriptNode, **kw ) : _LocalJobsPath( jobPool ), columns = ( _StatusColumn(), - GafferUI.PathListingWidget.StandardColumn( "Name", "localDispatcher:jobName", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ), - GafferUI.PathListingWidget.StandardColumn( "Id", "localDispatcher:id" ), - GafferUI.PathListingWidget.StandardColumn( "Start Time", "localDispatcher:startTime" ), + GafferUI.PathListingWidget.StandardColumn( _("Name"), "localDispatcher:jobName", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ), + GafferUI.PathListingWidget.StandardColumn( _("Id"), "localDispatcher:id" ), + GafferUI.PathListingWidget.StandardColumn( _("Start Time"), "localDispatcher:startTime" ), _RunningTimeColumn(), _CPUUsageColumn(), _MemoryUsageColumn(), @@ -226,34 +227,34 @@ def __init__( self, scriptNode, **kw ) : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing=5 ) : GafferUI.Spacer( imath.V2i( 0 ), parenting = { "expand" : True } ) - self.__killButton = GafferUI.Button( "Kill Selected Jobs" ) + self.__killButton = GafferUI.Button( _("Kill Selected Jobs") ) self.__killButton.clickedSignal().connect( Gaffer.WeakMethod( self.__killClicked ) ) - self.__removeButton = GafferUI.Button( "Remove Selected Jobs" ) + self.__removeButton = GafferUI.Button( _("Remove Selected Jobs") ) self.__removeButton.clickedSignal().connect( Gaffer.WeakMethod( self.__removeClicked ) ) with GafferUI.TabbedContainer() : - with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Vertical, spacing=10, borderWidth=10, parenting = { "label" : "Log" } ) as self.__messagesTab : + with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Vertical, spacing=10, borderWidth=10, parenting = { "label" : _("Log") } ) as self.__messagesTab : self.__messageWidget = GafferUI.MessageWidget( toolbars = True, follow = True, role = GafferUI.MessageWidget.Role.Log ) self.__messageWidget._qtWidget().setMinimumHeight( 150 ) - with GafferUI.ScrolledContainer( parenting = { "label" : "Properties" } ) : + with GafferUI.ScrolledContainer( parenting = { "label" : _("Properties") } ) : grid = GafferUI.GridContainer( spacing = 10, borderWidth = 10 ) with grid.nextRow() : - GafferUI.Label( "Frame Range" ) + GafferUI.Label( _("Frame Range") ) self.__propertiesFrameRange = GafferUI.Label( textSelectable = True ) with grid.nextRow() : - GafferUI.Label( "Job Directory" ) + GafferUI.Label( _("Job Directory") ) self.__propertiesJobDirectory = GafferUI.Label( textSelectable = True ) with grid.nextRow() : - GafferUI.Label( "Environment Command" ) + GafferUI.Label( _("Environment Command") ) self.__propertiesEnvironmentCommand = GafferUI.Label( textSelectable = True ) with grid.nextRow() : - GafferUI.Label( "Start Time" ) + GafferUI.Label( _("Start Time") ) self.__propertiesStartTime = GafferUI.Label( textSelectable = True ) # Connecting to the JobPool and Job signals allows us to update our PathListingWidget diff --git a/python/GafferDispatchUI/PythonCommandUI.py b/python/GafferDispatchUI/PythonCommandUI.py index 839c9789dc3..c1284046f43 100644 --- a/python/GafferDispatchUI/PythonCommandUI.py +++ b/python/GafferDispatchUI/PythonCommandUI.py @@ -41,26 +41,27 @@ import GafferDispatch from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.PythonCommand, "description", - """ + _(""" Runs python code. - """, + """), plugs = { "command" : { "description" : - """ + _(""" The command to run. This may reference any of the variables by name, and also the node itself as `self` and the current Context as `context`. - """, + """), "plugValueWidget:type" : "GafferDispatchUI.PythonCommandUI._CommandPlugValueWidget", "layout:label" : "", @@ -70,10 +71,10 @@ "variables" : { "description" : - """ + _(""" An arbitrary set of variables which can be accessed via the `variables` dictionary within the python command. - """, + """), "layout:section" : "Variables", @@ -82,7 +83,7 @@ "framesMode" : { "description" : - """ + _(""" Determines how tasks for different frames are distributed between calls to the command : @@ -116,7 +117,7 @@ > Note : In Single mode, the command will only be called for each > frame if the inputs are animated. If the inputs are static > then the command will only be called once. - """, + """), "layout:section" : "Advanced", "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", diff --git a/python/GafferDispatchUI/SystemCommandUI.py b/python/GafferDispatchUI/SystemCommandUI.py index 1b95a2f023a..fbea5eeb7e8 100644 --- a/python/GafferDispatchUI/SystemCommandUI.py +++ b/python/GafferDispatchUI/SystemCommandUI.py @@ -36,35 +36,36 @@ import Gaffer import GafferDispatch +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.SystemCommand, "description", - """ + _(""" Runs system commands via a shell. - """, + """), plugs = { "command" : { "description" : - """ + _(""" The command to be run. This may reference values from substitutions with '{substitutionName}' syntax. - """, + """), }, "substitutions" : { "description" : - """ + _(""" An arbitrary set of name/value pairs which can be referenced in command with '{substitutionsName}' syntax. - """, + """), "layout:section" : "Settings.Substitutions", @@ -73,10 +74,10 @@ "environmentVariables" : { "description" : - """ + _(""" An arbitrary set of name/value pairs which will be set as environment variables when running the command. - """, + """), "layout:section" : "Settings.Environment Variables", @@ -85,7 +86,7 @@ "shell" : { "description" : - """ + _(""" When enabled, the specified command is interpreted as a shell command and run in a child shell. This allows semantics such as pipes to be used. Otherwise the supplied command is invoked @@ -96,7 +97,7 @@ > process. If the executable you are running relies on this, > disabling _shell_ should allow it to inherit the full Gaffer > environment. - """, + """), "layout:section" : "Advanced", diff --git a/python/GafferDispatchUI/TaskContextProcessorUI.py b/python/GafferDispatchUI/TaskContextProcessorUI.py index 5ee7e14ef0f..0ac00598afd 100644 --- a/python/GafferDispatchUI/TaskContextProcessorUI.py +++ b/python/GafferDispatchUI/TaskContextProcessorUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferDispatch +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.TaskContextProcessor, "description", - """ + _(""" Base class for nodes which modify the Context in which upstream tasks are dispatched. - """, + """), ) diff --git a/python/GafferDispatchUI/TaskContextVariablesUI.py b/python/GafferDispatchUI/TaskContextVariablesUI.py index 8ea771a4878..9367294dcf8 100644 --- a/python/GafferDispatchUI/TaskContextVariablesUI.py +++ b/python/GafferDispatchUI/TaskContextVariablesUI.py @@ -36,25 +36,26 @@ import Gaffer import GafferDispatch +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.TaskContextVariables, "description", - """ + _(""" Adds variables which can be referenced by upstream expressions. - """, + """), plugs = { "variables" : { "description" : - """ + _(""" The variables to be added - arbitrary numbers of variables can be added here. - """, + """), } diff --git a/python/GafferDispatchUI/TaskListUI.py b/python/GafferDispatchUI/TaskListUI.py index 1ca2a5380c2..8260fc59953 100644 --- a/python/GafferDispatchUI/TaskListUI.py +++ b/python/GafferDispatchUI/TaskListUI.py @@ -36,25 +36,26 @@ import Gaffer import GafferDispatch +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.TaskList, "description", - """ + _(""" Used to collect tasks for dispatching all at once. - """, + """), plugs = { "sequence" : { "description" : - """ + _(""" Don't allow any tasks which depend on this list to run until all frames of the tasks in this list have run. - """, + """), }, } diff --git a/python/GafferDispatchUI/TaskNodeUI.py b/python/GafferDispatchUI/TaskNodeUI.py index ca77db7f56c..6c68456055c 100644 --- a/python/GafferDispatchUI/TaskNodeUI.py +++ b/python/GafferDispatchUI/TaskNodeUI.py @@ -36,19 +36,20 @@ import Gaffer import GafferDispatch +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.TaskNode, "description", - """ + _(""" Base class for nodes which have external side effects - generating files on disk for instance. Can be connected with other task nodes to define an order of execution based on dependencies between nodes. A Dispatcher can then be used to actually perform the execution of the tasks generated by such a network. - """, + """), plugs = { @@ -61,10 +62,10 @@ "preTasks" : { "description" : - """ + _(""" Input connections to upstream nodes which must be executed before this node. - """, + """), "nodule:type" : "GafferUI::CompoundNodule", "noduleLayout:spacing" : 0.4, @@ -82,11 +83,11 @@ "postTasks" : { "description" : - """ + _(""" Input connections to nodes which must be executed after this node, but which don't need to be executed before downstream nodes. - """, + """), "nodule:type" : "GafferUI::CompoundNodule", "noduleLayout:section" : "right", @@ -106,10 +107,10 @@ "task" : { "description" : - """ + _(""" Output connections to downstream nodes which must not be executed until after this node. - """, + """), "plugValueWidget:type" : "", "nodule:type" : "GafferUI::StandardNodule", @@ -119,10 +120,10 @@ "dispatcher" : { "description" : - """ + _(""" Container for custom plugs which dispatchers use to control their behaviour. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Dispatcher", diff --git a/python/GafferDispatchUI/TaskSwitchUI.py b/python/GafferDispatchUI/TaskSwitchUI.py index 63b209e0c6e..b27f7cc8cc4 100644 --- a/python/GafferDispatchUI/TaskSwitchUI.py +++ b/python/GafferDispatchUI/TaskSwitchUI.py @@ -36,28 +36,29 @@ import Gaffer import GafferDispatch +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferDispatch.TaskSwitch, "description", - """ + _(""" Switches between upstream tasks, so that only one is chosen for execution. - """, + """), plugs = { "index" : { "description" : - """ + _(""" The index of the input task which is executed. A value of 0 chooses the first input, 1 the second and so on. Values larger than the number of available inputs wrap back around to the beginning. - """, + """), }, diff --git a/python/GafferDispatchUI/WedgeUI.py b/python/GafferDispatchUI/WedgeUI.py index 5e613188587..634cb8b605f 100644 --- a/python/GafferDispatchUI/WedgeUI.py +++ b/python/GafferDispatchUI/WedgeUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferDispatch Gaffer.Metadata.registerNode( @@ -47,14 +48,14 @@ GafferDispatch.Wedge, "description", - """ + _(""" Causes upstream nodes to be dispatched multiple times in a range of Contexts, each time with a different value for a specified variable. This variable should be referenced in upstream expressions to apply variation to the tasks being performed. For instance, it could be used to drive a shader parameter to perform a series of "wedges" to demonstrate the results of a range of possible parameter values. - """, + """), "layout:activator:modeIsFloatRange", lambda node : node["mode"].getValue() == int( node.Mode.FloatRange ), "layout:activator:modeIsIntRange", lambda node : node["mode"].getValue() == int( node.Mode.IntRange ), @@ -80,18 +81,18 @@ "variable" : { "description" : - """ + _(""" The name of the Context Variable defined by the wedge. This should be used in upstream expressions to apply the wedged value to specific nodes. - """, + """), }, "indexVariable" : { "description" : - """ + _(""" The name of an index Context Variable defined by the wedge. This is assigned values starting at 0 and incrementing for each new value - for instance a wedged float range might @@ -102,19 +103,19 @@ The index variable is particularly useful for generating unique filenames when using a float range to perform wedged renders. - """, + """), }, "mode" : { "description" : - """ + _(""" The method used to define the range of values used by the wedge. It is possible to define numeric or color ranges, and also to specify explicit lists of numbers or strings. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -132,11 +133,11 @@ "floatMin" : { "description" : - """ + _(""" The smallest value of the wedge range when the mode is set to "Float Range". Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsFloatRange", @@ -145,11 +146,11 @@ "floatMax" : { "description" : - """ + _(""" The largest allowable value of the wedge range when the mode is set to "Float Range". Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsFloatRange", @@ -158,13 +159,13 @@ "floatSteps" : { "description" : - """ + _(""" The number of steps in the value range defined when in "Float Range" mode. The steps are distributed evenly between the min and max values. Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsFloatRange", @@ -175,11 +176,11 @@ "intMin" : { "description" : - """ + _(""" The smallest value of the wedge range when the mode is set to "Int Range". Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsIntRange", @@ -188,11 +189,11 @@ "intMax" : { "description" : - """ + _(""" The largest allowable value of the wedge range when the mode is set to "Int Range". Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsIntRange", @@ -201,7 +202,7 @@ "intStep" : { "description" : - """ + _(""" The step between successive values when the mode is set to "Int Range". Values are generated by adding this step to the minimum @@ -209,7 +210,7 @@ Note that if (max - min) is not exactly divisible by the step then the maximum value may not be used at all. Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsIntRange", @@ -220,11 +221,11 @@ "ramp" : { "description" : - """ + _(""" The range of colours used when the mode is set to "Colour Range". Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsColorRange", @@ -233,13 +234,13 @@ "colorSteps" : { "description" : - """ + _(""" The number of steps in the wedge range defined when in "Colour Range" mode. The steps are distributed evenly from the start to the end of the ramp. Has no effect in other modes. - """, + """), "label" : "Steps", "layout:visibilityActivator" : "modeIsColorRange", @@ -251,10 +252,10 @@ "floats" : { "description" : - """ + _(""" The list of values used when in "Float List" mode. Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsFloatList", @@ -263,10 +264,10 @@ "ints" : { "description" : - """ + _(""" The list of values used when in "Int List" mode. Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsIntList", @@ -275,10 +276,10 @@ "strings" : { "description" : - """ + _(""" The list of values used when in "String List" mode. Has no effect in other modes. - """, + """), "layout:visibilityActivator" : "modeIsStringList", @@ -308,7 +309,7 @@ def __init__( self, previewWidget, node, **kw ) : ) self.__grid[1,0] = previewWidget - previewWidget.setToolTip( "The values generated by the wedge" ) + previewWidget.setToolTip( _("The values generated by the wedge") ) @staticmethod def _valuesForUpdate( plugs, auxiliaryPlugs ) : diff --git a/python/GafferImageUI/BleedFillUI.py b/python/GafferImageUI/BleedFillUI.py index 0a28c2b420c..e5bbdec97a5 100644 --- a/python/GafferImageUI/BleedFillUI.py +++ b/python/GafferImageUI/BleedFillUI.py @@ -36,23 +36,24 @@ import IECore import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.BleedFill, "description", - "Fills in areas of low alpha in the image by blurring in contributions from nearby pixels.", + _("Fills in areas of low alpha in the image by blurring in contributions from nearby pixels."), plugs = { "expandDataWindow" : { "description" : - """ + _(""" Expand the data window to cover the display window. The new data will be filled with blurred contributions from nearby pixels ( the same as any regions of low alpha within the original data window ). - """, + """), }, } diff --git a/python/GafferImageUI/BlurUI.py b/python/GafferImageUI/BlurUI.py index cbf25cd153e..371c42daf0f 100644 --- a/python/GafferImageUI/BlurUI.py +++ b/python/GafferImageUI/BlurUI.py @@ -37,6 +37,7 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ # Command suitable for use with `NodeMenu.append()`. def nodeMenuCreateCommand( menu ) : @@ -51,30 +52,30 @@ def nodeMenuCreateCommand( menu ) : GafferImage.Blur, "description", - """ + _(""" Applies a gaussian blur to the image. - """, + """), plugs = { "radius" : { "description" : - """ + _(""" The size of the blur in pixels. This can be varied independently in the x and y directions, and fractional values are supported for fine control. - """, + """), }, "boundingMode" : { "description" : - """ + _(""" The method used when the filter references pixels outside the input data window. - """, + """), "preset:Black" : GafferImage.Sampler.BoundingMode.Black, "preset:Clamp" : GafferImage.Sampler.BoundingMode.Clamp, @@ -86,10 +87,10 @@ def nodeMenuCreateCommand( menu ) : "expandDataWindow" : { "description" : - """ + _(""" Expands the data window to include the external pixels which the blur will bleed onto. - """ + """) } diff --git a/python/GafferImageUI/CDLUI.py b/python/GafferImageUI/CDLUI.py index dcf9e6cb149..5976b663883 100644 --- a/python/GafferImageUI/CDLUI.py +++ b/python/GafferImageUI/CDLUI.py @@ -39,61 +39,62 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.CDL, "description", - """ + _(""" Applies color transformations provided by OpenColorIO via an OCIO CDLTransform. - """, + """), plugs = { "slope" : { "description" : - """ + _(""" Slope for the ASC CDL color correction formula. - """, + """), }, "offset" : { "description" : - """ + _(""" Offset for the ASC CDL color correction formula. - """, + """), }, "power" : { "description" : - """ + _(""" Power for the ASC CDL color correction formula. - """, + """), }, "saturation" : { "description" : - """ + _(""" Saturation from the v1.2 release of the ASC CDL color correction formula. - """, + """), }, "direction" : { "description" : - """ + _(""" The direction to perform the color transformation. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Forward" : GafferImage.OpenColorIOTransform.Direction.Forward, diff --git a/python/GafferImageUI/ChannelDataProcessorUI.py b/python/GafferImageUI/ChannelDataProcessorUI.py index 47f6d71fee1..7b8f5d52268 100644 --- a/python/GafferImageUI/ChannelDataProcessorUI.py +++ b/python/GafferImageUI/ChannelDataProcessorUI.py @@ -38,27 +38,28 @@ import GafferUI import GafferImage import GafferImageUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ChannelDataProcessor, "description", - """ + _(""" Base class for nodes which process a subset of the image channels, while leaving the format and data window unchanged. - """, + """), plugs = { "channels" : { "description" : - """ + _(""" The names of the channels to operate on. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelMaskPlugValueWidget", @@ -67,11 +68,11 @@ "processUnpremultiplied" : { "description" : - """ + _(""" Unpremultiplies data before processing, and premultiply again after processing. This allows accurate processing of nodes that deal with color, when running on partially transparent or deep images. - """, + """), }, diff --git a/python/GafferImageUI/ChannelMaskPlugValueWidget.py b/python/GafferImageUI/ChannelMaskPlugValueWidget.py index 9559e3b51c4..feee80f10bb 100644 --- a/python/GafferImageUI/ChannelMaskPlugValueWidget.py +++ b/python/GafferImageUI/ChannelMaskPlugValueWidget.py @@ -44,6 +44,7 @@ import Gaffer import GafferImage import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -96,7 +97,7 @@ def _updateFromValues( self, values, exception ) : self.__stringPlugValueWidget.setVisible( custom ) if custom : - self.__menuButton.setText( "Custom" ) + self.__menuButton.setText( _("Custom") ) elif self.__currentValue is None : self.__menuButton.setText( "---" ) else : @@ -118,7 +119,7 @@ def _updateFromValues( self, values, exception ) : if labels : self.__menuButton.setText( ", ".join( labels ) ) else : - self.__menuButton.setText( "None" ) + self.__menuButton.setText( _("None") ) self.__menuButton.setErrored( exception is not None ) @@ -162,8 +163,8 @@ def menuItem( matchPattern ) : result = IECore.MenuDefinition() - result.append( "/All", menuItem( "*" ) ) - result.append( "/None", menuItem( None ) ) + result.append( "/" + _("All"), dict( label = _("All"), **menuItem( "*" ) ) ) + result.append( "/" + _("None"), dict( label = _("None"), **menuItem( None ) ) ) for i, layerName in enumerate( sorted( availableChannels.layers.keys() ) ) : diff --git a/python/GafferImageUI/ChannelPlugValueWidget.py b/python/GafferImageUI/ChannelPlugValueWidget.py index 7b767ceb91e..904740653d8 100644 --- a/python/GafferImageUI/ChannelPlugValueWidget.py +++ b/python/GafferImageUI/ChannelPlugValueWidget.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -157,11 +158,11 @@ def __menuDefinition( self ) : ) if not result.items() : - result.append( "/No Channels Available", { "active" : False } ) + result.append( "/" + _("No Channels Available"), { "active" : False, "label" : _("No Channels Available") } ) result.append( "/CustomDivider", { "divider" : True } ) result.append( - "/Custom", + "/" + _("Custom"), { "command" : Gaffer.WeakMethod( self.__applyCustom ), "checkBox" : isCustom, diff --git a/python/GafferImageUI/CheckerboardUI.py b/python/GafferImageUI/CheckerboardUI.py index 30d575d4466..2a31070b705 100644 --- a/python/GafferImageUI/CheckerboardUI.py +++ b/python/GafferImageUI/CheckerboardUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ # Command suitable for use with `NodeMenu.append()`. def nodeMenuCreateCommand( menu ) : @@ -50,67 +51,67 @@ def nodeMenuCreateCommand( menu ) : GafferImage.Checkerboard, "description", - """ + _(""" Outputs an image of a checkerboard pattern. - """, + """), plugs = { "format" : { "description" : - """ + _(""" The resolution and aspect ratio of the image. - """, + """), }, "colorA" : { "description" : - """ + _(""" The colour of half of the squares of the pattern. - """, + """), }, "colorB" : { "description" : - """ + _(""" The colour of the other half of the squares of the pattern. - """, + """), }, "size" : { "description" : - """ + _(""" The size of the squares in pixels. This can be varied independently in the x and y directions. - """, + """), }, "layer" : { "description" : - """ + _(""" The layer to generate. The output channels will be named ( layer.R, layer.G, layer.B and layer.A ). - """, + """), "stringPlugValueWidget:placeholderText" : "[RGBA]", }, "transform" : { "description" : - """ + _(""" A transformation applied to the entire checkerboard pattern. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Transform", diff --git a/python/GafferImageUI/ClampUI.py b/python/GafferImageUI/ClampUI.py index 36782458255..64209239064 100644 --- a/python/GafferImageUI/ClampUI.py +++ b/python/GafferImageUI/ClampUI.py @@ -36,100 +36,101 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Clamp, "description", - """ + _(""" Clamps channel values so that they fit within a specified range. Clamping is performed for each channel individually, and out-of-range colours may be highlighted by setting them to a value different to the clamp threshold itself. - """, + """), plugs = { "min" : { "description" : - """ + _(""" The minimum value - values below this will be clamped if minEnabled is on. - """, + """), }, "max" : { "description" : - """ + _(""" The maximum value - values above this will be clamped if maxEnabled is on. - """, + """), }, "minClampTo" : { "description" : - """ + _(""" By default, values below the minimum value are clamped to the minimum value itself. If minClampToEnabled is on, they are instead set to this value. This can be useful for highlighting out-of-range values. - """, + """), }, "maxClampTo" : { "description" : - """ + _(""" By default, values above the maximum value are clamped to the maximum value itself. If maxClampToEnabled is on, they are instead set to this value. This can be useful for highlighting out-of-range values. - """, + """), }, "minEnabled" : { "description" : - """ + _(""" Turns on clamping for values below the min value. - """, + """), }, "maxEnabled" : { "description" : - """ + _(""" Turns on clamping for values above the max value. - """, + """), }, "minClampToEnabled" : { "description" : - """ + _(""" Turns on the effect of minClampTo, allowing out of range values to be highlighted. - """, + """), }, "maxClampToEnabled" : { "description" : - """ + _(""" Turns on the effect of maxClampTo, allowing out of range values to be highlighted. - """, + """), }, diff --git a/python/GafferImageUI/CollectImagesUI.py b/python/GafferImageUI/CollectImagesUI.py index 10b4d28b385..b334c385c25 100644 --- a/python/GafferImageUI/CollectImagesUI.py +++ b/python/GafferImageUI/CollectImagesUI.py @@ -37,16 +37,17 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.CollectImages, "description", - """ + _(""" Forms a series of image layers by repeatedly evaluating the input with different Contexts. Useful for networks that need to dynamically build an unknown number of image layers. - """, + """), "ui:spreadsheet:activeRowNamesConnection", "rootLayers", "ui:spreadsheet:selectorContextVariablePlug", "layerVariable", @@ -56,52 +57,52 @@ "in" : { "description" : - """ + _(""" The image which will be evaluated for each layer. - """, + """), }, "rootLayers" : { "description" : - """ + _(""" A list of values for the `layerVariable`, defining the layers to be collected. - """, + """), }, "layerVariable" : { "description" : - """ + _(""" This Context Variable will be set with the current layer name when evaluating the in plug. This allows you to vary the upstream processing for each new layer. - """, + """), }, "addLayerPrefix" : { "description" : - """ + _(""" When on, the output channel names are automatically prefixed with the name of the layer being collected. Should be turned off when the input channel names already contain the layer name. - """, + """), }, "mergeMetadata" : { "description" : - """ + _(""" Controls how the output metadata is generated from the collected images. By default, the metadata from the first image alone is passed through. When `mergeMetadata` is on, the metadata from all collected images is merged, with the last image winning in the case of multiple image specifying the same piece of metadata. - """, + """), }, } diff --git a/python/GafferImageUI/ColorInspectorToolUI.py b/python/GafferImageUI/ColorInspectorToolUI.py index b44d8468cce..ac2126acedd 100644 --- a/python/GafferImageUI/ColorInspectorToolUI.py +++ b/python/GafferImageUI/ColorInspectorToolUI.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage import GafferImageUI @@ -52,13 +53,13 @@ GafferImageUI.ColorInspectorTool, "description", - """ + _(""" Tool for showing color values. - Mouse over a pixel to show the color value. - Supports dragging color values from a pixel. - Ctrl + click to create a persistent pixel inspector. - Ctrl + drag to create a persistent region inspector. - """, + """), "viewer:shortCut", "I", "order", 0, @@ -489,13 +490,13 @@ def __init__( self, plug, **kw ) : if mode == GafferImageUI.ColorInspectorTool.ColorInspectorPlug.Mode.Cursor: m = IECore.MenuDefinition() - m.append( "/Pixel Inspector", - { "command" : functools.partial( Gaffer.WeakMethod( self.__addClick ), GafferImageUI.ColorInspectorTool.ColorInspectorPlug.Mode.Pixel ) } + m.append( "/" + _("Pixel Inspector"), + { "command" : functools.partial( Gaffer.WeakMethod( self.__addClick ), GafferImageUI.ColorInspectorTool.ColorInspectorPlug.Mode.Pixel ), "label" : _("Pixel Inspector") } ) - m.append( "/Area Inspector", - { "command" : functools.partial( Gaffer.WeakMethod( self.__addClick ), GafferImageUI.ColorInspectorTool.ColorInspectorPlug.Mode.Area ) } + m.append( "/" + _("Area Inspector"), + { "command" : functools.partial( Gaffer.WeakMethod( self.__addClick ), GafferImageUI.ColorInspectorTool.ColorInspectorPlug.Mode.Area ), "label" : _("Area Inspector") } ) - button = GafferUI.MenuButton( "", "plus.png", hasFrame=False, menu = GafferUI.Menu( m, title = "Add Color Inspector" ) ) + button = GafferUI.MenuButton( "", "plus.png", hasFrame=False, menu = GafferUI.Menu( m, title = _("Add Color Inspector") ) ) else: button = GafferUI.Button( "", "delete.png", hasFrame=False ) button.clickedSignal().connect( Gaffer.WeakMethod( self.__deleteClick ) ) diff --git a/python/GafferImageUI/ColorProcessorUI.py b/python/GafferImageUI/ColorProcessorUI.py index 0fd888f3126..7aad7857add 100644 --- a/python/GafferImageUI/ColorProcessorUI.py +++ b/python/GafferImageUI/ColorProcessorUI.py @@ -36,27 +36,28 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ColorProcessor, "description", - """ + _(""" Base class for nodes which process RGB layers with cross talk between channels. - """, + """), plugs = { "channels" : { "description" : - """ + _(""" The names of the channels to process. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelMaskPlugValueWidget", @@ -65,11 +66,11 @@ "processUnpremultiplied" : { "description" : - """ + _(""" Unpremultiplies data before processing, and premultiply again after processing. This allows accurate processing of nodes that deal with color, when running on partially transparent or deep images. - """, + """), }, diff --git a/python/GafferImageUI/ColorSpaceUI.py b/python/GafferImageUI/ColorSpaceUI.py index b3f4f5ad488..090682a9b3a 100644 --- a/python/GafferImageUI/ColorSpaceUI.py +++ b/python/GafferImageUI/ColorSpaceUI.py @@ -40,27 +40,28 @@ import GafferUI import GafferImage from . import OpenColorIOTransformUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ColorSpace, "description", - """ + _(""" Applies colour transformations provided by OpenColorIO. Configs are loaded from the configuration specified by the OCIO environment variable. - """, + """), plugs = { "inputSpace" : { "description" : - """ + _(""" The colour space of the input image. - """, + """), "presetNames" : OpenColorIOTransformUI.colorSpacePresetNames, "presetValues" : OpenColorIOTransformUI.colorSpacePresetValues, @@ -74,9 +75,9 @@ "outputSpace" : { "description" : - """ + _(""" The colour space of the output image. - """, + """), "presetNames" : OpenColorIOTransformUI.colorSpacePresetNames, "presetValues" : OpenColorIOTransformUI.colorSpacePresetValues, diff --git a/python/GafferImageUI/ConstantUI.py b/python/GafferImageUI/ConstantUI.py index 9b43b6bd728..eb8fc9200dd 100644 --- a/python/GafferImageUI/ConstantUI.py +++ b/python/GafferImageUI/ConstantUI.py @@ -36,43 +36,44 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Constant, "description", - """ + _(""" Outputs an image of a constant flat colour. - """, + """), plugs = { "format" : { "description" : - """ + _(""" The resolution and aspect ratio of the image. - """, + """), }, "color" : { "description" : - """ + _(""" The colour of the image. - """, + """), }, "layer" : { "description" : - """ + _(""" The layer to generate. The output channels will be named ( layer.R, layer.G, layer.B and layer.A ). - """, + """), "stringPlugValueWidget:placeholderText" : "[RGBA]", } diff --git a/python/GafferImageUI/ContactSheetCoreUI.py b/python/GafferImageUI/ContactSheetCoreUI.py index a6cbbc9a66e..8bc86a36dad 100644 --- a/python/GafferImageUI/ContactSheetCoreUI.py +++ b/python/GafferImageUI/ContactSheetCoreUI.py @@ -36,59 +36,60 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ContactSheetCore, "description", - """ + _(""" Collects multiple input images, transforming them into tiles within the output image. Provides the core functionality of the ContactSheet node, and may be reused for making similar nodes. - """, + """), plugs = { "format" : { "description" : - """ + _(""" The resolution and aspect ratio of the output image. - """, + """), }, "tiles" : { "description" : - """ + _(""" The bounding boxes of each tile. > Note : Each input image will be scaled to fit entirely within its tile > while preserving aspect ratio. - """, + """), }, "tileVariable" : { "description" : - """ + _(""" Context variable used to pass the index of the current tile to the upstream node network. This should be used to provide a different input image per tile. - """, + """), }, "filter" : { "description" : - """ + _(""" The pixel filter used when resizing the input images. Each filter provides different tradeoffs between sharpness and the danger of aliasing or ringing. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", diff --git a/python/GafferImageUI/CopyChannelsUI.py b/python/GafferImageUI/CopyChannelsUI.py index 6fad4d8f437..e12cc65b932 100644 --- a/python/GafferImageUI/CopyChannelsUI.py +++ b/python/GafferImageUI/CopyChannelsUI.py @@ -36,27 +36,28 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.CopyChannels, "description", - """ + _(""" Copies channels from the secondary input images onto the primary input image and outputs the result. - """, + """), plugs = { "channels" : { "description" : - """ + _(""" The names of the channels to copy. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelMaskPlugValueWidget", diff --git a/python/GafferImageUI/CopyImageMetadataUI.py b/python/GafferImageUI/CopyImageMetadataUI.py index df9b2244826..0ec40e1eb81 100644 --- a/python/GafferImageUI/CopyImageMetadataUI.py +++ b/python/GafferImageUI/CopyImageMetadataUI.py @@ -37,45 +37,46 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.CopyImageMetadata, "description", - """ + _(""" Copies metadata entries from the second image to the first image based on name. If those entries already exist in the incoming image metadata, their values will be overwritten. - """, + """), plugs = { "copyFrom" : { "description" : - """ + _(""" The image to copy the metadata entries from. - """, + """), }, "names" : { "description" : - """ + _(""" The names of metadata entries to be copied. This is a space separated list of entry names, which accepts Gaffer's standard string wildcards. - """, + """), }, "invertNames" : { "description" : - """ + _(""" When on, matching names are ignored, and non-matching names are copied instead. - """, + """), }, diff --git a/python/GafferImageUI/CopyViewsUI.py b/python/GafferImageUI/CopyViewsUI.py index a7377b9a114..7a9a59bd3d6 100644 --- a/python/GafferImageUI/CopyViewsUI.py +++ b/python/GafferImageUI/CopyViewsUI.py @@ -38,27 +38,28 @@ import GafferImage import GafferUI import imath +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.CopyViews, "description", - """ + _(""" Copies views from the secondary input images onto the primary input image. Only works with multi-view images. - """, + """), plugs = { "views" : { "description" : - """ + _(""" The names of the views to copy. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), }, diff --git a/python/GafferImageUI/CreateViewsUI.py b/python/GafferImageUI/CreateViewsUI.py index 8251e1fe3b0..b587e6a948d 100644 --- a/python/GafferImageUI/CreateViewsUI.py +++ b/python/GafferImageUI/CreateViewsUI.py @@ -38,6 +38,7 @@ import GafferImage import GafferUI import imath +from GafferUI.i18n import _ ## A function suitable as the postCreator in a NodeMenu.append() call. It # sets up the default "left" and "right" views @@ -52,15 +53,15 @@ def postCreate( node, menu ) : GafferImage.CreateViews, "description", - """ + _(""" Creates a multi-view image by combining multiple input images. - """, + """), plugs = { "views" : { "description" : - "Views to add. In the case of multiple views with the same name, the last one will override.", + _("Views to add. In the case of multiple views with the same name, the last one will override."), "nodule:type" : "GafferUI::CompoundNodule", "noduleLayout:spacing" : 2.0, @@ -81,11 +82,11 @@ def postCreate( node, menu ) : "views.*.name" : { "description" : - """ + _(""" The name of the view to be created from this input. Usually "left" or "right" for a stereo workflow, but can be any name, allowing arbitrary numbers of views to be created in a single image stream. - """, + """), "nodule:type" : "", @@ -93,9 +94,9 @@ def postCreate( node, menu ) : "views.*.enabled" : { "description" : - """ + _(""" Enables this view. - """, + """), "nodule:type" : "", @@ -103,10 +104,10 @@ def postCreate( node, menu ) : "views.*.value" : { "description" : - """ + _(""" Provides the image to be used to create this view. The connected image should not itself be a multi-view image. - """, + """), "plugValueWidget:type" : "GafferUI.ConnectionPlugValueWidget", "noduleLayout:label" : lambda plug : plug.parent()["name"].getValue(), diff --git a/python/GafferImageUI/CropUI.py b/python/GafferImageUI/CropUI.py index a26fc49b026..66f71dea215 100644 --- a/python/GafferImageUI/CropUI.py +++ b/python/GafferImageUI/CropUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ ## A function suitable as the postCreator in a NodeMenu.append() call. It # sets the area for the node to cover the entire format. @@ -57,11 +58,11 @@ def postCreate( node, menu ) : GafferImage.Crop, "description", - """ + _(""" Modifies the Data and/or Display Window, in a way that is either user-defined, or can be driven by the existing Data or Display Window. - """, + """), "layout:activator:areaSourceIsArea", lambda node : node["areaSource"].getValue() == GafferImage.Crop.AreaSource.Area, "layout:activator:areaSourceIsFormat", lambda node : node["areaSource"].getValue() == GafferImage.Crop.AreaSource.Format, @@ -73,7 +74,7 @@ def postCreate( node, menu ) : "areaSource" : { "description" : - """ + _(""" The source of the area to crop to. - Area : A user-defined area specified by the `area` plug. @@ -84,7 +85,7 @@ def postCreate( node, menu ) : of the input image. For flat images, this means pixels with a non-zero value in at least one channel, and for deep images it means pixels with at least one sample. - """, + """), "preset:Area" : GafferImage.Crop.AreaSource.Area, "preset:Format" : GafferImage.Crop.AreaSource.Format, @@ -99,11 +100,11 @@ def postCreate( node, menu ) : "area" : { "description" : - """ + _(""" The custom area to set the Data/Display Window to. This plug is only used if 'Area Source' is set to Area. - """, + """), "layout:activator" : "areaSourceIsArea", @@ -112,11 +113,11 @@ def postCreate( node, menu ) : "format" : { "description" : - """ + _(""" The Format to use as the area to set the Data/Display Window to. This plug is only used if 'Area Source' is set to Format. - """, + """), "layout:activator" : "areaSourceIsFormat", @@ -125,13 +126,13 @@ def postCreate( node, menu ) : "formatCenter" : { "description" : - """ + _(""" Whether to center the output image (based on the existing display window) inside the new display window format. This plug is only used if 'Area Source' is set to Format, and 'Affect Display Window' it checked. - """, + """), "layout:activator" : "areaSourceIsFormatAndAffectDisplayWindowIsOn", "layout:divider" : True @@ -141,31 +142,31 @@ def postCreate( node, menu ) : "affectDataWindow" : { "description" : - """ + _(""" Whether to intersect the defined area with the input Data Window. It will never pad black onto the Data Window, it will only ever reduce the existing Data Window. - """, + """), }, "affectDisplayWindow" : { "description" : - """ + _(""" Whether to assign a new Display Window based on the defined area. - """, + """), }, "resetOrigin" : { "description" : - """ + _(""" Shifts the cropped image area back to the origin, so that the bottom left of the display window is at ( 0, 0 ). - """, + """), "layout:activator" : "affectDisplayWindowIsOn", diff --git a/python/GafferImageUI/DataWindowQueryUI.py b/python/GafferImageUI/DataWindowQueryUI.py index 660ea7cf8ef..e61b9524b34 100644 --- a/python/GafferImageUI/DataWindowQueryUI.py +++ b/python/GafferImageUI/DataWindowQueryUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DataWindowQuery, "description", - """ + _(""" Queries the data window of an image as well as the center and size of the data window. - """, + """), "layout:section:Settings.Outputs:collapsed", False, plugs = { @@ -52,18 +53,18 @@ "in" : { "description" : - """ + _(""" The image to query. - """, + """), }, "view" : { "description" : - """ + _(""" The view to query. - """, + """), "nodule:type" : "", "plugValueWidget:type" : "GafferImageUI.ViewPlugValueWidget", @@ -74,9 +75,9 @@ "dataWindow" : { "description" : - """ + _(""" The data window of the image. - """, + """), "nodule:type" : "GafferUI::CompoundNodule", "layout:section" : "Settings.Outputs", @@ -85,9 +86,9 @@ "center" : { "description" : - """ + _(""" The center of the data window of the image. - """, + """), "layout:section" : "Settings.Outputs", }, @@ -95,9 +96,9 @@ "size" : { "description" : - """ + _(""" The size of the data window of the image. - """, + """), "layout:section" : "Settings.Outputs", }, diff --git a/python/GafferImageUI/DeepHoldoutUI.py b/python/GafferImageUI/DeepHoldoutUI.py index 5e47a117cc4..71a273094dc 100644 --- a/python/GafferImageUI/DeepHoldoutUI.py +++ b/python/GafferImageUI/DeepHoldoutUI.py @@ -36,24 +36,25 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepHoldout, "description", - """ + _(""" Flattens the part of the input which is not hidden by the holdout input. - """, + """), plugs = { "holdout" : { "description" : - """ + _(""" Hides the parts of the main input which are behind this image, based on its Z, ZBack and A channels. - """, + """), }, diff --git a/python/GafferImageUI/DeepMergeUI.py b/python/GafferImageUI/DeepMergeUI.py index 1f8796f6cf5..28fbc97a473 100644 --- a/python/GafferImageUI/DeepMergeUI.py +++ b/python/GafferImageUI/DeepMergeUI.py @@ -36,25 +36,26 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepMerge, "description", - """ + _(""" Merges the samples from two or more images into a single deep image. The source images may be deep or flat. - """, + """), plugs = { "in.*" : { "description" : - """ + _(""" A deep or flat image input. - """, + """), }, diff --git a/python/GafferImageUI/DeepRecolorUI.py b/python/GafferImageUI/DeepRecolorUI.py index f9cd73f090c..32c01694b78 100644 --- a/python/GafferImageUI/DeepRecolorUI.py +++ b/python/GafferImageUI/DeepRecolorUI.py @@ -36,35 +36,36 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepRecolor, "description", - """ + _(""" Recolors deep data so that the flattened image will match the color of a provided flat image. Keeps the same depth data, and mostly the same alpha ( with a small adjustment if you select useColorSourceAlpha ). - """, + """), plugs = { "colorSource" : { "description" : - """ + _(""" This image ( which must be flat ) drives the color of the output image. - """, + """), }, "useColorSourceAlpha" : { "description" : - """ + _(""" If selected, adjusts the alpha of each deep sample so that the composited result will match the alpha of colorSource. - """, + """), }, } diff --git a/python/GafferImageUI/DeepSampleCountsUI.py b/python/GafferImageUI/DeepSampleCountsUI.py index 9518889d06a..44e079ed227 100644 --- a/python/GafferImageUI/DeepSampleCountsUI.py +++ b/python/GafferImageUI/DeepSampleCountsUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepSampleCounts, "description", - """ + _(""" Outputs an image showing the deep sample counts for each pixel. - """, + """), ) diff --git a/python/GafferImageUI/DeepSamplerUI.py b/python/GafferImageUI/DeepSamplerUI.py index 098da5714af..ea7ad490214 100644 --- a/python/GafferImageUI/DeepSamplerUI.py +++ b/python/GafferImageUI/DeepSamplerUI.py @@ -36,43 +36,44 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepSampler, "description", - """ + _(""" Samples the full channel data of an image at a specified pixel location, including all deep samples. - """, + """), plugs = { "image" : { "description" : - """ + _(""" The image to be sampled. - """, + """), }, "pixel" : { "description" : - """ + _(""" The integer coordinates of the pixel to sample. - """, + """), }, "pixelData" : { "description" : - """ + _(""" The sampled data, as a CompoundData with one FloatVectorData per channel. - """, + """), } diff --git a/python/GafferImageUI/DeepSliceUI.py b/python/GafferImageUI/DeepSliceUI.py index bba462a2066..2afe84a66ff 100644 --- a/python/GafferImageUI/DeepSliceUI.py +++ b/python/GafferImageUI/DeepSliceUI.py @@ -36,51 +36,52 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepSlice, "description", - """ + _(""" Takes a slice out of an image with depth defined by Z ( and optionally ZBack ) channels by discarding everything outside of a clipping range. The range is half open, including point samples exactly at the near clip, but excluding point samples exactly at the far clip. This means that if you split an image into a front and back with two DeepSlices, they will composite back together to match the original. Optionally also flattens the image. - """, + """), plugs = { "nearClip" : { "description" : - """ + _(""" Removes everything with Z less than the near clip depth. - """, + """), }, - "nearClip.enabled" : { "description" : "Enables near clip." }, - "nearClip.value" : { "description" : "Depth for near clip." }, + "nearClip.enabled" : { "description" : _("Enables near clip.") }, + "nearClip.value" : { "description" : _("Depth for near clip.") }, "farClip" : { "description" : - """ + _(""" Removes everything with Z greater than or equal to the far clip depth. - """, + """), }, - "farClip.enabled" : { "description" : "Enables far clip." }, - "farClip.value" : { "description" : "Depth for far clip." }, + "farClip.enabled" : { "description" : _("Enables far clip.") }, + "farClip.value" : { "description" : _("Depth for far clip.") }, "flatten" : { "description" : - """ + _(""" Outputs a flat image, instead of output a deep image with any samples within the range. Flattening as part of DeepSlice is up to 2X faster than flattening afterwards, and is convenient if you're using a DeepSlice to preview the contents of a deep image by scrubbing through depth. - """, + """), }, } diff --git a/python/GafferImageUI/DeepStateUI.py b/python/GafferImageUI/DeepStateUI.py index 46ed6ebb6cb..7089f689162 100644 --- a/python/GafferImageUI/DeepStateUI.py +++ b/python/GafferImageUI/DeepStateUI.py @@ -36,18 +36,19 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepState, "description", - """ + _(""" Modifies the samples of a deep image so that the composited result stays the same, but there are additional desirable properties, such as being sorted, non-overlapping, or being combined into a single sample. - """, + """), "layout:activator:prune", lambda node : node["deepState"].getValue() == GafferImage.DeepState.TargetState.Tidy, "layout:activator:pruneOccluded", lambda node : ( node["deepState"].getValue() == GafferImage.DeepState.TargetState.Tidy and node["pruneOccluded"].getValue() @@ -58,22 +59,22 @@ "in" : { "description" : - """ + _(""" The input image data. - """, + """), }, "deepState" : { "description" : - """ + _(""" The desired state. "Sorted" merely orders the samples. "Tidy" performs sorting, splitting, and merging, to produce non-overlapping samples, and optionally prunes useless samples. "Flat" composites samples into a single sample per pixel. - """, + """), "preset:Sorted" : GafferImage.DeepState.TargetState.Sorted, "preset:Tidy" : GafferImage.DeepState.TargetState.Tidy, @@ -86,11 +87,11 @@ "pruneTransparent" : { "description" : - """ + _(""" When tidying, omits fully transparent samples. This is usually just an optimization, but it could affect the composited result if you start with purely additive samples that have zero alpha, but still add to the color. - """, + """), "layout:activator" : "prune", }, @@ -98,10 +99,10 @@ "pruneOccluded" : { "description" : - """ + _(""" When tidying, omits samples which are blocked by samples in front of them ( occluded samples have no effect on the composited result. - """, + """), "layout:activator" : "prune", }, @@ -109,13 +110,13 @@ "occludedThreshold" : { "description" : - """ + _(""" How blocked does a sample have to be before it is omitted. By default, only 100% occluded samples are omitted, but if you select 0.99, then samples with only 1% visibility would also be omitted. The composited result is preserved by combining the values of any omitted samples with the last sample generated. Using a threshold lower than 0.99 before doing a DeepMerge or DeepHoldout could introduce large errors, however. - """, + """), "layout:activator" : "pruneOccluded", }, diff --git a/python/GafferImageUI/DeepTidyUI.py b/python/GafferImageUI/DeepTidyUI.py index 219d1d1f8f7..dda4bc07df5 100644 --- a/python/GafferImageUI/DeepTidyUI.py +++ b/python/GafferImageUI/DeepTidyUI.py @@ -36,16 +36,17 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepTidy, "description", - """ + _(""" Ensures deep samples are sorted and non-overlapping, and optionally discards samples that are completely transparent, or covered by other samples. - """, + """), ) diff --git a/python/GafferImageUI/DeepToFlatUI.py b/python/GafferImageUI/DeepToFlatUI.py index 903f6e17e8f..a48377b8bdd 100644 --- a/python/GafferImageUI/DeepToFlatUI.py +++ b/python/GafferImageUI/DeepToFlatUI.py @@ -36,37 +36,38 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeepToFlat, "description", - """ + _(""" Converts a deep image into a "flat" image, by compositing all samples in each pixel, resulting in an image with 1 sample for every pixel. - """, + """), plugs = { "in" : { "description" : - """ + _(""" The input image data. - """, + """), }, "depthMode" : { "description" : - """ + _(""" Controls the contents of the output depth channels. "Depth Range" outputs the minimum and maximum depth values of any sample in the pixel as Z and ZBack. "Filtered Depth" outputs just a Z channel with the average depth for the pixel, based on the alpha values of the samples. "None" outputs no Z or ZBack channel. - """, + """), "preset:Depth Range" : GafferImage.DeepToFlat.DepthMode.Range, "preset:Filtered Depth" : GafferImage.DeepToFlat.DepthMode.Filtered, diff --git a/python/GafferImageUI/DeleteChannelsUI.py b/python/GafferImageUI/DeleteChannelsUI.py index 8dcab64d8c9..775b80b09b2 100644 --- a/python/GafferImageUI/DeleteChannelsUI.py +++ b/python/GafferImageUI/DeleteChannelsUI.py @@ -38,27 +38,28 @@ import GafferUI import GafferImage import GafferImageUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeleteChannels, "description", - """ + _(""" Deletes channels from an image. - """, + """), plugs = { "mode" : { "description" : - """ + _(""" Defines how the channels listed in the channels plug are treated. Delete mode deletes the listed channels. Keep mode keeps the listed channels, deleting all others. - """, + """), "preset:Delete" : GafferImage.DeleteChannels.Mode.Delete, "preset:Keep" : GafferImage.DeleteChannels.Mode.Keep, @@ -70,12 +71,12 @@ "channels" : { "description" : - """ + _(""" The names of the channels to be deleted (or kept if the mode is set to Keep). Names should be separated by spaces and may contain any of Gaffer's standard wildcards. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelMaskPlugValueWidget", diff --git a/python/GafferImageUI/DeleteImageMetadataUI.py b/python/GafferImageUI/DeleteImageMetadataUI.py index 492b8e9aeb6..bd932fba0f4 100644 --- a/python/GafferImageUI/DeleteImageMetadataUI.py +++ b/python/GafferImageUI/DeleteImageMetadataUI.py @@ -37,34 +37,35 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeleteImageMetadata, "description", - """ + _(""" Deletes metadata entries from an image based on name. - """, + """), plugs = { "names" : { "description" : - """ + _(""" The names of metadata entries to be removed. This is a space separated list of entry names, which accepts Gaffer's standard string wildcards. - """, + """), }, "invertNames" : { "description" : - """ + _(""" When on, matching names are kept, and non-matching names are removed. - """, + """), }, diff --git a/python/GafferImageUI/DeleteViewsUI.py b/python/GafferImageUI/DeleteViewsUI.py index 1742dbf2ced..4274ba95ce5 100644 --- a/python/GafferImageUI/DeleteViewsUI.py +++ b/python/GafferImageUI/DeleteViewsUI.py @@ -38,27 +38,28 @@ import GafferImage import GafferUI import imath +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.DeleteViews, "description", - """ + _(""" Deletes views from an image. - """, + """), plugs = { "mode" : { "description" : - """ + _(""" Defines how the views listed in the views plug are treated. Delete mode deletes the listed views. Keep mode keeps the listed views, deleting all others. - """, + """), "preset:Delete" : GafferImage.DeleteViews.Mode.Delete, "preset:Keep" : GafferImage.DeleteViews.Mode.Keep, @@ -70,7 +71,7 @@ "views" : { "description" : - """ + _(""" The names of the views to be deleted (or kept if the mode is set to Keep). Names should be separated by spaces and may contain any of Gaffer's standard @@ -79,7 +80,7 @@ Note that if you delete all views from an image, you will be unable to evaluate attributes of the image, because it will have no data left. - """, + """), }, diff --git a/python/GafferImageUI/DilateUI.py b/python/GafferImageUI/DilateUI.py index 8c179fcaf1d..9f318f05f94 100644 --- a/python/GafferImageUI/DilateUI.py +++ b/python/GafferImageUI/DilateUI.py @@ -35,6 +35,7 @@ ########################################################################## import Gaffer import GafferImage +from GafferUI.i18n import _ # Command suitable for use with `NodeMenu.append()`. def nodeMenuCreateCommand( menu ) : @@ -49,9 +50,9 @@ def nodeMenuCreateCommand( menu ) : GafferImage.Dilate, "description", - """ + _(""" Applies a dilate filter to the image. This can be useful for expanding mask. - """, + """), ) diff --git a/python/GafferImageUI/DiskBlurUI.py b/python/GafferImageUI/DiskBlurUI.py index f3969684928..d1bd45613f4 100644 --- a/python/GafferImageUI/DiskBlurUI.py +++ b/python/GafferImageUI/DiskBlurUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( @@ -45,31 +46,31 @@ GafferImage.DiskBlur, "description", - """ + _(""" A special disk blur node which efficiently supports large radius blurs, and allows for a variable radius. Works by rendering each input pixel as a disk in the output, using special acceleration structures that make rendering large disks fast. Suitable as a building block for focal blur. - """, + """), plugs = { "radius" : { "description" : - """ + _(""" The radius of the disk to blur by in pixels. - """, + """), }, "radiusChannel" : { "description" : - """ + _(""" An optional input image channel which defines a blur radius per pixel, allowing the radius to be varied across the image. The per-pixel radius is multiplied with the main radius control. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", "channelPlugValueWidget:extraChannels" : IECore.StringVectorData( [ "" ] ), "channelPlugValueWidget:extraChannelLabels" : IECore.StringVectorData( [ "None" ] ), @@ -78,11 +79,11 @@ "approximationThreshold" : { "description" : - """ + _(""" The maximum acceptable error caused by omitting anti-aliasing for a particular disk. Since very large disks often contribute very little to each individual output pixel, omitting anti-aliasing for them can provide a substantial speed improvement. - """, + """), "layout:section" : "Advanced" }, @@ -90,10 +91,10 @@ "maxRadius" : { "description" : - """ + _(""" An upper limit on the disk radius (`radiusChannel * radius`). Larger disks will be clamped to this size. Used to accelerate rendering, so higher-than-necessary settings may reduce speed. - """, + """), }, @@ -118,7 +119,7 @@ "layerBoundaries" : { "description" : - """ + _(""" Defines a series of layers which are alpha-composited to generate the final image. Each layer contains all the disks within a specific radius range, allowing "foreground" disks to occlude "background" disks. Intended for use in approximating focal blur. @@ -131,7 +132,7 @@ > Tip : The FocalBlur node provides a simpler and more intuitive method for defining occlusion layers (it uses the DiskBlur node internally). - """, + """), "layout:section" : "Advanced" diff --git a/python/GafferImageUI/DisplayTransformUI.py b/python/GafferImageUI/DisplayTransformUI.py index 4e946c19f6a..a20d815e501 100644 --- a/python/GafferImageUI/DisplayTransformUI.py +++ b/python/GafferImageUI/DisplayTransformUI.py @@ -42,6 +42,7 @@ import GafferUI import GafferImage from . import OpenColorIOTransformUI +from GafferUI.i18n import _ def __displayPresetNames( plug ) : @@ -72,18 +73,18 @@ def __viewPresetValues( plug ) : GafferImage.DisplayTransform, "description", - """ + _(""" Applies an OpenColorIO display transform to an image. - """, + """), plugs = { "inputColorSpace" : { "description" : - """ + _(""" The colour space of the input image. - """, + """), "presetNames" : OpenColorIOTransformUI.colorSpacePresetNames, "presetValues" : OpenColorIOTransformUI.colorSpacePresetValues, @@ -96,10 +97,10 @@ def __viewPresetValues( plug ) : "display" : { "description" : - """ + _(""" The name of the display to use. Defaults to the default display as defined by the current OpenColorIO config. - """, + """), "presetNames" : __displayPresetNames, "presetValues" : __displayPresetValues, @@ -111,10 +112,10 @@ def __viewPresetValues( plug ) : "view" : { "description" : - """ + _(""" The name of the view to use. Defaults to the default view for the display, as defined by the current OpenColorIO config. - """, + """), "presetNames" : __viewPresetNames, "presetValues" : __viewPresetValues, diff --git a/python/GafferImageUI/EmptyUI.py b/python/GafferImageUI/EmptyUI.py index 48c8d89094d..f2b30003895 100644 --- a/python/GafferImageUI/EmptyUI.py +++ b/python/GafferImageUI/EmptyUI.py @@ -36,24 +36,25 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Empty, "description", - """ + _(""" Outputs an empty deep image with 0 samples per pixel. - """, + """), plugs = { "format" : { "description" : - """ + _(""" The resolution and aspect ratio of the image. - """, + """), }, diff --git a/python/GafferImageUI/ErodeUI.py b/python/GafferImageUI/ErodeUI.py index 903cd437e8d..08c24a765fe 100644 --- a/python/GafferImageUI/ErodeUI.py +++ b/python/GafferImageUI/ErodeUI.py @@ -35,6 +35,7 @@ ########################################################################## import Gaffer import GafferImage +from GafferUI.i18n import _ # Command suitable for use with `NodeMenu.append()`. def nodeMenuCreateCommand( menu ) : @@ -49,10 +50,10 @@ def nodeMenuCreateCommand( menu ) : GafferImage.Erode, "description", - """ + _(""" Applies an erode filter to the image. This can be useful for shrinking mask. - """, + """), ) diff --git a/python/GafferImageUI/FlatImageProcessorUI.py b/python/GafferImageUI/FlatImageProcessorUI.py index 2783593dbbb..88765da28e1 100644 --- a/python/GafferImageUI/FlatImageProcessorUI.py +++ b/python/GafferImageUI/FlatImageProcessorUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.FlatImageProcessor, "description", - """ + _(""" Base class for nodes which process only flat image data and so will error on non-flat data. - """, + """), ) diff --git a/python/GafferImageUI/FlatImageSourceUI.py b/python/GafferImageUI/FlatImageSourceUI.py index 6069a2726a7..ee2d1dbf931 100644 --- a/python/GafferImageUI/FlatImageSourceUI.py +++ b/python/GafferImageUI/FlatImageSourceUI.py @@ -36,14 +36,15 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.FlatImageSource, "description", - """ + _(""" Base class for nodes which create a flat image. - """, + """), ) diff --git a/python/GafferImageUI/FlatToDeepUI.py b/python/GafferImageUI/FlatToDeepUI.py index 585e967a2bc..6d5c7e568f1 100644 --- a/python/GafferImageUI/FlatToDeepUI.py +++ b/python/GafferImageUI/FlatToDeepUI.py @@ -37,16 +37,17 @@ import Gaffer import GafferImage import IECore +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.FlatToDeep, "description", - """ + _(""" Sets the deep flag on a flat image, and makes sure that it has a Z channel ( and optionally a ZBack channel ) so that it can be used in deep compositing. - """, + """), "layout:activator:zConstant", lambda node : node["zMode"].getValue() == GafferImage.FlatToDeep.ZMode.Constant, "layout:activator:zChannel", lambda node : node["zMode"].getValue() == GafferImage.FlatToDeep.ZMode.Channel, @@ -57,9 +58,9 @@ plugs = { "zMode" : { "description" : - """ + _(""" Deep images must have a Z channel - it can be set either as a fixed depth, or using a channel. - """, + """), "preset:Constant" : GafferImage.FlatToDeep.ZMode.Constant, "preset:Channel" : GafferImage.FlatToDeep.ZMode.Channel, @@ -71,28 +72,28 @@ "depth" : { "description" : - """ + _(""" A constant depth value to place the whole image at. - """, + """), "layout:visibilityActivator" : "zConstant", }, "zChannel" : { "description" : - """ + _(""" Uses this channel as a Z channel, defining the depth each pixel is at. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", "layout:visibilityActivator" : "zChannel", }, "zBackMode" : { "description" : - """ + _(""" Deep images may optionally have a ZBack channel - for transparent samples, this specifies the depth range over which the opacity gradually increases from 0 to the alpha value. - """, + """), "preset:None" : GafferImage.FlatToDeep.ZBackMode.None_, "preset:Thickness" : GafferImage.FlatToDeep.ZBackMode.Thickness, @@ -105,20 +106,20 @@ "thickness" : { "description" : - """ + _(""" A constant thickness value for the whole image. Transparent images will be interpreted as fog where the density increases over this range. - """, + """), "layout:visibilityActivator" : "zBackThickness", }, "zBackChannel" : { "description" : - """ + _(""" Uses this channel as a ZBack channel, defining the end of the depth range for each pixel. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", "layout:visibilityActivator" : "zBackChannel", }, diff --git a/python/GafferImageUI/FormatPlugValueWidget.py b/python/GafferImageUI/FormatPlugValueWidget.py index 79479a392b2..6caac51a406 100644 --- a/python/GafferImageUI/FormatPlugValueWidget.py +++ b/python/GafferImageUI/FormatPlugValueWidget.py @@ -40,6 +40,7 @@ import IECore import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage from GafferUI.PlugValueWidget import sole @@ -58,15 +59,15 @@ def __init__( self, plugs, **kw ) : ) with grid.nextRow() : - self.__minLabel = GafferUI.Label( "Min", parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) } ) + self.__minLabel = GafferUI.Label( _("Min"), parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) } ) self.__minWidget = GafferUI.CompoundNumericPlugValueWidget( plugs = [] ) with grid.nextRow() : - self.__maxLabel = GafferUI.Label( "Max", parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) } ) + self.__maxLabel = GafferUI.Label( _("Max"), parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) } ) self.__maxWidget = GafferUI.CompoundNumericPlugValueWidget( plugs = [] ) with grid.nextRow() : - self.__pixelAspectLabel = GafferUI.Label( "Pixel Aspect", parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) } ) + self.__pixelAspectLabel = GafferUI.Label( _("Pixel Aspect"), parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) } ) self.__pixelAspectWidget = GafferUI.NumericPlugValueWidget( plugs = [] ) self._addPopupMenu( self.__menuButton ) @@ -96,7 +97,7 @@ def _updateFromValues( self, values, exception ) : custom = True self.__menuButton.setText( - "Custom" if custom + _("Custom") if custom else ( _formatLabel( self.__currentFormat, self.context() ) if self.__currentFormat is not None else "---" ) ) @@ -108,7 +109,7 @@ def _updateFromValues( self, values, exception ) : for widget in ( self.__maxLabel, self.__maxWidget, self.__pixelAspectLabel, self.__pixelAspectWidget ) : widget.setVisible( custom ) - self.__maxLabel.setText( "Max" if nonZeroOrigin else "Size" ) + self.__maxLabel.setText( _("Max") if nonZeroOrigin else _("Size") ) self.__menuButton.setErrored( exception is not None ) @@ -157,7 +158,7 @@ def __menuDefinition( self ) : result.append( "/CustomDivider", { "divider" : True } ) result.append( - "/Custom", + "/" + _("Custom"), { "command" : Gaffer.WeakMethod( self.__applyCustomFormat ), "checkBox" : modeIsCustom or self.__currentFormat not in formats, diff --git a/python/GafferImageUI/FormatQueryUI.py b/python/GafferImageUI/FormatQueryUI.py index d707a0f6341..2b1436bacd5 100644 --- a/python/GafferImageUI/FormatQueryUI.py +++ b/python/GafferImageUI/FormatQueryUI.py @@ -36,16 +36,17 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.FormatQuery, "description", - """ + _(""" Extracts the format of an input image, for driving the format input of another image node, or driving expressions. - """, + """), "layout:section:Settings.Out:collapsed", False, plugs = { @@ -53,18 +54,18 @@ "image" : { "description" : - """ + _(""" The image to query. - """, + """), }, "view" : { "description" : - """ + _(""" The view to be queried. - """, + """), "nodule:type" : "", "plugValueWidget:type" : "GafferImageUI.ViewPlugValueWidget", @@ -75,9 +76,9 @@ "format" : { "description" : - """ + _(""" The format of the image ( as a FormatPlug, compatible with inputs on Constant or Resize ). - """, + """), "nodule:type" : "GafferUI::CompoundNodule", "layout:section" : "Settings.Out", @@ -89,9 +90,9 @@ "center" : { "description" : - """ + _(""" The middle of the displayWindow. Stored as V2f, since it could be a half-pixel. - """, + """), "layout:section" : "Settings.Out", }, @@ -99,9 +100,9 @@ "size" : { "description" : - """ + _(""" The size of the displayWindow as V2i. - """, + """), "layout:section" : "Settings.Out", }, diff --git a/python/GafferImageUI/GradeUI.py b/python/GafferImageUI/GradeUI.py index 9c6e62355ea..708ea7694c9 100644 --- a/python/GafferImageUI/GradeUI.py +++ b/python/GafferImageUI/GradeUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Grade, "description", - """ + _(""" Performs a simple per-channel colour grading operation as follows : @@ -52,97 +53,97 @@ See the descriptions for individual plug for a slightly more practical explanation of the formula. - """, + """), plugs = { "blackPoint" : { "description" : - """ + _(""" The input colour which is considered to be "black". This colour is remapped to the lift value in the output image. - """, + """), }, "whitePoint" : { "description" : - """ + _(""" The input colour which is considered to be "white". This colour is remapped to the gain value in the output image. - """, + """), }, "lift" : { "description" : - """ + _(""" The colour that input pixels at the blackPoint become in the output image. This can be thought of as lifting the darker values of the image. - """, + """), }, "gain" : { "description" : - """ + _(""" The colour that input pixels at the whitePoint become in the output image. This can be thought of as defining the lighter values of the image. - """, + """), }, "multiply" : { "description" : - """ + _(""" An additional multiplier on the output values. - """, + """), }, "offset" : { "description" : - """ + _(""" An additional offset added to the output values. - """, + """), }, "gamma" : { "description" : - """ + _(""" A gamma correction applied after all the remapping defined above. - """, + """), }, "blackClamp" : { "description" : - """ + _(""" Clamps input values so they don't go below 0. - """, + """), }, "whiteClamp" : { "description" : - """ + _(""" Clamps output values so they don't go above 1. - """, + """), }, diff --git a/python/GafferImageUI/ImageInspector.py b/python/GafferImageUI/ImageInspector.py index ba93f422a79..74b78ab6a2d 100644 --- a/python/GafferImageUI/ImageInspector.py +++ b/python/GafferImageUI/ImageInspector.py @@ -38,6 +38,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage import GafferImageUI @@ -101,14 +102,14 @@ def __init__( self, scriptNode, **kw ) : Gaffer.DictPath( {}, "/" ), # Placeholder, updated in `__setPathListingPaths()`` columns = [ GafferUI.PathListingWidget.defaultNameColumn, - GafferUI.StandardPathColumn( "Value", "image:value", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ) + GafferUI.StandardPathColumn( _("Value"), "image:value", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ) ], displayMode = GafferUI.PathListingWidget.DisplayMode.Tree, selectionMode = GafferUI.PathListingWidget.SelectionMode.Cell, horizontalScrollMode = GafferUI.ScrollMode.Automatic, sortable = False, parenting = { - "label" : "Image" + "label" : _("Image") } ) @@ -119,21 +120,21 @@ def __init__( self, scriptNode, **kw ) : GafferUI.StandardPathColumn( GafferUI.PathColumn.CellData( "Min", - toolTip = "The minimum value of all pixels in the data window." + toolTip = _("The minimum value of all pixels in the data window.") ), "stats:min", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ), GafferUI.StandardPathColumn( GafferUI.PathColumn.CellData( "Max", - toolTip = "The maximum value of all pixels in the data window." + toolTip = _("The maximum value of all pixels in the data window.") ), "stats:max", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ), GafferUI.StandardPathColumn( GafferUI.PathColumn.CellData( "Average", - toolTip = "The average value of all pixels in the data window." + toolTip = _("The average value of all pixels in the data window.") ), "stats:average", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ), @@ -143,7 +144,7 @@ def __init__( self, scriptNode, **kw ) : sortable = False, horizontalScrollMode = GafferUI.ScrollMode.Automatic, parenting = { - "label" : "Channels" + "label" : _("Channels") } ) @@ -151,14 +152,14 @@ def __init__( self, scriptNode, **kw ) : Gaffer.DictPath( {}, "/" ), columns = [ GafferUI.PathListingWidget.defaultNameColumn, - GafferUI.StandardPathColumn( "Value", "metadata:value", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ) + GafferUI.StandardPathColumn( _("Value"), "metadata:value", sizeMode = GafferUI.PathColumn.SizeMode.Stretch ) ], displayMode = GafferUI.PathListingWidget.DisplayMode.Tree, selectionMode = GafferUI.PathListingWidget.SelectionMode.Cell, horizontalScrollMode = GafferUI.ScrollMode.Automatic, sortable = False, parenting = { - "label" : "Metadata" + "label" : _("Metadata") } ) @@ -238,7 +239,7 @@ def __setPathListingPaths( self ) : "view" : { "plugValueWidget:type" : "GafferImageUI.ViewPlugValueWidget", - "description" : "The view to inspect", + "description" : _("The view to inspect"), }, diff --git a/python/GafferImageUI/ImageMetadataUI.py b/python/GafferImageUI/ImageMetadataUI.py index 71f299b1c59..f0f1533ee3f 100644 --- a/python/GafferImageUI/ImageMetadataUI.py +++ b/python/GafferImageUI/ImageMetadataUI.py @@ -37,34 +37,35 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ImageMetadata, "description", - """ + _(""" Adds arbitrary metadata entires to an image. If those entries already exist in the incoming image metadata, their values will be overwritten. - """, + """), plugs = { "metadata" : { "description" : - """ + _(""" The metadata to be applied - arbitrary numbers of user defined metadata may be added as children of this plug via the user interface, or using the CompoundDataPlug python API - """, + """), }, "extraMetadata" : { "description" : - """ + _(""" Additional metadata to be added, specified within a single `IECore.CompoundObject`. This is convenient when using an expression to define the metadata and when the number of items might be @@ -74,7 +75,7 @@ If the same option is defined by both the `metadata` and the `extraMetadata` plugs, then the value from the `extraMetadata` is taken. - """, + """), "layout:section" : "Extra", "nodule:type" : "", diff --git a/python/GafferImageUI/ImageNodeUI.py b/python/GafferImageUI/ImageNodeUI.py index be813abcfeb..3df9c042608 100644 --- a/python/GafferImageUI/ImageNodeUI.py +++ b/python/GafferImageUI/ImageNodeUI.py @@ -37,15 +37,16 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ImageNode, "description", - """ + _(""" Base class for nodes which generate images. - """, + """), plugs = { @@ -58,9 +59,9 @@ "out" : { "description" : - """ + _(""" The output image generated by this node. - """, + """), }, diff --git a/python/GafferImageUI/ImageProcessorUI.py b/python/GafferImageUI/ImageProcessorUI.py index 44a43d787e3..1771f304669 100644 --- a/python/GafferImageUI/ImageProcessorUI.py +++ b/python/GafferImageUI/ImageProcessorUI.py @@ -37,16 +37,17 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ImageProcessor, "description", - """ + _(""" Base class for nodes which process an input image to to generate an output image. - """, + """), plugs = { diff --git a/python/GafferImageUI/ImageReaderUI.py b/python/GafferImageUI/ImageReaderUI.py index 9aeb440c7bb..5ab229eb205 100644 --- a/python/GafferImageUI/ImageReaderUI.py +++ b/python/GafferImageUI/ImageReaderUI.py @@ -45,29 +45,30 @@ from . import OpenColorIOTransformUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ImageReader, "description", - """ + _(""" Reads image files from disk using OpenImageIO. All file types supported by OpenImageIO are supported by the ImageReader and all channel data will be converted to linear using OpenColorIO. - """, + """), plugs = { "fileName" : { "description" : - """ + _(""" The name of the file to be read. File sequences with arbitrary padding may be specified using the '#' character as a placeholder for the frame numbers. If this file sequence format is used, then missingFrameMode will be activated. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -81,11 +82,11 @@ "refreshCount" : { "description" : - """ + _(""" May be incremented to force a reload if the file has changed on disk - otherwise old contents may still be loaded via Gaffer's cache. - """, + """), "plugValueWidget:type" : "GafferUI.RefreshPlugValueWidget", "layout:label" : "", @@ -96,14 +97,14 @@ "missingFrameMode" : { "description" : - """ + _(""" Determines how missing frames are handled when the input fileName is a file sequence (uses the '#' character). The default behaviour is to throw an exception, but it can also hold the last valid frame in the sequence, or return a black image which matches the data window and display window of the previous valid frame in the sequence. - """, + """), "preset:Error" : GafferImage.ImageReader.MissingFrameMode.Error, "preset:Black" : GafferImage.ImageReader.MissingFrameMode.Black, @@ -116,13 +117,13 @@ "start" : { "description" : - """ + _(""" Masks frames which preceed the specified start frame. The default is to treat them based on the MissingFrameMode, but they can also be clamped to the start frame, or return a black image which matches the data window and display window of the start frame. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layoutPlugValueWidget:orientation" : "horizontal", @@ -134,9 +135,9 @@ "start.mode" : { "description" : - """ + _(""" The mode used detemine the mask behaviour for the start frame. - """, + """), "preset:None" : GafferImage.ImageReader.FrameMaskMode.None_, "preset:Black Outside" : GafferImage.ImageReader.FrameMaskMode.BlackOutside, @@ -150,9 +151,9 @@ "start.frame" : { "description" : - """ + _(""" The start frame of the masked range. - """, + """), "presetNames" : lambda plug : IECore.StringVectorData( [ str(x) for x in plug.node()["__oiioReader"]["availableFrames"].getValue() ] ), "presetValues" : lambda plug : plug.node()["__oiioReader"]["availableFrames"].getValue(), @@ -165,13 +166,13 @@ "end" : { "description" : - """ + _(""" Masks frames which follow the specified end frame. The default is to treat them based on the MissingFrameMode, but they can also be clamped to the end frame, or return a black image which matches the data window and display window of the end frame. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layoutPlugValueWidget:orientation" : "horizontal", @@ -183,9 +184,9 @@ "end.mode" : { "description" : - """ + _(""" The mode used detemine the mask behaviour for the end frame. - """, + """), "preset:None" : GafferImage.ImageReader.FrameMaskMode.None_, "preset:Black Outside" : GafferImage.ImageReader.FrameMaskMode.BlackOutside, @@ -199,9 +200,9 @@ "end.frame" : { "description" : - """ + _(""" The end frame of the masked range. - """, + """), "presetNames" : lambda plug : IECore.StringVectorData( [ str(x) for x in plug.node()["__oiioReader"]["availableFrames"].getValue() ] ), "presetValues" : lambda plug : plug.node()["__oiioReader"]["availableFrames"].getValue(), @@ -214,12 +215,12 @@ "colorSpace" : { "description" : - """ + _(""" The colour space of the input image, used to convert the input to the working space. When set to `Automatic`, the colour space is determined automatically using the function registered with `ImageReader::setDefaultColorSpaceFunction()`. - """, + """), "presetNames" : OpenColorIOTransformUI.colorSpacePresetNames, "presetValues" : OpenColorIOTransformUI.colorSpacePresetValues, @@ -234,7 +235,7 @@ "channelInterpretation" : { "description" : - """ + _(""" Controls how we create channels based on the contents of the file. Unfortunately, some software, such as Nuke, does not produce EXR files which follow the EXR specification, so the mode "Default" uses heuristics to guess what the channels mean. @@ -247,7 +248,7 @@ and just uses the channel names directly from the file. "Legacy" mode matches Gaffer <= 0.61 behaviour for compatibility reasons - it should not be used. - """, + """), "preset:Legacy" : GafferImage.ImageReader.ChannelInterpretation.Legacy, "preset:Default" : GafferImage.ImageReader.ChannelInterpretation.Default, @@ -260,10 +261,10 @@ "availableFrames" : { "description" : - """ + _(""" A list of the available frames for the current file sequence. Empty when the input `fileName` is not a file sequence. - """, + """), "layout:section" : "Frames", "plugValueWidget:type" : "GafferImageUI.ImageReaderUI._AvailableFramesPlugValueWidget", @@ -272,7 +273,7 @@ "fileValid" : { "description" : - """ + _(""" Whether or not the files exists and can be read into memory, value calculated per frame if an image sequence. Behaviour changes if a frame mask of ClampToFrame or Black is selected, if outside @@ -281,7 +282,7 @@ > Note : When the file is not valid, the image will also contain a `fileValid` > metadata value of `False`. This can be easier to access from downstream > nodes than the `fileValid` plug itself. - """, + """), "layout:section" : "Frames", @@ -328,7 +329,7 @@ def _updateFromValues( self, values, exception ) : if self.menuButton().getText() == "Automatic" : automaticSpace = sole( v["automaticSpace"] for v in values ) if automaticSpace != "" : - self.menuButton().setText( "Automatic ({})".format( automaticSpace or "---" ) ) + self.menuButton().setText( _("Automatic ({})").format( automaticSpace or "---" ) ) def _auxiliaryPlugs( self, plug ) : diff --git a/python/GafferImageUI/ImageSamplerUI.py b/python/GafferImageUI/ImageSamplerUI.py index 4337aae5a33..0c8fad215ff 100644 --- a/python/GafferImageUI/ImageSamplerUI.py +++ b/python/GafferImageUI/ImageSamplerUI.py @@ -36,33 +36,34 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ImageSampler, "description", - """ + _(""" Samples image colour at a specified pixel location. - """, + """), plugs = { "image" : { "description" : - """ + _(""" The image to be sampled. - """, + """), }, "view" : { "description" : - """ + _(""" The view to be sampled. - """, + """), "nodule:type" : "", "plugValueWidget:type" : "GafferImageUI.ViewPlugValueWidget", @@ -73,9 +74,9 @@ "channels" : { "description" : - """ + _(""" The names of the four channels to be sampled. - """, + """), "plugValueWidget:type" : "GafferImageUI.RGBAChannelsPlugValueWidget", @@ -84,7 +85,7 @@ "pixel" : { "description" : - """ + _(""" The coordinates of the pixel to sample. These can have fractional values and bilinear interpolation will be used to interpolate between adjacent pixels. @@ -92,17 +93,17 @@ Note though that the coordinates at pixel centres are not integers. For example, the centre of the bottom left pixel of an image is at 0.5, 0.5. - """, + """), }, "interpolate" : { "description" : - """ + _(""" Turn on to blend with adjacent pixels when sampling away from the center of the pixel at 0.5, 0.5. If off, you always sample exactly one pixel. - """, + """), "userDefault" : False, @@ -111,9 +112,9 @@ "color" : { "description" : - """ + _(""" The sampled colour. - """, + """), } diff --git a/python/GafferImageUI/ImageStatsUI.py b/python/GafferImageUI/ImageStatsUI.py index 5dd696e1a56..2b391fdcb96 100644 --- a/python/GafferImageUI/ImageStatsUI.py +++ b/python/GafferImageUI/ImageStatsUI.py @@ -38,17 +38,18 @@ import GafferUI import GafferImage import GafferImageUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ImageStats, "description", - """ + _(""" Calculates minimum, maximum and average colours for a region of an image. These outputs can then be used to drive other plugs within the node graph. - """, + """), "layout:activator:areaSourceIsArea", lambda node : node["areaSource"].getValue() == GafferImage.ImageStats.AreaSource.Area, @@ -57,18 +58,18 @@ "in" : { "description" : - """ + _(""" The input image to be analysed. - """, + """), }, "view" : { "description" : - """ + _(""" The view to be analysed. - """, + """), "nodule:type" : "", "plugValueWidget:type" : "GafferImageUI.ViewPlugValueWidget", @@ -79,9 +80,9 @@ "channels" : { "description" : - """ + _(""" The names of the four channels to be analysed. - """, + """), "nodule:type" : "", "plugValueWidget:type" : "GafferImageUI.RGBAChannelsPlugValueWidget", @@ -91,13 +92,13 @@ "areaSource" : { "description" : - """ + _(""" Where to source the area to be analysed. If this is set to DataWindow, it will use the input's Data Window, if it is set to DisplayWindow, it will use the input's Display Window, and if it is set to Area, it will use the Area plug. - """, + """), "preset:Area" : GafferImage.ImageStats.AreaSource.Area, "preset:DataWindow" : GafferImage.ImageStats.AreaSource.DataWindow, @@ -112,10 +113,10 @@ "area" : { "description" : - """ + _(""" The area of the image to be analysed. This plug is only used if 'Area Source' is set to Area. - """, + """), "layout:activator" : "areaSourceIsArea", "userDefault" : lambda plug : GafferImage.FormatPlug.getDefaultFormat( Gaffer.Context.current() ).getDisplayWindow() @@ -125,27 +126,27 @@ "average" : { "description" : - """ + _(""" The per-channel mean values computed from the input image region. - """, + """), }, "min" : { "description" : - """ + _(""" The per-channel minimum values computed from the input image region. - """, + """), }, "max" : { "description" : - """ + _(""" The per-channel maximum values computed from the input image region. - """, + """), }, diff --git a/python/GafferImageUI/ImageTransformUI.py b/python/GafferImageUI/ImageTransformUI.py index 8c7d1e3b2a0..965ae3d5e87 100644 --- a/python/GafferImageUI/ImageTransformUI.py +++ b/python/GafferImageUI/ImageTransformUI.py @@ -37,30 +37,31 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ImageTransform, "description", - """ + _(""" Scales, rotates and translates an image within its display window. Note that although the format is not changed, the data window is expanded to include the portions of the image which have been transformed outside of the display window, and these out-of-frame pixels can still be used by downstream nodes. - """, + """), plugs = { "transform" : { "description" : - """ + _(""" The transformation to be applied to the image. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -69,11 +70,11 @@ "filter" : { "description" : - """ + _(""" The pixel filter used when transforming the image. Each filter provides different tradeoffs between sharpness and the danger of aliasing or ringing. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -87,23 +88,23 @@ "invert" : { "description" : - """ + _(""" Apply the inverse transformation to the image. - """ + """) }, "concatenate" : { "description" : - """ + _(""" Combines the processing for a series of ImageTransforms so that transformation and filtering is only applied once. This gives better image quality and performance. > Note : When concatenation is in effect, the filter settings on upstream > ImageTransforms are ignored. - """, + """), "layout:section" : "Node", "layout:index" : -1, diff --git a/python/GafferImageUI/ImageViewUI.py b/python/GafferImageUI/ImageViewUI.py index 131ef91a495..87c1dd5ad18 100644 --- a/python/GafferImageUI/ImageViewUI.py +++ b/python/GafferImageUI/ImageViewUI.py @@ -43,6 +43,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage import GafferImageUI @@ -87,10 +88,10 @@ "view" : { "description" : - """ + _(""" Chooses view to display from a multi-view image. The "default" view is used for normal images that don't have specific views. - """, + """), "plugValueWidget:type" : "GafferImageUI.ImageViewUI._ImageView_ViewPlugValueWidget", "toolbarLayout:width" : 125, @@ -108,11 +109,11 @@ "compare.mode" : { "description" : - """ + _(""" Enables a comparison mode to view two images at once - they can be composited under or over, or subtracted for a difference view. Or replace mode just shows the front image, which is useful in combination with the Wipe tool. - """, + """), "plugValueWidget:type" : "GafferImageUI.ImageViewUI._CompareModePlugValueWidget", @@ -126,10 +127,10 @@ "compare.wipe" : { "description" : - """ + _(""" Enables a wipe tool to hide part of the image, for comparing with the background image. Hotkey W. - """, + """), "plugValueWidget:type" : "GafferImageUI.ImageViewUI._CompareWipePlugValueWidget", @@ -138,9 +139,9 @@ "compare.image" : { "description" : - """ + _(""" The image to compare with. - """, + """), "plugValueWidget:type" : "GafferImageUI.ImageViewUI._CompareImageWidget", @@ -160,9 +161,9 @@ "channels" : { "description" : - """ + _(""" Chooses an RGBA layer or an auxiliary channel to display. - """, + """), "plugValueWidget:type" : "GafferImageUI.ImageViewUI._ChannelsPlugValueWidget", "toolbarLayout:width" : 175, @@ -214,6 +215,7 @@ def _menuDefinition( self ) : "command" : functools.partial( Gaffer.WeakMethod( self.__setValue ), value = previousValue ), "shortCut" : "Ctrl+[" if self.__ctrlModifier else "[", "active" : previousValue is not None and previousValue != currentValue, + "label" : _("Previous"), } ) @@ -224,6 +226,7 @@ def _menuDefinition( self ) : "command" : functools.partial( Gaffer.WeakMethod( self.__setValue ), value = nextValue ), "shortCut" : "Ctrl+]" if self.__ctrlModifier else "]", "active" : nextValue is not None and nextValue != currentValue, + "label" : _("Next"), } ) @@ -318,6 +321,7 @@ def _menuDefinition( self ) : "command" : functools.partial( Gaffer.WeakMethod( self.__setValue ), value = previousValue ), "shortCut" : "PgUp", "active" : previousValue is not None and previousValue != currentValue, + "label" : _("Previous"), } ) @@ -328,6 +332,7 @@ def _menuDefinition( self ) : "command" : functools.partial( Gaffer.WeakMethod( self.__setValue ), value = nextValue ), "shortCut" : "PgDown", "active" : nextValue is not None and nextValue != currentValue, + "label" : _("Next"), } ) @@ -338,6 +343,7 @@ def _menuDefinition( self ) : "command" : functools.partial( Gaffer.WeakMethod( self.__setValue ), value = firstValue ), "shortCut" : "Ctrl+PgUp", "active" : firstValue is not None and firstValue != currentValue, + "label" : _("First"), } ) @@ -498,7 +504,7 @@ def __update( self ) : paused = self.__imageGadgets[0].getPaused() self.__button.setImage( "viewPause.png" if not paused else "viewPaused.png" ) self.__busyWidget.setBusy( self.__imageGadgets[0].state() == GafferImageUI.ImageGadget.State.Running ) - self.__button.setToolTip( "Viewer updates suspended, click to resume" if paused else "Click to suspend viewer updates [esc]" ) + self.__button.setToolTip( _("Viewer updates suspended, click to resume") if paused else _("Click to suspend viewer updates [esc]") ) @@ -594,7 +600,7 @@ def __init__( self, plug, **kw ) : image = "compareModeNone.png", menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), - title = "Compare Mode", + title = _("Compare Mode"), ) ) self.__button._qtWidget().setMaximumWidth( 25 ) @@ -672,7 +678,8 @@ def __menuDefinition( self ) : "/Match Display Windows", { "command" : functools.partial( Gaffer.WeakMethod( self.__toggleMatchDisplayWindows ), value ), - "checkBox" : self.getPlug().parent()["matchDisplayWindows"].getValue() + "checkBox" : self.getPlug().parent()["matchDisplayWindows"].getValue(), + "label" : _("Match Display Windows"), } ) @@ -866,45 +873,47 @@ def __showEditorFocusMenu( self, *unused ) : m = IECore.MenuDefinition() - m.append( "/Catalogue Divider", { "divider" : True, "label" : "Follow Catalogue Output" } ) + m.append( "/Catalogue Divider", { "divider" : True, "label" : _("Follow Catalogue Output") } ) for i in Gaffer.NodeAlgo.presets( self.__node["compare"]["catalogueOutput"] ): - m.append( "/CatalogueOutput{}".format( i ), { + m.append( "/" + _("CatalogueOutput{}").format( i ), { "command" : functools.partial( Gaffer.WeakMethod( self.__followCatalogueOutput ), i ), "checkBox" : self.__catalogueOutput == i, "label" : i, } ) - m.append( "/Pin Divider", { "divider" : True, "label" : "Pin" } ) + m.append( "/Pin Divider", { "divider" : True, "label" : _("Pin") } ) selection = self.__scriptNode.selection() if len(selection) == 0 : - label = "Pin To Nothing" + label = _("Pin To Nothing") elif len(selection) == 1 : - label = "Pin %s" % selection[0].getName() + label = _("Pin %s") % selection[0].getName() else : - label = "Pin %d Selected Nodes" % len(selection) + label = _("Pin %d Selected Nodes") % len(selection) - m.append( "/Pin Node Selection", { + m.append( "/" + _("Pin Node Selection"), { "command" : Gaffer.WeakMethod( self.__pinToNodeSelection ), "label" : label, "shortCut" : "p" } ) - m.append( "/Follow Divider", { "divider" : True, "label" : "Follow" } ) + m.append( "/Follow Divider", { "divider" : True, "label" : _("Follow") } ) - m.append( "/Focus Node", { + m.append( "/" + _("Focus Node"), { "command" : Gaffer.WeakMethod( self.__followFocusNode ), "checkBox" : self.__nodeSet.isSame( self.__scriptNode.focusSet() ), - "shortCut" : "`" + "shortCut" : "`", + "label" : _("Focus Node"), } ) - m.append( "/Node Selection", { + m.append( "/" + _("Node Selection"), { "command" : Gaffer.WeakMethod( self.__followNodeSelection ), "checkBox" : self.__nodeSet.isSame( selection ), - "shortCut" : "n" + "shortCut" : "n", + "label" : _("Node Selection"), } ) - m.append( "/NumericBookmarkDivider", { "divider" : True, "label" : "Follow Numeric Bookmark" } ) + m.append( "/NumericBookmarkDivider", { "divider" : True, "label" : _("Follow Numeric Bookmark") } ) for i in range( 1, 10 ) : bookmarkNode = Gaffer.MetadataAlgo.getNumericBookmark( self.__scriptNode, i ) @@ -912,13 +921,13 @@ def __showEditorFocusMenu( self, *unused ) : if bookmarkNode is not None : title += " : %s" % bookmarkNode.getName() isCurrent = isinstance( self.__nodeSet, Gaffer.NumericBookmarkSet ) and self.__nodeSet.getBookmark() == i - m.append( "/NumericBookMark{}".format( i ), { + m.append( "/" + _("NumericBookMark{}").format( i ), { "command" : functools.partial( Gaffer.WeakMethod( self.__followBookmark ), i ), "checkBox" : isCurrent, "label" : title, } ) - self.__pinningMenu = GafferUI.Menu( m, title = "Comparison Image" ) + self.__pinningMenu = GafferUI.Menu( m, title = _("Comparison Image") ) buttonBound = self.__icon.bound() self.__pinningMenu.popup( diff --git a/python/GafferImageUI/ImageWriterUI.py b/python/GafferImageUI/ImageWriterUI.py index feab8ba8211..6d6c17131fc 100644 --- a/python/GafferImageUI/ImageWriterUI.py +++ b/python/GafferImageUI/ImageWriterUI.py @@ -43,6 +43,7 @@ import GafferImageUI import GafferImage from . import OpenColorIOTransformUI +from GafferUI.i18n import _ layoutVariableDesc = """ Special context variables available for setting layout plugs: @@ -74,11 +75,11 @@ def __extension( parent ) : GafferImage.ImageWriter, "description", - """ + _(""" Writes image files to disk using OpenImageIO. All file types supported by OpenImageIO are supported by the ImageWriter. - """, + """), "layout:activator:dpx", lambda p : __extension( p ) in ( "dpx", "unknown" ), "layout:activator:field3d", lambda p : __extension( p ) in ( "f3d", "unknown" ), @@ -99,9 +100,9 @@ def __extension( parent ) : "in" : { "description" : - """ + _(""" The image to be written to disk. - """, + """), "nodule:type" : "GafferUI::StandardNodule", @@ -110,11 +111,11 @@ def __extension( parent ) : "fileName" : { "description" : - """ + _(""" The name of the file to be written. File sequences with arbitrary padding may be specified using the '#' character as a placeholder for the frame numbers. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -128,11 +129,11 @@ def __extension( parent ) : "channels" : { "description" : - """ + _(""" The names of the channels to be written to the file. Names should be separated by spaces and may contain any of Gaffer's standard wildcards. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelMaskPlugValueWidget", @@ -141,12 +142,12 @@ def __extension( parent ) : "colorSpace" : { "description" : - """ + _(""" The colour space of the output image, used to convert the input image from the working space. The default behaviour is to automatically determine the colorspace by calling the function registered with `ImageWriter::setDefaultColorSpaceFunction()`. - """, + """), "presetNames" : OpenColorIOTransformUI.colorSpacePresetNames, "presetValues" : OpenColorIOTransformUI.colorSpacePresetValues, @@ -161,7 +162,7 @@ def __extension( parent ) : "layout" : { "description" : - """ + _(""" Controls where channels are placed in the file, including how they are named. "Single part" writes all channels to the same part ( all interleaved ). "Part per layer" writes a separate part for each layer, so they may be loaded @@ -184,7 +185,7 @@ def __extension( parent ) : like a mixed layout that is partially EXR spec compliant, and partially Nuke. Or you could use a expression to group some layers together in the same part. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "presetsPlugValueWidget:allowCustom" : True, @@ -194,12 +195,12 @@ def __extension( parent ) : "layout.partName" : { "description" : - """ + _(""" Specifies the name to be stored in EXR's part name metadata. If different channels are given different part names, then a multipart file is produced. - """ + layoutVariableDesc, + """) + layoutVariableDesc, # The presets for this are useful in testing and scripting when the UI isn't loaded, # so we register them in src/GafferImage/ImageWriter.cpp @@ -208,11 +209,11 @@ def __extension( parent ) : "layout.channelName" : { "description" : - """ + _(""" Specifies the channel name to be given to EXR. To match the standard, this should just be exactly the Gaffer channel name. But some other software like Nuke omits the layer prefix, and assumes that the part name will be prefixed to the channel. - """ + layoutVariableDesc, + """) + layoutVariableDesc, # The presets for this are useful in testing and scripting when the UI isn't loaded, # so we register them in src/GafferImage/ImageWriter.cpp @@ -221,28 +222,28 @@ def __extension( parent ) : "matchDataWindows" : { "description" : - """ + _(""" For multi-view images, sets the data windows to be the same for all views, by expanding them all to include the union of all views. Wastes disk space and processing time, but is required by Nuke for multi-view images. - """ + """) }, "out" : { "description" : - """ + _(""" A pass-through of the input image. - """, + """), }, "dpx" : { "description" : - """ + _(""" Format options specific to DPX files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.DPX", @@ -253,9 +254,9 @@ def __extension( parent ) : "dpx.dataType" : { "description" : - """ + _(""" The data type to be written to the DPX file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:8-bit" : "uint8", @@ -268,9 +269,9 @@ def __extension( parent ) : "field3d" : { "description" : - """ + _(""" Format options specific to Field3D files. - """, + """), "nodule:type" : "", "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -282,9 +283,9 @@ def __extension( parent ) : "field3d.mode" : { "description" : - """ + _(""" The write mode for the Field3D file - scanline or tiled data. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Scanline" : GafferImage.ImageWriter.Mode.Scanline, @@ -295,9 +296,9 @@ def __extension( parent ) : "field3d.dataType" : { "description" : - """ + _(""" The data type to be written to the Field3D file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Half" : "half", @@ -309,9 +310,9 @@ def __extension( parent ) : "fits" : { "description" : - """ + _(""" Format options specific to FITS files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.FITS", @@ -322,9 +323,9 @@ def __extension( parent ) : "fits.dataType" : { "description" : - """ + _(""" The data type to be written to the FITS file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:8-bit" : "uint8", @@ -338,9 +339,9 @@ def __extension( parent ) : "iff" : { "description" : - """ + _(""" Format options specific to IFF files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.IFF", @@ -351,9 +352,9 @@ def __extension( parent ) : "iff.mode" : { "description" : - """ + _(""" The write mode for the IFF file - scanline or tiled data. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Scanline" : GafferImage.ImageWriter.Mode.Scanline, @@ -364,9 +365,9 @@ def __extension( parent ) : "jpeg" : { "description" : - """ + _(""" Format options specific to Jpeg files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.Jpeg", @@ -377,21 +378,21 @@ def __extension( parent ) : "jpeg.compressionQuality" : { "description" : - """ + _(""" The compression quality for the Jpeg file to be written. A value between 0 (low quality, high compression) and 100 (high quality, low compression). - """, + """), }, "jpeg.chromaSubSampling" : { "description" : - """ + _(""" The chroma sub sampling used to write the jpeg file. Note that the file will be stored as YCbCr instead of RGB. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Default (4:2:0)" : "", @@ -404,9 +405,9 @@ def __extension( parent ) : "jpeg2000" : { "description" : - """ + _(""" Format options specific to Jpeg2000 files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.Jpeg2000", @@ -417,9 +418,9 @@ def __extension( parent ) : "jpeg2000.dataType" : { "description" : - """ + _(""" The data type to be written to the Jpeg2000 file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:8-bit" : "uint8", @@ -430,9 +431,9 @@ def __extension( parent ) : "openexr" : { "description" : - """ + _(""" Format options specific to OpenEXR files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.OpenEXR", @@ -445,9 +446,9 @@ def __extension( parent ) : "openexr.mode" : { "description" : - """ + _(""" The write mode for the OpenEXR file - scanline or tiled data. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Scanline" : GafferImage.ImageWriter.Mode.Scanline, @@ -458,9 +459,9 @@ def __extension( parent ) : "openexr.compression" : { "description" : - """ + _(""" The compression method to use when writing the OpenEXR file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:None" : "none", @@ -479,10 +480,10 @@ def __extension( parent ) : "openexr.dwaCompressionLevel" : { "description" : - """ + _(""" The compression level used when writing files with DWAA or DWAB compression. Higher values decrease file size at the expense of image quality. - """, + """), "layout:activator" : "compressionIsDWA", @@ -491,13 +492,13 @@ def __extension( parent ) : "openexr.dataType" : { "description" : - """ + _(""" The data type to be written to the OpenEXR file. If you want to use different data types for different channels, you can drive this with an expression or spreadsheet, which may use the same context variables as the layout plugs ( the useful ones are `${imageWriter:channelName}`, `${imageWriter:layerName}` and `${imageWriter:baseName}`, for the whole channel name, and for the prefix and suffix respectively ). - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Float" : "float", @@ -510,12 +511,12 @@ def __extension( parent ) : "openexr.depthDataType" : { "description" : - """ + _(""" Overriding the data type for depth channels is useful because many of the things depth is used for require greater precision. This is a simple override which sets Z and ZBack to float precision. If you want to do something more complex, set this to `Use Default`, and connect an expression or spreadsheet to the `Data Type` plug. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Override to Float" : "float", @@ -526,9 +527,9 @@ def __extension( parent ) : "png" : { "description" : - """ + _(""" Format options specific to PNG files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.PNG", @@ -539,9 +540,9 @@ def __extension( parent ) : "png.compression" : { "description" : - """ + _(""" The compression method to use when writing the PNG file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Default" : "default", @@ -555,19 +556,19 @@ def __extension( parent ) : "png.compressionLevel" : { "description" : - """ + _(""" The compression level of the PNG file. This is a value between 0 (no compression) and 9 (most compression). - """, + """), }, "rla" : { "description" : - """ + _(""" Format options specific to RLA files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.RLA", @@ -578,9 +579,9 @@ def __extension( parent ) : "rla.dataType" : { "description" : - """ + _(""" The data type to be written to the RLA file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:8-bit" : "uint8", @@ -592,9 +593,9 @@ def __extension( parent ) : "sgi" : { "description" : - """ + _(""" Format options specific to SGI files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.SGI", @@ -605,9 +606,9 @@ def __extension( parent ) : "sgi.dataType" : { "description" : - """ + _(""" The data type to be written to the SGI file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:8-bit" : "uint8", @@ -618,9 +619,9 @@ def __extension( parent ) : "targa" : { "description" : - """ + _(""" Format options specific to Targa files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.Targa", @@ -631,9 +632,9 @@ def __extension( parent ) : "targa.compression" : { "description" : - """ + _(""" The compression method to use when writing the Targa file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:None" : "none", @@ -644,9 +645,9 @@ def __extension( parent ) : "tiff" : { "description" : - """ + _(""" Format options specific to TIFF files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.TIFF", @@ -657,9 +658,9 @@ def __extension( parent ) : "tiff.mode" : { "description" : - """ + _(""" The write mode for the TIFF file - scanline or tiled data. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Scanline" : GafferImage.ImageWriter.Mode.Scanline, @@ -670,9 +671,9 @@ def __extension( parent ) : "tiff.compression" : { "description" : - """ + _(""" The compression method to use when writing the TIFF file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:None" : "none", @@ -685,9 +686,9 @@ def __extension( parent ) : "tiff.dataType" : { "description" : - """ + _(""" The data type to be written to the TIFF file. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:8-bit" : "uint8", @@ -699,9 +700,9 @@ def __extension( parent ) : "webp" : { "description" : - """ + _(""" Format options specific to WebP files. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.WebP", @@ -712,11 +713,11 @@ def __extension( parent ) : "webp.compressionQuality" : { "description" : - """ + _(""" The compression quality for the WebP file to be written. A value between 0 (low quality, high compression) and 100 (high quality, low compression). - """, + """), }, diff --git a/python/GafferImageUI/LUTUI.py b/python/GafferImageUI/LUTUI.py index a027e89f424..4dd6320578b 100644 --- a/python/GafferImageUI/LUTUI.py +++ b/python/GafferImageUI/LUTUI.py @@ -39,26 +39,27 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.LUT, "description", - """ + _(""" Applies color transformations provided by OpenColorIO via a LUT file and OCIO FileTransform. - """, + """), plugs = { "fileName" : { "description" : - """ + _(""" The name of the LUT file to be read. Only OpenColorIO supported files will function as expected. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -71,9 +72,9 @@ "interpolation" : { "description" : - """ + _(""" The interpolation mode for the color transformation. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Best" : GafferImage.LUT.Interpolation.Best, @@ -85,9 +86,9 @@ "direction" : { "description" : - """ + _(""" The direction to perform the color transformation. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Forward" : GafferImage.OpenColorIOTransform.Direction.Forward, diff --git a/python/GafferImageUI/LookTransformUI.py b/python/GafferImageUI/LookTransformUI.py index 4b2239184b1..cb3250639ce 100644 --- a/python/GafferImageUI/LookTransformUI.py +++ b/python/GafferImageUI/LookTransformUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.LookTransform, "description", - """ + _(""" Applies OpenColorIO "looks" to an image. A 'look' is a named color transform, intended to modify the look of an @@ -59,14 +60,14 @@ See the look plug for further syntax details. See opencolorio.org for look configuration customization examples. - """, + """), plugs = { "look" : { "description" : - """ + _(""" Look Syntax: Multiple looks are combined with commas: 'neutral, primary' @@ -74,7 +75,7 @@ Direction is specified with +/- prefixes: '+neutral, -primary' Missing look 'fallbacks' specified with |: 'neutral, -primary | -primary' - """, + """), "layout:index" : 0, @@ -82,7 +83,7 @@ "direction" : { - "description" : "Specify the look transform direction", + "description" : _("Specify the look transform direction"), "preset:Forward" : GafferImage.OpenColorIOTransform.Direction.Forward, "preset:Inverse" : GafferImage.OpenColorIOTransform.Direction.Inverse, diff --git a/python/GafferImageUI/MedianUI.py b/python/GafferImageUI/MedianUI.py index 61e529d6222..b1da3d3ebb4 100644 --- a/python/GafferImageUI/MedianUI.py +++ b/python/GafferImageUI/MedianUI.py @@ -35,6 +35,7 @@ ########################################################################## import Gaffer import GafferImage +from GafferUI.i18n import _ # Command suitable for use with `NodeMenu.append()`. def nodeMenuCreateCommand( menu ) : @@ -49,9 +50,9 @@ def nodeMenuCreateCommand( menu ) : GafferImage.Median, "description", - """ + _(""" Applies a median filter to the image. This can be useful for removing noise. - """, + """), ) diff --git a/python/GafferImageUI/MergeUI.py b/python/GafferImageUI/MergeUI.py index 2b2f0af9702..2d6724eb16a 100644 --- a/python/GafferImageUI/MergeUI.py +++ b/python/GafferImageUI/MergeUI.py @@ -37,6 +37,7 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ def __inputLabel( plug ) : @@ -57,7 +58,7 @@ def __inputDescription( plug ) : GafferImage.Merge, "description", - """ + _(""" Composites two or more images together. The following operations are available : @@ -75,7 +76,7 @@ def __inputDescription( plug ) : - Under : A(1-b) + B - Min : min( A, B ) - Max : max( A, B ) - """, + """), plugs = { @@ -89,19 +90,19 @@ def __inputDescription( plug ) : "operation" : { "description" : - """ + _(""" The compositing operation used to merge the image together. See node documentation for more details. - """, + """), "preset:Add" : GafferImage.Merge.Operation.Add, "preset:Atop" : GafferImage.Merge.Operation.Atop, "preset:Divide" : GafferImage.Merge.Operation.Divide, - "preset:In" : GafferImage.Merge.Operation.In, - "preset:Out" : GafferImage.Merge.Operation.Out, + "preset:Interior" : GafferImage.Merge.Operation.In, + "preset:Exterior" : GafferImage.Merge.Operation.Out, "preset:Mask" : GafferImage.Merge.Operation.Mask, - "preset:Matte" : GafferImage.Merge.Operation.Matte, + "preset:Stencil" : GafferImage.Merge.Operation.Matte, "preset:Multiply" : GafferImage.Merge.Operation.Multiply, "preset:Over" : GafferImage.Merge.Operation.Over, "preset:Subtract" : GafferImage.Merge.Operation.Subtract, diff --git a/python/GafferImageUI/MirrorUI.py b/python/GafferImageUI/MirrorUI.py index 57fd738fe68..9fda96328c6 100644 --- a/python/GafferImageUI/MirrorUI.py +++ b/python/GafferImageUI/MirrorUI.py @@ -36,35 +36,36 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Mirror, "description", - """ + _(""" Mirrors the image, flipping it in the horizontal and/or vertical directions. Unlike the ImageTransform node, this performs no filtering, so pixel values are not changed. - """, + """), plugs = { "horizontal" : { "description" : - """ + _(""" Mirrors horizontally, flopping the image left to right. - """, + """), }, "vertical" : { "description" : - """ + _(""" Mirrors vertically, flipping the image top to bottom. - """, + """), }, diff --git a/python/GafferImageUI/MixUI.py b/python/GafferImageUI/MixUI.py index a8d204ab188..c4bd356801b 100644 --- a/python/GafferImageUI/MixUI.py +++ b/python/GafferImageUI/MixUI.py @@ -37,63 +37,64 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Mix, "description", - """ + _(""" Blends two images together based on a mask. If the mask is 0 you get the first input, if it is 1 you get the second. - """, + """), plugs = { "in.in0" : { "description" : - """ + _(""" The B input. - """, + """), }, "in.in1" : { "description" : - """ + _(""" The A input. - """, + """), }, "mask" : { "description" : - """ + _(""" The image which contains the mask channel. - """, + """), "noduleLayout:section" : "right", }, "mix" : { "description" : - """ + _(""" Control the blend between the two input images. 0 to take first input, 1 to take second input. Multiplied together with the mask. - """, + """), }, "maskChannel" : { "description" : - """ + _(""" The channel which controls the blend. Clamped between 0 and 1. 0 to take first input, 1 to take second input. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", "channelPlugValueWidget:imagePlugName" : "mask", diff --git a/python/GafferImageUI/OffsetUI.py b/python/GafferImageUI/OffsetUI.py index 47329515c26..c0e3a1c7911 100644 --- a/python/GafferImageUI/OffsetUI.py +++ b/python/GafferImageUI/OffsetUI.py @@ -37,27 +37,28 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Offset, "description", - """ + _(""" Offsets (translates) the image in integer increments. Because the increments may only be whole numbers, no filtering is necessary, and this node has improved performance compared to the equivalent ImageTransform. - """, + """), plugs = { "offset" : { "description" : - """ + _(""" The amount to offset the image by. - """, + """), }, diff --git a/python/GafferImageUI/OpenColorIOConfigPlugUI.py b/python/GafferImageUI/OpenColorIOConfigPlugUI.py index c7466e29495..bf11bfddef9 100644 --- a/python/GafferImageUI/OpenColorIOConfigPlugUI.py +++ b/python/GafferImageUI/OpenColorIOConfigPlugUI.py @@ -48,6 +48,7 @@ import GafferImageUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ # General OpenColorIOConfigPlug UI metadata @@ -100,29 +101,29 @@ "openColorIO.config" : { "description" : - """ + _(""" The OpenColorIO config to use. > Note : An OpenColorIOContext node can be used to override the config within specific parts of the node graph, or to perform wedging across several contexts. - """, + """), }, "openColorIO.workingSpace" : { "description" : - """ + _(""" The color space in which Gaffer performs image processing. ImageReaders will automatically load images into this space, and ImageWriters will automatically convert images from this space. - """, + """), }, "openColorIO.variables" : { "description" : - """ + _(""" Variables used to customise the default [OpenColorIO context](https://opencolorio.readthedocs.io/en/latest/guides/authoring/overview.html#environment). OpenColorIO refers to these variously as "string vars", "context vars" or @@ -130,20 +131,20 @@ > Note : An OpenColorIOContext node can be used to define variables within specific parts of the node graph, or to perform wedging across several variable values. - """, + """), }, "openColorIO.displayTransform" : { - "label" : "UI Display Transform", + "label" : _("UI Display Transform"), "description" : - """ + _(""" The colour transform used for showing colours in the UI - in swatches and colour pickers etc. This is a combination of an OpenColorIO Display and an OpenColorIO View. > Note : The Viewer has its own display transform configured in the Viewer itself. - """, + """), }, @@ -227,12 +228,12 @@ def __menuDefinition( self ) : try : config = GafferImage.OpenColorIOAlgo.currentConfig() except : - result.append( "/Invalid Config", { "active" : False } ) + result.append( "/" + _("Invalid Config"), { "active" : False } ) return result # View section - result.append( "/__ViewDivider__", { "divider" : True, "label" : "View" } ) + result.append( "/__ViewDivider__", { "divider" : True, "label" : _("View") } ) display = self.__currentDisplay if self.__currentDisplay in config.getDisplays() else config.getDefaultDisplay() for view in config.getViews( display ) : @@ -247,7 +248,7 @@ def __menuDefinition( self ) : # Display section - result.append( "/__DisplayDivider__", { "divider" : True, "label" : "Display" } ) + result.append( "/__DisplayDivider__", { "divider" : True, "label" : _("Display") } ) for display in config.getDisplays() : view = self.__currentView if self.__currentView in config.getViews( display ) else config.getDefaultView( display ) @@ -260,13 +261,13 @@ def __menuDefinition( self ) : # Default section - result.append( "/__OptionsDivider__", { "divider" : True, "label" : "Options" } ) + result.append( "/__OptionsDivider__", { "divider" : True, "label" : _("Options") } ) result.append( f"/Follow Default Display And View", { "command" : functools.partial( Gaffer.WeakMethod( self.__setToDefault ) ), "checkBox" : self.__currentValue == "__default__", - "description" : "Always uses the default display and view for the current config. Useful when changing configs often, or using context-sensitive configs." + "description" : _("Always uses the default display and view for the current config. Useful when changing configs often, or using context-sensitive configs.") } ) diff --git a/python/GafferImageUI/OpenColorIOContextUI.py b/python/GafferImageUI/OpenColorIOContextUI.py index 0b2f95da6c2..d6189d4dd1a 100644 --- a/python/GafferImageUI/OpenColorIOContextUI.py +++ b/python/GafferImageUI/OpenColorIOContextUI.py @@ -40,6 +40,7 @@ import GafferUI import GafferImage import GafferImageUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -50,11 +51,11 @@ GafferImage.OpenColorIOContext, "description", - """ + _(""" Creates Gaffer context variables which define the OpenColorIO config to be used by upstream nodes. This allows different configs to be used in different contexts. - """, + """), "layout:section:Settings.Variables:collapsed", False, @@ -75,9 +76,9 @@ "config" : { "description" : - """ + _(""" The OpenColorIO config to use. - """, + """), "nodule:type" : "", @@ -86,19 +87,19 @@ "config.enabled" : { "description" : - """ + _(""" Enables the `config.value` plug, allowing the OpenColorIO config to be specified. - """, + """), }, "config.value" : { "description" : - """ + _(""" Specifies the OpenColorIO config to be used. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "presetsPlugValueWidget:allowCustom" : True, @@ -118,9 +119,9 @@ "workingSpace" : { "description" : - """ + _(""" Specifies the color space in which Gaffer processes images. - """, + """), "nodule:type" : "", @@ -129,19 +130,19 @@ "workingSpace.enabled" : { "description" : - """ + _(""" Enables the `workingSpace.value` plug, allowing the working space to be specified. - """, + """), }, "workingSpace.value" : { "description" : - """ + _(""" Specifies the working color space to be used. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "presetNames" : GafferImageUI.OpenColorIOTransformUI.colorSpacePresetNames, @@ -154,12 +155,12 @@ "variables" : { "description" : - """ + _(""" Context variables used to customise the [OpenColorIO context](https://opencolorio.readthedocs.io/en/latest/guides/authoring/overview.html#environment) used by upstream nodes. OpenColorIO refers to these variously as "string vars", "context vars" or "environment vars". - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.Variables", @@ -181,25 +182,25 @@ "variables.*.name" : { "description" : - """ + _(""" The name of the variable to be created. - """, + """), }, "variables.*.value" : { "description" : - """ + _(""" The value to be given to the variable. - """, + """), }, "extraVariables" : { "description" : - """ + _(""" An additional set of variables to be created. These are defined as key/value pairs in an `IECore::CompoundData` object, which allows a single expression to define a dynamic number of variables. @@ -207,7 +208,7 @@ If the same variable is defined by both the `variables` and the `extraVariables` plugs, then the value from the `variables` plug is taken. - """, + """), "layout:section" : "Extra", "nodule:type" : "", diff --git a/python/GafferImageUI/OpenColorIOTransformUI.py b/python/GafferImageUI/OpenColorIOTransformUI.py index cc139e1e525..5d2291d003d 100644 --- a/python/GafferImageUI/OpenColorIOTransformUI.py +++ b/python/GafferImageUI/OpenColorIOTransformUI.py @@ -43,6 +43,7 @@ import GafferImage import PyOpenColorIO +from GafferUI.i18n import _ def __colorSpaceMenuHelper( plug, config = None ) : @@ -96,20 +97,20 @@ def colorSpacePresetValues( plug, config = None ) : GafferImage.OpenColorIOTransform, "description", - """ + _(""" Applies color transformations provided by OpenColorIO. - """, + """), plugs = { "context" : { "description" : - """ + _(""" > Warning : Deprecated - please use the `OpenColorIOContext` > node instead. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:customWidget:addButton:widgetType" : "GafferUI.PlugCreationWidget", diff --git a/python/GafferImageUI/OpenImageIOReaderUI.py b/python/GafferImageUI/OpenImageIOReaderUI.py index 40282a9d132..1f2f6279909 100644 --- a/python/GafferImageUI/OpenImageIOReaderUI.py +++ b/python/GafferImageUI/OpenImageIOReaderUI.py @@ -39,29 +39,30 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.OpenImageIOReader, "description", - """ + _(""" Utility node which reads image files from disk using OpenImageIO. All file types supported by OpenImageIO are supported by the OpenImageIOReader. - """, + """), plugs = { "fileName" : { "description" : - """ + _(""" The name of the file to be read. File sequences with arbitrary padding may be specified using the '#' character as a placeholder for the frame numbers. If this file sequence format is used, then missingFrameMode will be activated. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -75,11 +76,11 @@ "refreshCount" : { "description" : - """ + _(""" May be incremented to force a reload if the file has changed on disk - otherwise old contents may still be loaded via Gaffer's cache. - """, + """), "plugValueWidget:type" : "GafferUI.RefreshPlugValueWidget", "layout:label" : "", @@ -90,14 +91,14 @@ "missingFrameMode" : { "description" : - """ + _(""" Determines how missing frames are handled when the input fileName is a file sequence (uses the '#' character). The default behaviour is to throw an exception, but it can also hold the last valid frame in the sequence, or return a black image which matches the data window and display window of the previous valid frame in the sequence. - """, + """), "preset:Error" : GafferImage.OpenImageIOReader.MissingFrameMode.Error, "preset:Black" : GafferImage.OpenImageIOReader.MissingFrameMode.Black, @@ -110,11 +111,11 @@ "availableFrames" : { "description" : - """ + _(""" An output of the available frames for the given file sequence. Returns an empty vector when the input fileName is not a file sequence, even if it has a file-sequence-like structure. - """, + """), ## \todo: consider making this visible using a TextWidget with ## FrameList syntax (e.g. "1-100x5") @@ -124,17 +125,17 @@ "channelInterpretation" : { "description" : - "Documented in ImageReader, where it is exposed to users." + _("Documented in ImageReader, where it is exposed to users.") }, "fileValid" : { "description" : - """ + _(""" Whether or not the files exists and can be read into memory, value calculated per frame if an image sequence. MissingFrameMode does not change the behaviour of this plug. - """, + """), "plugValueWidget:type" : "", diff --git a/python/GafferImageUI/PremultiplyUI.py b/python/GafferImageUI/PremultiplyUI.py index 942f3c93535..ce526e1b173 100644 --- a/python/GafferImageUI/PremultiplyUI.py +++ b/python/GafferImageUI/PremultiplyUI.py @@ -37,29 +37,30 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Premultiply, "description", - """ + _(""" Multiplies selected channels by a specified alpha channel. - """, + """), plugs = { "alphaChannel" : { "description" : - """ + _(""" The channel to use as the alpha channel. The selected channel does not have to be 'A', but whichever channel is chosen will act as the alpha for the sake of this node. This channel will never be multiplied by itself - it will remain the same as the input. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", @@ -68,24 +69,24 @@ "ignoreMissingAlpha" : { "description" : - """ + _(""" If set, this node will do nothing if the specified `alphaChannel` is not found, instead of throwing an error. - """, + """), }, "useDeepVisibility" : { "description" : - """ + _(""" When processing a deep image, you may use this to multiply by the visibility of the current sample, taking into account the alpha of all previous samples. This is a pretty special case, it's mostly useful for converting deep images to incandescence, by multiplying RGB by visibility, and then wiping out the 'A' channel. - """, + """), "layout:section" : "Advanced", }, diff --git a/python/GafferImageUI/RGBAChannelsPlugValueWidget.py b/python/GafferImageUI/RGBAChannelsPlugValueWidget.py index ec32b3d6a37..2a3a65e9ff7 100644 --- a/python/GafferImageUI/RGBAChannelsPlugValueWidget.py +++ b/python/GafferImageUI/RGBAChannelsPlugValueWidget.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage from GafferUI.PlugValueWidget import sole @@ -161,7 +162,7 @@ def _menuDefinition( self ) : result = IECore.MenuDefinition() if not rgbaChannels : - result.append( "/No channels available", { "active" : False } ) + result.append( "/" + _("No channels available"), { "active" : False, "label" : _("No channels available") } ) return result for text, value in rgbaChannels.items() : diff --git a/python/GafferImageUI/RampUI.py b/python/GafferImageUI/RampUI.py index 259753f6527..c7599878ae9 100644 --- a/python/GafferImageUI/RampUI.py +++ b/python/GafferImageUI/RampUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ ## A function suitable as the postCreator in a NodeMenu.append() call. It # sets the ramp position for the node to cover the entire format. @@ -57,66 +58,66 @@ def postCreate( node, menu ) : GafferImage.Ramp, "description", - """ + _(""" Outputs an image of a color gradient interpolated using the ramp plug. - """, + """), plugs = { "format" : { "description" : - """ + _(""" The resolution and aspect ratio of the image. - """, + """), }, "ramp" : { "description" : - """ + _(""" The gradient of colour used to draw the ramp. - """, + """), }, "startPosition" : { "description" : - """ + _(""" 2d position for the start of the ramp color interpolation. - """, + """), }, "endPosition" : { "description" : - """ + _(""" 2d position for the end of the ramp color interpolation. - """, + """), }, "layer" : { "description" : - """ + _(""" The layer to generate. The output channels will be named ( layer.R, layer.G, layer.B and layer.A ). - """, + """), "stringPlugValueWidget:placeholderText" : "[RGBA]", }, "transform" : { "description" : - """ + _(""" A transformation applied to the entire ramp. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Transform", diff --git a/python/GafferImageUI/RankFilterUI.py b/python/GafferImageUI/RankFilterUI.py index cb2a8eba62c..10347b6db8b 100644 --- a/python/GafferImageUI/RankFilterUI.py +++ b/python/GafferImageUI/RankFilterUI.py @@ -37,6 +37,7 @@ import IECore import Gaffer import GafferImage +from GafferUI.i18n import _ # Command suitable for use with `NodeMenu.append()`. def nodeMenuCreateCommand( menu ) : @@ -51,29 +52,29 @@ def nodeMenuCreateCommand( menu ) : GafferImage.RankFilter, "description", - """ + _(""" Applies a rank filter to the image. - """, + """), plugs = { "radius" : { "description" : - """ + _(""" The size of the filter in pixels. This can be varied independently in the x and y directions. - """, + """), }, "boundingMode" : { "description" : - """ + _(""" The method used when the filter references pixels outside the input data window. - """, + """), "preset:Black" : GafferImage.Sampler.BoundingMode.Black, "preset:Clamp" : GafferImage.Sampler.BoundingMode.Clamp, @@ -85,22 +86,22 @@ def nodeMenuCreateCommand( menu ) : "expandDataWindow" : { "description" : - """ + _(""" Expands the data window to include the external pixels which the filter radius covers. - """ + """) }, "masterChannel" : { "description" : - """ + _(""" If specified, this channel will be used to compute the pixel index to select for all channels. You would probably want to use this with a channel that represents the overall luminance of the image. It will produce a rank filter which is lower quality, but preserves additivity between channels, and is a bit faster. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", "channelPlugValueWidget:extraChannels" : IECore.StringVectorData( [ "" ] ), "channelPlugValueWidget:extraChannelLabels" : IECore.StringVectorData( [ "None" ] ), diff --git a/python/GafferImageUI/RectangleUI.py b/python/GafferImageUI/RectangleUI.py index c613c290599..caf6c94674d 100644 --- a/python/GafferImageUI/RectangleUI.py +++ b/python/GafferImageUI/RectangleUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ ## A function suitable as the postCreator in a NodeMenu.append() call. It # sets the rectangle area relative to the input format. @@ -62,67 +63,67 @@ def postCreate( node, menu ) : GafferImage.Rectangle, "description", - """ + _(""" Renders a rectangle with adjustable line width, corner radius, drop shadow and transform. - """, + """), plugs = { "color" : { "description" : - """ + _(""" The colour of the rectangle. - """, + """), }, "area" : { "description" : - """ + _(""" The area of the rectangle before the transform is applied. - """, + """), }, "lineWidth" : { "description" : - """ + _(""" The width of the outline, measured in pixels. - """, + """), }, "cornerRadius" : { "description" : - """ + _(""" Used to give the rectangle rounded corners. A radius of 0 gives square corners. - """, + """), }, "transform" : { "description" : - """ + _(""" Transformation applied to the rectangle. - """, + """), }, "transform" : { "description" : - """ + _(""" A transformation applied to the rectangle. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Transform", diff --git a/python/GafferImageUI/ResampleUI.py b/python/GafferImageUI/ResampleUI.py index 0da23c591a0..820a586b740 100644 --- a/python/GafferImageUI/ResampleUI.py +++ b/python/GafferImageUI/ResampleUI.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI import GafferImage +from GafferUI.i18n import _ _filterDeepWarning = """ > Caution : @@ -55,10 +56,10 @@ GafferImage.Resample, "description", - """ + _(""" Utility node used internally within GafferImage, but not intended to be used directly by end users. - """, + """), "layout:customWidget:filterDeepWarning:widgetType", "GafferImageUI.ResampleUI._FilterDeepWarningWidget", "layout:customWidget:filterDeepWarning:section", "Settings", @@ -70,22 +71,22 @@ "matrix" : { "description" : - """ + _(""" The transform to be applied to the input image. This must contain only translation and scaling. - """, + """), }, "filter" : { "description" : - """ + _(""" The filter used to perform the resampling. The name of any OIIO filter may be specified. The default automatically picks an appropriate high-quality filter based on whether or not the image is being enlarged or reduced. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -97,22 +98,22 @@ "filterScale" : { "description" : - """ + _(""" A multiplier for the scale of the filter used. Scaling up gives a softer result, scaling down gives a sharper result ( likely to alias or even create black patches where no pixels can be found ). Less than 1 is not recommended unless you have a special technical reason. - """, + """), }, "boundingMode" : { "description" : - """ + _(""" The method used when a filter references pixels outside the input data window. - """, + """), "preset:Black" : GafferImage.Sampler.BoundingMode.Black, "preset:Clamp" : GafferImage.Sampler.BoundingMode.Clamp, @@ -124,10 +125,10 @@ "expandDataWindow" : { "description" : - """ + _(""" Expands the data window by the filter radius, to include the external pixels affected by the filter. - """, + """), }, @@ -135,7 +136,7 @@ "description" : - """ + _(""" Enables debug output. The HorizontalPass setting outputs an intermediate image filtered just in the horizontal direction - this is an internal optimisation used when @@ -143,7 +144,7 @@ forces all filtering to be done in a single pass (as if the filter was non-separable) and can be used for validating the results of the the two-pass (default) approach. - """, + """), "preset:Off" : GafferImage.Resample.Debug.Off, "preset:HorizontalPass" : GafferImage.Resample.Debug.HorizontalPass, @@ -186,6 +187,6 @@ def __init__( self, node, **kw ) : with self : GafferUI.Image( "warningSmall.png" ) - GafferUI.Label( "Caution : filtering deep images is expensive" ) + GafferUI.Label( _("Caution : filtering deep images is expensive") ) self.setToolTip( _filterDeepWarning ) diff --git a/python/GafferImageUI/ResizeUI.py b/python/GafferImageUI/ResizeUI.py index 3232399e1b6..d5030098a7f 100644 --- a/python/GafferImageUI/ResizeUI.py +++ b/python/GafferImageUI/ResizeUI.py @@ -40,16 +40,17 @@ import GafferUI import GafferImage import GafferImageUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Resize, "description", - """ + _(""" Resizes the image to a new resolution, scaling the contents to fit the new size. - """, + """), "layout:customWidget:filterDeepWarning:widgetType", "GafferImageUI.ResampleUI._FilterDeepWarningWidget", "layout:customWidget:filterDeepWarning:section", "Settings", @@ -61,17 +62,17 @@ "format" : { "description" : - """ + _(""" The new format (resolution and pixel aspect ratio) of the output image. - """, + """), }, "fitMode" : { "description" : - """ + _(""" Determines how the image is scaled to fit the new resolution. If the aspect ratios of the input and the output images are the same, then this has no @@ -105,7 +106,7 @@ : Distorts the image so that the input display window is fitted exactly to the output display window. - """, + """), "preset:Horizontal" : GafferImage.Resize.FitMode.Horizontal, "preset:Vertical" : GafferImage.Resize.FitMode.Vertical, @@ -120,11 +121,11 @@ "filter" : { "description" : - """ + _(""" The filter used when transforming the image. Each filter provides different tradeoffs between sharpness and the danger of aliasing or ringing. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", diff --git a/python/GafferImageUI/SaturationUI.py b/python/GafferImageUI/SaturationUI.py index 4132b06e6b3..aa5c2017e51 100644 --- a/python/GafferImageUI/SaturationUI.py +++ b/python/GafferImageUI/SaturationUI.py @@ -36,26 +36,27 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Saturation, "description", - """ + _(""" Increases or decreases the saturation of an image. Saturation is calculated relative to a standard luminance measure using the RGB coefficients `0.2126, 0.7152, 0.0722`. - """, + """), plugs = { "saturation" : { "description" : - """ + _(""" Values less than 1 bring colors closer to monochrome, values greater than 1 push colors away from monochrome. - """, + """), }, diff --git a/python/GafferImageUI/SelectViewUI.py b/python/GafferImageUI/SelectViewUI.py index 988e74287dc..29035976771 100644 --- a/python/GafferImageUI/SelectViewUI.py +++ b/python/GafferImageUI/SelectViewUI.py @@ -38,23 +38,24 @@ import GafferImage import GafferUI import imath +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.SelectView, "description", - """ + _(""" Picks one view from a multi-view image. Outputs it as an image with a single, default view. - """, + """), plugs = { "view" : { "description" : - """ + _(""" Name of view to select - """, + """), "plugValueWidget:type" : "GafferImageUI.ViewPlugValueWidget", diff --git a/python/GafferImageUI/ShapeUI.py b/python/GafferImageUI/ShapeUI.py index ae4710b06e8..6dd15cfc85a 100644 --- a/python/GafferImageUI/ShapeUI.py +++ b/python/GafferImageUI/ShapeUI.py @@ -36,25 +36,26 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Shape, "description", - """ + _(""" Base class for nodes which draw a shape over the input image. - """, + """), plugs = { "shadow" : { "description" : - """ + _(""" Enables the rendering of a drop shadow which can be coloured, offset and blurred. - """, + """), "layout:section" : "Shadow", @@ -63,9 +64,9 @@ "shadowColor" : { "description" : - """ + _(""" The colour of the shadow. - """, + """), "layout:section" : "Shadow", @@ -74,9 +75,9 @@ "shadowOffset" : { "description" : - """ + _(""" The offset of the shadow, measured in pixels. - """, + """), "layout:section" : "Shadow", @@ -85,9 +86,9 @@ "shadowBlur" : { "description" : - """ + _(""" A blur applied to the shadow, measured in pixels. - """, + """), "layout:section" : "Shadow", diff --git a/python/GafferImageUI/ShuffleImageMetadataUI.py b/python/GafferImageUI/ShuffleImageMetadataUI.py index 7cb09e2154b..f1ea291d282 100644 --- a/python/GafferImageUI/ShuffleImageMetadataUI.py +++ b/python/GafferImageUI/ShuffleImageMetadataUI.py @@ -36,26 +36,27 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.ShuffleImageMetadata, "description", - """ + _(""" Shuffles image metadata, allowing entries to be copied and/or renamed. - """, + """), plugs = { "shuffles" : { "description" : - """ + _(""" The definition of the shuffling to be performed - an arbitrary number of metadata edits can be made by adding ShufflePlugs as children of this plug. - """, + """), }, diff --git a/python/GafferImageUI/ShuffleUI.py b/python/GafferImageUI/ShuffleUI.py index 3cd7d397c31..689e7e716e3 100644 --- a/python/GafferImageUI/ShuffleUI.py +++ b/python/GafferImageUI/ShuffleUI.py @@ -42,6 +42,7 @@ import GafferUI import GafferImage +from GafferUI.i18n import _ ## \todo Add buttons for removing existing ChannelPlugs, and for adding # extras. This is probably best done as part of a concerted effort to @@ -54,17 +55,17 @@ GafferImage.Shuffle, "description", - """ + _(""" Shuffles data between image channels, for instance by copying R into G or a constant white into A. - """, + """), plugs = { "missingSourceMode" : { "description" : - """ + _(""" Determines behaviour when the source channel doesn't exist : - Ignore : No change is made to the destination channel. @@ -72,7 +73,7 @@ - Black : Black is shuffled into the destination channel. > Note : Does not apply when source contains wildcards. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Ignore" : GafferImage.Shuffle.MissingSourceMode.Ignore, @@ -86,11 +87,11 @@ "shuffles" : { "description" : - """ + _(""" The definition of the shuffling to be performed - an arbitrary number of channel edits can be made by adding ShufflePlugs as children of this plug. - """, + """), }, diff --git a/python/GafferImageUI/TextUI.py b/python/GafferImageUI/TextUI.py index 21c48cd4588..9083a6ff59a 100644 --- a/python/GafferImageUI/TextUI.py +++ b/python/GafferImageUI/TextUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ ## A function suitable as the postCreator in a NodeMenu.append() call. It # sets the region of interest for the node to cover the entire format. @@ -55,27 +56,27 @@ def postCreate( node, menu ) : GafferImage.Text, "description", - """ + _(""" Renders text over an input image. - """, + """), plugs = { "color" : { "description" : - """ + _(""" The colour of the text. - """, + """), }, "text" : { "description" : - """ + _(""" The text to be rendered. - """, + """), "plugValueWidget:type" : "GafferUI.MultiLineStringPlugValueWidget", "multiLineStringPlugValueWidget:continuousUpdate" : True, @@ -85,11 +86,11 @@ def postCreate( node, menu ) : "font" : { "description" : - """ + _(""" The font to render the text with. This should be a .ttf font file which is located on the paths specified by the IECORE_FONT_PATHS environment variable. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:bookmarks" : "font", @@ -102,35 +103,35 @@ def postCreate( node, menu ) : "size" : { "description" : - """ + _(""" The size of the font in pixels. For best quality results for constant sized text prefer this over the scale setting on the transform, which is better suited for smoothly animating the size. - """, + """), }, "area" : { "description" : - """ + _(""" The area of the image within which the text is rendered. The text will be word wrapped to fit within the area and justified as specified by the justification setting. If the area is empty, then the full display window will be used instead. - """, + """), }, "horizontalAlignment" : { "description" : - """ + _(""" Determines whether the text is aligned to the left or right of the text area, or centered within it. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -143,10 +144,10 @@ def postCreate( node, menu ) : "verticalAlignment" : { "description" : - """ + _(""" Determines whether the text is aligned to the bottom or top of the text area, or centered within it. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -159,12 +160,12 @@ def postCreate( node, menu ) : "transform" : { "description" : - """ + _(""" A transformation applied to the entire text area after layout has been performed. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Transform", diff --git a/python/GafferImageUI/UnpremultiplyUI.py b/python/GafferImageUI/UnpremultiplyUI.py index 65f059dc9fa..71a843d5db1 100644 --- a/python/GafferImageUI/UnpremultiplyUI.py +++ b/python/GafferImageUI/UnpremultiplyUI.py @@ -37,31 +37,32 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Unpremultiply, "description", - """ + _(""" Divides selected channels by a specified alpha channel. If the alpha channel on a pixel is 0, then that pixel will remain the same as the input. - """, + """), plugs = { "alphaChannel" : { "description" : - """ + _(""" The channel to use as the alpha channel. The selected channel does not have to be 'A', but whichever channel is chosen will act as the alpha for the sake of this node. This channel will never be divided by itself - it will remain the same as the input. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", @@ -70,10 +71,10 @@ "ignoreMissingAlpha" : { "description" : - """ + _(""" If set, this node will do nothing if the specified `alphaChannel` is not found, instead of throwing an error. - """, + """), }, diff --git a/python/GafferImageUI/VectorWarpUI.py b/python/GafferImageUI/VectorWarpUI.py index 33269bb23b2..3cf54b39456 100644 --- a/python/GafferImageUI/VectorWarpUI.py +++ b/python/GafferImageUI/VectorWarpUI.py @@ -36,39 +36,40 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.VectorWarp, "description", - """ + _(""" Warps an input image onto a set of UVs provided by a second image, effectively applying a texture map to the UV image. - """, + """), plugs = { "vector" : { "description" : - """ + _(""" The UV image. The R and G channel are used to provide the U and V values, and these determine the source pixel in the main input image. A UV values of ( 0, 0 ) corresponds to the bottom left corner of the input image, and ( 1, 1 ) corresponds to the top right corner. - """ + """) }, "vectorMode" : { "description" : - """ + _(""" Do vectors specify absolute positions in the source image, or relative offsets from the current pixel to the pixel in the source image. - """, + """), "preset:Absolute" : GafferImage.VectorWarp.VectorMode.Absolute, "preset:Relative" : GafferImage.VectorWarp.VectorMode.Relative, @@ -78,10 +79,10 @@ "vectorUnits" : { "description" : - """ + _(""" Are vectors measured in pixels, or as fractions of the input image display window ranging from 0 to 1. - """, + """), "preset:Pixels" : GafferImage.VectorWarp.VectorUnits.Pixels, "preset:Screen" : GafferImage.VectorWarp.VectorUnits.Screen, diff --git a/python/GafferImageUI/ViewPlugValueWidget.py b/python/GafferImageUI/ViewPlugValueWidget.py index 5aae9ed24b8..ca741571931 100644 --- a/python/GafferImageUI/ViewPlugValueWidget.py +++ b/python/GafferImageUI/ViewPlugValueWidget.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage from GafferUI.PlugValueWidget import sole @@ -77,7 +78,7 @@ def _updateFromValues( self, values, exception ) : self.__availableViews = sorted( set().union( *[ v["availableViews"] for v in values ] ) ) if self.__currentValue == "" : - self.__menuButton.setText( "(Current Context)" ) + self.__menuButton.setText( _("(Current Context)") ) elif self.__currentValue is None : self.__menuButton.setText( "---" ) elif self.__currentValue in self.__availableViews : @@ -86,7 +87,7 @@ def _updateFromValues( self, values, exception ) : self.__menuButton.setText( "{}{}".format( self.__currentValue, - " (invalid)" if GafferImage.ImagePlug.defaultViewName not in self.__availableViews else " (default)" + _(" (invalid)") if GafferImage.ImagePlug.defaultViewName not in self.__availableViews else _(" (default)") ) ) diff --git a/python/GafferImageUI/WarpUI.py b/python/GafferImageUI/WarpUI.py index 85dc490468c..f9f6856e9c3 100644 --- a/python/GafferImageUI/WarpUI.py +++ b/python/GafferImageUI/WarpUI.py @@ -36,25 +36,26 @@ import Gaffer import GafferImage +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferImage.Warp, "description", - """ + _(""" Base class for nodes which apply warps to the input image. - """, + """), plugs = { "boundingMode" : { "description" : - """ + _(""" The method used when accessing pixels outside the input data window. - """, + """), "preset:Black" : GafferImage.Sampler.BoundingMode.Black, "preset:Clamp" : GafferImage.Sampler.BoundingMode.Clamp, @@ -66,14 +67,14 @@ "filter" : { "description" : - """ + _(""" The filter used to perform the resampling. The name of any OIIO filter may be specified, but this UI only exposes a limited range of 5 options which perform well for warping, ordered from softest to sharpest. Plus the extra "bilinear" mode which is lower quality, but fast. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -89,12 +90,12 @@ "useDerivatives" : { "description" : - """ + _(""" Whether accurate filter sizes should be computed that take into account the amount of distortion in the size and shape of pixels. Should have minimal impact on warps that mostly preserve the size of pixels, but could have a large impact if there is heavy distortion. Fixes problems with aliasing, at the cost of some extra calculations. - """, + """), "userDefault" : False, "layout:activator" : lambda plug : plug.node()["filter"].getValue() != "bilinear", diff --git a/python/GafferOSLUI/OSLCodeUI.py b/python/GafferOSLUI/OSLCodeUI.py index 0258f973eb3..bfd48b7fb19 100644 --- a/python/GafferOSLUI/OSLCodeUI.py +++ b/python/GafferOSLUI/OSLCodeUI.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferOSL from . import _CodeMenu @@ -52,10 +53,10 @@ GafferOSL.OSLCode, "description", - """ + _(""" Allows arbitrary OSL shaders to be written directly within Gaffer. - """, + """), "layout:customWidget:error:widgetType", "GafferOSLUI.OSLCodeUI._ErrorWidget", "layout:customWidget:error:section", "Settings.Code", @@ -69,14 +70,14 @@ "name" : { - "description" : "Generated automatically - do not edit.", + "description" : _("Generated automatically - do not edit."), "plugValueWidget:type" : "", }, "type" : { - "description" : "Generated automatically - do not edit.", + "description" : _("Generated automatically - do not edit."), "plugValueWidget:type" : "", }, @@ -84,7 +85,7 @@ "parameters" : { "description" : - """ + _(""" The inputs to the shader. Any number of inputs may be created by adding child plugs. Supported plug types and the corresponding OSL types are : @@ -97,7 +98,7 @@ - StringPlug (`string`) - ClosurePlug (`closure color`) - SplinefColor3f ( triplet of `float [], color [], string` ) - """, + """), "layout:customWidget:footer:widgetType" : "GafferOSLUI.OSLCodeUI._ParametersFooter", "layout:customWidget:footer:index" : -1, @@ -118,12 +119,12 @@ "out" : { "description" : - """ + _(""" The outputs from the shader. Any number of outputs may be created by adding child plugs. Supported plug types are as for the input parameters, with the exception of SplinefColor3f, which cannot be used as an output. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -144,10 +145,10 @@ "code" : { "description" : - """ + _(""" The code for the body of the OSL shader. This should read from the input parameters and write to the output parameters. - """, + """), "nodule:type" : "", "plugValueWidget:type" : "GafferOSLUI.OSLCodeUI._CodePlugValueWidget", @@ -181,9 +182,9 @@ def __init__( self, plug ) : hasFrame = False, menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), - title = "Add " + ( "Input" if plug.direction() == plug.Direction.In else "Output" ) + title = _("Add ") + ( _("Input") if plug.direction() == plug.Direction.In else _("Output") ) ), - toolTip = "Add " + ( "Input" if plug.direction() == plug.Direction.In else "Output" ), + toolTip = _("Add ") + ( _("Input") if plug.direction() == plug.Direction.In else _("Output") ), ) GafferUI.Spacer( imath.V2i( 1 ), imath.V2i( 999999, 1 ), parenting = { "expand" : True } ) @@ -375,7 +376,7 @@ def __toolMenu( nodeEditor, node, menuDefinition ) : return menuDefinition.append( "/ExportDivider", { "divider" : True } ) - menuDefinition.append( "/Export OSL Shader...", { "command" : functools.partial( __exportOSLShader, nodeEditor, node ) } ) + menuDefinition.append( "/" + _("Export OSL Shader..."), { "command" : functools.partial( __exportOSLShader, nodeEditor, node ), "label" : _("Export OSL Shader...") } ) def __exportOSLShader( nodeEditor, node ) : @@ -384,7 +385,7 @@ def __exportOSLShader( nodeEditor, node ) : path = Gaffer.FileSystemPath( bookmarks.getDefault( nodeEditor ) ) path.setFilter( Gaffer.FileSystemPath.createStandardFilter( [ "osl" ] ) ) - dialogue = GafferUI.PathChooserDialogue( path, title="Export OSL Shader", confirmLabel="Export", leaf=True, bookmarks=bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title=_("Export OSL Shader"), confirmLabel=_("Export"), leaf=True, bookmarks=bookmarks ) path = dialogue.waitForPath( parentWindow = nodeEditor.ancestor( GafferUI.Window ) ) if not path : @@ -394,7 +395,7 @@ def __exportOSLShader( nodeEditor, node ) : if not path.endswith( ".osl" ) : path += ".osl" - with GafferUI.ErrorDialogue.ErrorHandler( title = "Error Exporting Shader", parentWindow = nodeEditor.ancestor( GafferUI.Window ) ) : + with GafferUI.ErrorDialogue.ErrorHandler( title = _("Error Exporting Shader"), parentWindow = nodeEditor.ancestor( GafferUI.Window ) ) : with open( path, "w", encoding = "utf-8" ) as f : with nodeEditor.context() : f.write( node.source( os.path.splitext( os.path.basename( path ) )[0] ) ) diff --git a/python/GafferOSLUI/OSLExpressionEngineUI.py b/python/GafferOSLUI/OSLExpressionEngineUI.py index c08bad2e9af..a2e6681b827 100644 --- a/python/GafferOSLUI/OSLExpressionEngineUI.py +++ b/python/GafferOSLUI/OSLExpressionEngineUI.py @@ -39,6 +39,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + from . import _CodeMenu from . import _CodeWidget @@ -52,7 +54,7 @@ def __oslPopupMenu( menuDefinition, widget ) : menuDefinition.append( "/InsertOSLDivider", { "divider" : True } ) menuDefinition.append( - "/Insert OSL", + "/" + _("Insert OSL"), { "subMenu" : functools.partial( _CodeMenu.commonFunctionMenu, diff --git a/python/GafferOSLUI/OSLImageUI.py b/python/GafferOSLUI/OSLImageUI.py index a00bd76dba9..d8e1f301c97 100644 --- a/python/GafferOSLUI/OSLImageUI.py +++ b/python/GafferOSLUI/OSLImageUI.py @@ -37,6 +37,7 @@ import IECore import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferOSL @@ -77,9 +78,9 @@ def __init__( self, plug ) : hasFrame = False, menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), - title = "Add Input" + title = _("Add Input") ), - toolTip = "Add Input" + toolTip = _("Add Input") ) GafferUI.Spacer( imath.V2i( 1 ), imath.V2i( 999999, 1 ), parenting = { "expand" : True } ) @@ -178,11 +179,11 @@ def __channelLabelFromPlug( plug ): GafferOSL.OSLImage, "description", - """ + _(""" Executes OSL shaders to perform image processing. Use the shaders from the OSL/ImageProcessing menu to read values from the input image and then write values back to it. - """, + """), "plugAdderOptions", IECore.CompoundData( _channelNamesOptions ), @@ -191,21 +192,21 @@ def __channelLabelFromPlug( plug ): plugs = { "defaultFormat" : { "description" : - """ + _(""" The resolution and aspect ratio to output when there is no input image provided. - """, + """), "layout:activator" : "defaultFormatActive", }, "channels" : { "description" : - """ + _(""" Define image channels to output by adding child plugs and connecting corresponding OSL shaders. You can drive RGB layers with a color, or connect individual channels to a float. If you want to add multiple channels at once, you can also add a closure plug, which can accept a connection from an OSLCode with a combined output closure. - """, + """), "layout:customWidget:footer:widgetType" : "GafferOSLUI.OSLImageUI._ChannelsFooter", "layout:customWidget:footer:index" : -1, "nodule:type" : "GafferUI::CompoundNodule", diff --git a/python/GafferOSLUI/OSLLightUI.py b/python/GafferOSLUI/OSLLightUI.py index 9cc7cb9c62c..ecf7fc4895b 100644 --- a/python/GafferOSLUI/OSLLightUI.py +++ b/python/GafferOSLUI/OSLLightUI.py @@ -40,15 +40,16 @@ import Gaffer import GafferOSL +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferOSL.OSLLight, "description", - """ + _(""" Creates lights by assigning an emissive OSL shader to some simple geometry. - """, + """), "layout:activator:shapeHasRadius", lambda node : node["shape"].getValue() != node.Shape.Geometry, "layout:activator:shapeIsGeometry", lambda node : node["shape"].getValue() == node.Shape.Geometry, @@ -64,10 +65,10 @@ "shaderName" : { "description" : - """ + _(""" The OSL shader to be assigned to the light geometry. - """, + """), "plugValueWidget:type" : "", @@ -76,13 +77,13 @@ "shape" : { "description" : - """ + _(""" The shape of the light. Typically, disks should be used with spotlight shaders and spheres should be used with point light shaders. The "Geometry" shape allows the use of custom geometry specific to a particular renderer. - """, + """), "preset:Disk" : GafferOSL.OSLLight.Shape.Disk, "preset:Sphere" : GafferOSL.OSLLight.Shape.Sphere, @@ -95,10 +96,10 @@ "radius" : { "description" : - """ + _(""" The radius of the disk or sphere shape. Has no effect for other shapes. - """, + """), "layout:visibilityActivator" : "shapeHasRadius", @@ -107,11 +108,11 @@ "geometryType" : { "description" : - """ + _(""" The type of geometry to create when shape is set to "Geometry". This should contain the name of a geometry type specific to the renderer being used. - """, + """), "layout:visibilityActivator" : "shapeIsGeometry", @@ -120,10 +121,10 @@ "geometryBound" : { "description" : - """ + _(""" The bounding box of the geometry. Only relevant when the shape is set to "Geometry". - """, + """), "layout:visibilityActivator" : "shapeIsGeometry", @@ -132,10 +133,10 @@ "geometryParameters" : { "description" : - """ + _(""" Arbitary parameters which specify the features of the "Geometry" shape type. - """, + """), "layout:section" : "Settings.Geometry", "layout:visibilityActivator" : "shapeIsGeometry", @@ -156,7 +157,7 @@ def __parameterMetadata( plug, key ) : for key in [ "description", - "label", + _("label"), "noduleLayout:label", "layout:divider", "layout:section", diff --git a/python/GafferOSLUI/OSLObjectUI.py b/python/GafferOSLUI/OSLObjectUI.py index d556e584f75..d1ad4aca1f6 100644 --- a/python/GafferOSLUI/OSLObjectUI.py +++ b/python/GafferOSLUI/OSLObjectUI.py @@ -39,6 +39,7 @@ import IECoreScene import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferOSL @@ -90,9 +91,9 @@ def __init__( self, plug ) : hasFrame = False, menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), - title = "Add Input" + title = _("Add Input") ), - toolTip = "Add Input" + toolTip = _("Add Input") ) GafferUI.Spacer( imath.V2i( 1 ), imath.V2i( 999999, 1 ), parenting = { "expand" : True } ) @@ -164,11 +165,11 @@ def __addPlug( self, name, defaultData ) : GafferOSL.OSLObject, "description", - """ + _(""" Executes OSL shaders to perform object processing. Use the shaders from the OSL/ObjectProcessing menu to read primitive variables from the input object and then write primitive variables back to it. - """, + """), "plugAdderOptions", IECore.CompoundData( _primitiveVariableNamesOptions ), @@ -183,7 +184,7 @@ def __addPlug( self, name, defaultData ) : "primitiveVariables" : { "description" : - """ + _(""" Define primitive varibles to output by adding child plugs and connecting corresponding OSL shaders. Supported plug types are : @@ -196,7 +197,7 @@ def __addPlug( self, name, defaultData ) : If you want to add multiple outputs at once, you can also add a closure plug, which can accept a connection from an OSLCode with a combined output closure. - """, + """), "layout:customWidget:footer:widgetType" : "GafferOSLUI.OSLObjectUI._PrimitiveVariablesFooter", "layout:customWidget:footer:index" : -1, "nodule:type" : "GafferUI::CompoundNodule", @@ -243,11 +244,11 @@ def __addPlug( self, name, defaultData ) : "interpolation" : { "description" : - """ + _(""" The interpolation type of the primitive variables created by this node. For instance, Uniform interpolation means that the shader is run once per face on a mesh, allowing it to output primitive variables with a value per face. All non-constant input primitive variables are resampled to match the selected interpolation so that they can be accessed from the shader. - """, + """), "preset:Uniform" : IECoreScene.PrimitiveVariable.Interpolation.Uniform, "preset:Vertex" : IECoreScene.PrimitiveVariable.Interpolation.Vertex, @@ -261,41 +262,41 @@ def __addPlug( self, name, defaultData ) : "useTransform" : { "description" : - """ + _(""" Makes the object's transform available to OSL, so that you can use OSL functions that convert from object to world space. - """, + """), }, "useAttributes" : { "description" : - """ + _(""" Makes the Gaffer attributes at the object's location available to OSL through the getattribute function. Once this is on, you can use OSL nodes such as InFloat or InString to retrieve the attribute values. - """, + """), }, "source" : { "description" : - """ + _(""" The input scene which provides the locations to be referenced by the `sourceLocations` plugs. - """ + """) }, "sourceLocations" : { "description" : - """ + _(""" Defines additional scene locations to be made accessible via the `pointcloud_search()`, `pointcloud_get()` and `transform()` OSL functions. - """, + """), "layout:section" : "Source Locations", "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -320,10 +321,10 @@ def __addPlug( self, name, defaultData ) : "sourceLocations.*.name" : { "description" : - """ + _(""" The name to give to the location. This is how it will be referred to from OSL in the `pointcloud_search()`, `pointcloud_get()` and `transform()` functions. - """, + """), "label" : "", "layout:activator" : "isEnabled", @@ -334,9 +335,9 @@ def __addPlug( self, name, defaultData ) : "sourceLocations.*.enabled" : { "description" : - """ + _(""" Enables the location for access in OSL. - """, + """), "label" : "", "boolPlugValueWidget:displayMode" : "switch", @@ -346,10 +347,10 @@ def __addPlug( self, name, defaultData ) : "sourceLocations.*.location" : { "description" : - """ + _(""" The location to be made accessible from OSL. This must exist in the `source` scene. - """, + """), "label" : "", "layout:activator" : "isEnabled", @@ -361,11 +362,11 @@ def __addPlug( self, name, defaultData ) : "sourceLocations.*.pointCloud" : { "description" : - """ + _(""" Makes the location accessible via the `pointcloud_search()` and `pointcloud_get()` OSL functions. The location should contain a primitive with at least a position ('P') primitive variable. - """, + """), "label" : "", "layout:activator" : "isEnabled", @@ -375,9 +376,9 @@ def __addPlug( self, name, defaultData ) : "sourceLocations.*.transform" : { "description" : - """ + _(""" Makes the location's transform accessible via the `transform()` OSL functions. - """, + """), "label" : "", "layout:activator" : "isEnabled", @@ -388,14 +389,14 @@ def __addPlug( self, name, defaultData ) : "ignoreMissingSourceLocations" : { "description" : - """ + _(""" Determines whether a missing source location will trigger an error (the default) or be ignored. When a missing source is ignored, the `pointcloud_search()` and `pointcloud_get()` OSL functions will return `0`, allowing the shader to handle the problem itself. - """, + """), - "label" : "Ignore Missing Source", + "label" : _("Ignore Missing Source"), }, @@ -414,12 +415,12 @@ def __init__( self, plug ) : GafferUI.ListContainer.__init__( self, GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) with self : - GafferUI.Label( "

Name

" )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) + GafferUI.Label( _("

Name

") )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) GafferUI.Spacer( imath.V2i( 25, 2 ), maximumSize = imath.V2i( 25, 2 ) ) - GafferUI.Label( "

Location

" ) + GafferUI.Label( _("

Location

") ) GafferUI.Spacer( imath.V2i( 0 ) ) - GafferUI.Label( "

Pointcloud

" )._qtWidget().setFixedWidth( 100 ) - GafferUI.Label( "

Transform

" )._qtWidget().setFixedWidth( 100 ) + GafferUI.Label( _("

Pointcloud

") )._qtWidget().setFixedWidth( 100 ) + GafferUI.Label( _("

Transform

") )._qtWidget().setFixedWidth( 100 ) class _SourceLocationsFooter( GafferUI.PlugValueWidget ) : diff --git a/python/GafferOSLUI/OSLShaderUI.py b/python/GafferOSLUI/OSLShaderUI.py index 71baa9f6333..144c8902441 100644 --- a/python/GafferOSLUI/OSLShaderUI.py +++ b/python/GafferOSLUI/OSLShaderUI.py @@ -40,6 +40,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n import GafferSceneUI import GafferOSL @@ -200,12 +202,10 @@ def __plugNoduleLabel( plug ) : label = __plugLabel( plug ) if label is None : - return None - - page = __plugPage( plug ) - if page is not None : - label = page + "." + label + label = IECore.CamelCase.toSpaced( plug.getName() ) + if _i18n.translateNodeNames() : + return _i18n.translateLabel( label ) return label def __plugActivator( plug ) : diff --git a/python/GafferRenderManUI/RenderManOptionsUI.py b/python/GafferRenderManUI/RenderManOptionsUI.py index 89fa7b3dd3c..c95ea963527 100644 --- a/python/GafferRenderManUI/RenderManOptionsUI.py +++ b/python/GafferRenderManUI/RenderManOptionsUI.py @@ -44,6 +44,7 @@ import GafferRenderMan from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( @@ -100,12 +101,12 @@ def _updateFromValues( self, values, exception ) : self.__currentValue = sole( values ) or [] if not self.__currentValue : - self.__menuButton.setText( "None" ) + self.__menuButton.setText( _("None") ) else : devices = self.__devices() self.__menuButton.setText( ", ".join( [ - "{} ({})".format( i, devices.get( i, "Unavailable" ) ) + "{} ({})".format( i, devices.get( i, _("Unavailable") ) ) for i in self.__currentValue ] ) ) diff --git a/python/GafferSceneUI/AimConstraintUI.py b/python/GafferSceneUI/AimConstraintUI.py index accb36be010..90b50e3abf8 100644 --- a/python/GafferSceneUI/AimConstraintUI.py +++ b/python/GafferSceneUI/AimConstraintUI.py @@ -36,16 +36,17 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.AimConstraint, "description", - """ + _(""" Transforms objects so that they are aimed at a specified target. - """, + """), plugs = { @@ -58,22 +59,22 @@ "aim" : { "description" : - """ + _(""" The aim vector, specified in object space. The object will be transformed so that this vector points at the target. - """, + """), }, "up" : { "description" : - """ + _(""" The up vector, specified in object space. The object will be transformed so that this vector points up in world space, as far as is possible. - """, + """), }, diff --git a/python/GafferSceneUI/AttributeEditor.py b/python/GafferSceneUI/AttributeEditor.py index 44410292faa..48db71e1041 100644 --- a/python/GafferSceneUI/AttributeEditor.py +++ b/python/GafferSceneUI/AttributeEditor.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -83,7 +84,7 @@ def __init__( self, scriptNode, **kw ) : rootSection = "Filter" ) - self.__locationNameColumn = GafferUI.PathListingWidget.StandardColumn( "Name", "name", GafferUI.PathColumn.SizeMode.Stretch ) + self.__locationNameColumn = GafferUI.PathListingWidget.StandardColumn( _("Name"), "name", GafferUI.PathColumn.SizeMode.Stretch ) self.__visibilityColumn = GafferSceneUI.Private.VisibilityColumn( self.settings()["__adaptedIn"], self.settings()["editScope"] ) self.__pathListing = GafferUI.PathListingWidget( GafferScene.ScenePath( self.settings()["__filteredIn"], self.context(), "/" ), @@ -150,7 +151,7 @@ def registerAttribute( cls, groupKey, attributeName, section = "Main", columnNam attributeName, lambda scene, editScope : GafferSceneUI.Private.InspectorColumn( GafferSceneUI.Private.AttributeInspector( scene, editScope, attributeName ), - columnName, + _(columnName), toolTip ), section @@ -262,7 +263,8 @@ def __columnContextMenuSignal( self, column, pathListing, menuDefinition ) : { "command" : Gaffer.WeakMethod( self.__frameSelectedPaths ), "active" : not selection[0].isEmpty(), - "shortCut" : "F" + "shortCut" : "F", + "label" : _("Frame Selection"), } ) @@ -354,7 +356,7 @@ def __init__( self, plug, **kw ) : def _updateFromValues( self, values, exception ) : for i in range( 0, self._qtWidget().count() ) : - if self._qtWidget().tabText( i ) == values[0] : + if self._qtWidget().tabData( i ) == values[0] : try : self.__ignoreCurrentChanged = True self._qtWidget().setCurrentIndex( i ) @@ -368,10 +370,10 @@ def __currentChanged( self, index ) : return index = self._qtWidget().currentIndex() - text = self._qtWidget().tabText( index ) + originalName = self._qtWidget().tabData( index ) with self._blockedUpdateFromValues() : self.getPlug().setValue( - text if text != "Main" else "" + originalName if originalName and originalName != "Main" else "" ) def __updateTabs( self ) : @@ -386,9 +388,12 @@ def __updateTabs( self ) : for groupKey, sections in AttributeEditor._AttributeEditor__columnRegistry.items() : if IECore.StringAlgo.match( tabGroup, groupKey ) : for section in sections.keys() : - self._qtWidget().addTab( section or "Main" ) + name = section or "Main" + idx = self._qtWidget().addTab( _(name) ) + self._qtWidget().setTabData( idx, name ) if "All" not in sections.keys() and len( sections.keys() ) > 1 : - self._qtWidget().addTab( "All" ) + idx = self._qtWidget().addTab( _("All") ) + self._qtWidget().setTabData( idx, "All" ) self._qtWidget().setVisible( self._qtWidget().count() > 1 ) finally : diff --git a/python/GafferSceneUI/AttributeQueryUI.py b/python/GafferSceneUI/AttributeQueryUI.py index 1f248e18bd1..50095687730 100644 --- a/python/GafferSceneUI/AttributeQueryUI.py +++ b/python/GafferSceneUI/AttributeQueryUI.py @@ -40,6 +40,7 @@ import imath from GafferSceneUI._GafferSceneUI import __showSetupMenu as showSetupMenu +from GafferUI.i18n import _ ## \todo Replace with PlugCreationWidget, figuring out how that relates to # the menu on the PlugAdder used in the GraphEditor. Do we want to have menus @@ -82,9 +83,9 @@ def __updateVisibility( self, *args, **kwargs ) : GafferScene.AttributeQuery, "description", - """ + _(""" Query a particular location in a scene and outputs attribute. - """, + """), "layout:customWidget:setupButton:widgetType", "GafferSceneUI.AttributeQueryUI._SetupButton", "layout:customWidget:setupButton:section", "Settings", @@ -98,20 +99,20 @@ def __updateVisibility( self, *args, **kwargs ) : "scene" : { "description" : - """ + _(""" The scene to query the attribute for. - """ + """) }, "location" : { "description" : - """ + _(""" The location within the scene to query the attribute at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -122,11 +123,11 @@ def __updateVisibility( self, *args, **kwargs ) : "attribute" : { "description" : - """ + _(""" The name of the attribute to query. > Note : If the attribute does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "nodule:type" : "" @@ -135,10 +136,10 @@ def __updateVisibility( self, *args, **kwargs ) : "inherit" : { "description" : - """ + _(""" When on, the query includes attributes inherited from ancestor locations and the scene globals if a local attribute is not found. - """, + """), "nodule:type" : "" @@ -147,18 +148,18 @@ def __updateVisibility( self, *args, **kwargs ) : "default" : { "description" : - """ + _(""" Default value to use if attribute or location does not exist. - """ + """) }, "exists" : { "description" : - """ + _(""" Outputs true if both attribute and location exist, otherwise false. - """, + """), "layout:section" : "Settings.Outputs" @@ -167,9 +168,9 @@ def __updateVisibility( self, *args, **kwargs ) : "value" : { "description" : - """ + _(""" Outputs the value of the specified attribute. - """, + """), "layout:section" : "Settings.Outputs" diff --git a/python/GafferSceneUI/AttributeTweaksUI.py b/python/GafferSceneUI/AttributeTweaksUI.py index ed332759234..d9387ef0e49 100644 --- a/python/GafferSceneUI/AttributeTweaksUI.py +++ b/python/GafferSceneUI/AttributeTweaksUI.py @@ -39,15 +39,16 @@ import Gaffer import GafferScene import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.AttributeTweaks, "description", - """ + _(""" Makes modifications to attributes. - """, + """), "layout:section:Settings.Tweaks:collapsed", False, @@ -56,33 +57,33 @@ "localise" : { "description" : - """ + _(""" Turn on to allow location-specific tweaks to be made to attributes inherited from ancestors or the scene globals. Attributes will be localised to locations matching the node's filter prior to tweaking. The original inherited attributes will remain untouched. - """ + """) }, "ignoreMissing" : { "description" : - """ + _(""" Ignores tweaks targeting missing attributes. When off, missing attributes cause the node to error. - """ + """) }, "tweaks" : { "description" : - """ + _(""" The tweaks to be made to the attributes. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or using the AttributeTweaks API via python. - """, + """), "layout:section" : "Settings.Tweaks", "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", diff --git a/python/GafferSceneUI/AttributeVisualiserUI.py b/python/GafferSceneUI/AttributeVisualiserUI.py index ac8ef516802..bb14a2e003b 100644 --- a/python/GafferSceneUI/AttributeVisualiserUI.py +++ b/python/GafferSceneUI/AttributeVisualiserUI.py @@ -39,16 +39,17 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.AttributeVisualiser, "description", - """ + _(""" Visualises attribute values by applying a constant shader to display them as a colour. - """, + """), "layout:activator:modeIsColorOrFalseColor", lambda node : node["mode"].getValue() in ( node.Mode.Color, node.Mode.FalseColor ), "layout:activator:modeIsFalseColor", lambda node : node["mode"].getValue() == node.Mode.FalseColor, @@ -58,18 +59,18 @@ "attributeName" : { "description" : - """ + _(""" The name of the attribute to be visualised. The value of the attribute will be converted to a colour using the chosen mode and then assigned using a constant shader. - """, + """), }, "mode" : { "description" : - """ + _(""" The method used to turn the attribute value into a colour for visualisation. @@ -82,7 +83,7 @@ for each unique attribute value. - Shader Node Color : This only works when visualising a shader attribute. It uses the node colour for the shader node which is assigned. - """, + """), "preset:Color" : GafferScene.AttributeVisualiser.Mode.Color, "preset:FalseColor" : GafferScene.AttributeVisualiser.Mode.FalseColor, @@ -96,10 +97,10 @@ "min" : { "description" : - """ + _(""" Used in the Color and False Color modes to define the value which is mapped to black or the left end of the spline respectively. - """, + """), "layout:activator" : "modeIsColorOrFalseColor", @@ -108,10 +109,10 @@ "max" : { "description" : - """ + _(""" Used in the Color and False Color modes to define the value which is mapped to white or the right end of the spline respectively. - """, + """), "layout:activator" : "modeIsColorOrFalseColor", @@ -120,10 +121,10 @@ "ramp" : { "description" : - """ + _(""" Provides the colour mapping for the False Color mode. Values between min and max are remapped using the colours from the ramp (left to right). - """, + """), "layout:activator" : "modeIsFalseColor", @@ -132,12 +133,12 @@ "shaderType" : { "description" : - """ + _(""" The type of shader used to perform the visualisation. The default value is for an OpenGL shader which will be used in the viewport. It's possible to perform a visualisation for other renderers by entering a different shader type here. - """, + """), "layout:section" : "Advanced", @@ -146,12 +147,12 @@ "shaderName" : { "description" : - """ + _(""" The name of the shader used to perform the visualisation. The default value is for an OpenGL shader which will be used in the viewport. It's possible to perform a visualisation for other renderers by entering a different shader name here. - """, + """), "layout:section" : "Advanced", @@ -160,10 +161,10 @@ "shaderParameter" : { "description" : - """ + _(""" The name of the shader parameter used to perform the visualisation. The default value is for an OpenGL shader which will be used in the viewport. - """, + """), "layout:section" : "Advanced", diff --git a/python/GafferSceneUI/AttributesUI.py b/python/GafferSceneUI/AttributesUI.py index 195e1b4af1a..4746cc1fdf4 100644 --- a/python/GafferSceneUI/AttributesUI.py +++ b/python/GafferSceneUI/AttributesUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ # The following functions are protected rather than private so that # they can be shared by AttributeTweaksUI. @@ -83,9 +84,9 @@ def __attributePresets( plug ) : GafferScene.Attributes, "description", - """ + _(""" The base type for nodes that apply attributes to the scene. - """, + """), "layout:activator:isNotGlobal", lambda node : not node["global"].getValue(), @@ -94,11 +95,11 @@ def __attributePresets( plug ) : "attributes" : { "description" : - """ + _(""" The attributes to be applied - arbitrary numbers of user defined attributes may be added as children of this plug via the user interface, or using the CompoundDataPlug API via python. - """, + """), "compoundDataPlugValueWidget:editable" : False, @@ -125,10 +126,10 @@ def __attributePresets( plug ) : "global" : { "description" : - """ + _(""" Causes the attributes to be applied to the scene globals instead of the individual locations defined by the filter. - """, + """), "layout:section" : "Filter", @@ -143,7 +144,7 @@ def __attributePresets( plug ) : "extraAttributes" : { "description" : - """ + _(""" An additional set of attributes to be added. Arbitrary numbers of attributes may be specified within a single `IECore.CompoundObject`, where each key/value pair in the object defines an attribute. @@ -155,7 +156,7 @@ def __attributePresets( plug ) : If the same attribute is defined by both the attributes and the extraAttributes plugs, then the value from the extraAttributes is taken. - """, + """), "plugValueWidget:type" : "", "layout:section" : "Extra", diff --git a/python/GafferSceneUI/BoundQueryUI.py b/python/GafferSceneUI/BoundQueryUI.py index 517ef58a6fe..1c3af2182d9 100644 --- a/python/GafferSceneUI/BoundQueryUI.py +++ b/python/GafferSceneUI/BoundQueryUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.BoundQuery, "description", - """ + _(""" Queries a particular location in a scene and outputs the bound. - """, + """), "layout:activator:spaceIsRelative", lambda node : node["space"].getValue() == GafferScene.BoundQuery.Space.Relative, @@ -53,20 +54,20 @@ "scene" : { "description" : - """ + _(""" The scene to query the bounds for. - """ + """) }, "location" : { "description" : - """ + _(""" The location within the scene to query the bound at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -77,9 +78,9 @@ "space" : { "description" : - """ + _(""" The space to query the bound in. - """, + """), "preset:Local" : GafferScene.BoundQuery.Space.Local, "preset:World" : GafferScene.BoundQuery.Space.World, @@ -92,11 +93,11 @@ "relativeLocation" : { "description" : - """ + _(""" The location within the scene to use for relative space mode. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -108,9 +109,9 @@ "bound" : { "description" : - """ + _(""" Bounding box at specified location in specified space. - """, + """), "layout:section" : "Settings.Outputs" @@ -119,9 +120,9 @@ "center" : { "description" : - """ + _(""" Center point vector of the requested bound. - """, + """), "layout:section" : "Settings.Outputs" @@ -130,9 +131,9 @@ "size" : { "description" : - """ + _(""" Size vector of the requested bound. - """, + """), "layout:section" : "Settings.Outputs" diff --git a/python/GafferSceneUI/BranchCreatorUI.py b/python/GafferSceneUI/BranchCreatorUI.py index 688c53cc4bd..5c8407b9caf 100644 --- a/python/GafferSceneUI/BranchCreatorUI.py +++ b/python/GafferSceneUI/BranchCreatorUI.py @@ -38,6 +38,7 @@ import GafferUI import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -48,9 +49,9 @@ GafferScene.BranchCreator, "description", - """ + _(""" Base class for nodes creating a new branch in the scene hierarchy. - """, + """), "layout:activator:filterNotConnected", lambda node : node["filter"].getInput() is None, "layout:activator:parentInUse", lambda node : node["parent"].getInput() is not None or node["parent"].getValue() != "", @@ -88,9 +89,9 @@ "copySourceAttributes" : { "description" : - """ + _(""" Copies attributes to newly created destination locations to match the attributes at the source location. - """, + """), "layout:activator" : "nonDefaultDestination", "layout:index" : -1, diff --git a/python/GafferSceneUI/CameraQueryUI.py b/python/GafferSceneUI/CameraQueryUI.py index 3a459cb2f3f..76b9286540a 100644 --- a/python/GafferSceneUI/CameraQueryUI.py +++ b/python/GafferSceneUI/CameraQueryUI.py @@ -44,6 +44,7 @@ import GafferScene from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ ########################################################################## # Internal utilities @@ -170,9 +171,9 @@ def _updateFromValues( self, values, exception ) : GafferScene.CameraQuery, "description", - """ + _(""" Queries parameters from a camera, creating an output for each query. - """, + """), "layout:activator:cameraModeIsLocation", lambda node : node["cameraMode"].getValue() == int( GafferScene.CameraQuery.CameraMode.Location ), @@ -183,21 +184,21 @@ def _updateFromValues( self, values, exception ) : "scene" : { "description" : - """ + _(""" The scene to query the camera from. - """, + """), }, "cameraMode" : { "description" : - """ + _(""" How the camera to be queried is specified. - Render Camera : Uses the value of the `render:camera` option in the scene globals. - Location : Uses the camera specified on the `location` plug. - """, + """), "preset:Render Camera" : GafferScene.CameraQuery.CameraMode.RenderCamera, "preset:Location" : GafferScene.CameraQuery.CameraMode.Location, @@ -210,12 +211,12 @@ def _updateFromValues( self, values, exception ) : "location" : { "description" : - """ + _(""" The location within the scene containing a camera to query. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values with > each output `source` plug set to "None" (`0`). - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -230,7 +231,7 @@ def _updateFromValues( self, values, exception ) : "queries" : { "description" : - """ + _(""" The camera parameters to be queried - arbitrary numbers of queries may be added as children of this plug via the user interface, or via python. Each child is a `StringPlug` whose value is the parameter to query. @@ -244,7 +245,7 @@ def _updateFromValues( self, values, exception ) : > - `frustum` : The screen window at a distance of 1 unit from the camera, taking > into account `filmFit`, `resolution`, and `pixelAspectRatio` render overrides > on the camera or values from the scene globals. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:section" : "Settings.Queries", @@ -259,9 +260,9 @@ def _updateFromValues( self, values, exception ) : "queries.*" : { "description" : - """ + _(""" The name of the parameter to query. - """, + """), "layout:label" : "", @@ -272,10 +273,10 @@ def _updateFromValues( self, values, exception ) : "out" : { "description" : - """ + _(""" The parent plug of the query outputs. The order of outputs corresponds to the order of children of `queries`. - """, + """), "plugValueWidget:type" : "", @@ -288,9 +289,9 @@ def _updateFromValues( self, values, exception ) : "out.*" : { "description" : - """ + _(""" The result of the query. - """, + """), "nodule:type" : "GafferUI::CompoundNodule", @@ -299,14 +300,14 @@ def _updateFromValues( self, values, exception ) : "out.*.source" : { "description" : - """ + _(""" Outputs the source of the value returned by the query. - None (`0`) : No source was found. Either the parameter does not exist and has no default value, or the camera does not exist. - Camera (`1`) : The camera. - Globals (`2`) : An option in the scene globals. - Fallback (`3`) : The query did not find a result and fell back to returning the default value of the parameter. - """, + """), "nodule:type" : "", @@ -315,9 +316,9 @@ def _updateFromValues( self, values, exception ) : "out.*.value" : { "description" : - """ + _(""" Outputs the value returned by the query. - """, + """), }, @@ -415,7 +416,7 @@ def __menuDefinition( self ) : Gaffer.WeakMethod( self.__addQuery ), "frustum", functools.partial( Gaffer.Box2fPlug, defaultValue = imath.Box2f( imath.V2f( 0.0 ) ) ) ), "active" : "frustum" not in existingQueries, - "description" : "The screen window at a distance of 1 unit from the camera.", + "description" : _("The screen window at a distance of 1 unit from the camera."), } ) @@ -491,7 +492,7 @@ def __plugPopupMenu( menuDefinition, plugValueWidget ) : if len( menuDefinition.items() ) : menuDefinition.append( "/DeleteDivider", { "divider" : True } ) - menuDefinition.append( "/Delete", { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug.node()["queries"] ) } ) + menuDefinition.append( "/" + _("Delete"), { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug.node()["queries"] ) } ) def __deletePlug( plug ) : diff --git a/python/GafferSceneUI/CameraToolUI.py b/python/GafferSceneUI/CameraToolUI.py index 52c033518ed..c575f937c59 100644 --- a/python/GafferSceneUI/CameraToolUI.py +++ b/python/GafferSceneUI/CameraToolUI.py @@ -36,17 +36,18 @@ import Gaffer import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferSceneUI.CameraTool, "description", - """ + _(""" Tool for moving the current camera. Use the Camera dropdown menu in the upper toolbar to choose a camera or light to look through and edit. - """, + """), "viewer:shortCut", "T", "order", 4, diff --git a/python/GafferSceneUI/CameraTweaksUI.py b/python/GafferSceneUI/CameraTweaksUI.py index a066f76da8d..05fe29ceb8f 100644 --- a/python/GafferSceneUI/CameraTweaksUI.py +++ b/python/GafferSceneUI/CameraTweaksUI.py @@ -43,13 +43,14 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.CameraTweaks, "description", - """ + _(""" Applies modifications, also known as "tweaks" to camera parameters or render options in the scene. Supports any number of tweaks, and custom camera parameters. Tweaks to camera @@ -64,7 +65,7 @@ Tweaks are applied in order, so if there is more than one tweak to the same parameter/option, the first tweak will be applied first, then the second, etc. - """, + """), "layout:section:Settings.Tweaks:collapsed", False, @@ -73,23 +74,23 @@ "ignoreMissing" : { "description" : - """ + _(""" Ignores tweaks that would normally cause an error if the input parameter was missing. - """, + """), }, "tweaks" : { "description" : - """ + _(""" Add a camera tweak. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or via the CameraTweaks API in Python. - """, + """), "layout:section" : "Settings.Tweaks", "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -231,7 +232,7 @@ def __menuDefinition( self ) : ] : if isinstance( item, str ) : - result.append( "/Custom/" + item, { "divider" : True } ) + result.append( "/" + _("Custom") + item, { "divider" : True } ) else : def creator( plugType ) : diff --git a/python/GafferSceneUI/CameraUI.py b/python/GafferSceneUI/CameraUI.py index 1637a4faba0..4b544dd4f82 100644 --- a/python/GafferSceneUI/CameraUI.py +++ b/python/GafferSceneUI/CameraUI.py @@ -45,6 +45,7 @@ import GafferUI import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -61,7 +62,7 @@ "projection" : [ "description", - """ + _(""" The base camera type. Supports two standard projections: orthographic and @@ -69,7 +70,7 @@ renderer-specific implementations, such as spherical, you will need to use a downstream CameraTweaks node to adjust this camera's parameters. - """, + """), "preset:Perspective", "perspective", "preset:Orthographic", "orthographic", @@ -83,7 +84,7 @@ "perspectiveMode" : [ "description", - """ + _(""" The input values to use in defining the perspective projection. They can be either a horizontal field of view (`fieldOfView`), or a film back/sensor (`aperture`) and @@ -91,7 +92,7 @@ exact measurements from a real camera and lens setup. With either perspective mode, perspective is stored as `aperture` and `focalLength` parameters on the camera. - """, + """), "preset:Field Of View", GafferScene.Camera.PerspectiveMode.FieldOfView, "preset:Aperture and Focal Length", GafferScene.Camera.PerspectiveMode.ApertureFocalLength, @@ -105,7 +106,7 @@ "fieldOfView" : [ "description", - """ + _(""" The horizontal field of view, in degrees. In the camera's parameters, projection is always stored as @@ -113,7 +114,7 @@ View_ perspective mode, the aperture has the fixed dimensions of `1, 1`, and this plug drives the `focalLength` parameter. - """, + """), "layout:visibilityActivator", "perspectiveModeFOV", @@ -122,7 +123,7 @@ "apertureAspectRatio" : [ "description", - """ + _(""" The vertical field of view, according to the ratio `(horizontal FOV) / (vertical FOV)`. A value of 1 would result in a square aperture, while a value of 1.778 would @@ -133,7 +134,7 @@ The final projection of a render using this camera will depend on these settings in combination with the `resolution` and `filmFit` render settings. - """, + """), "layout:visibilityActivator", "perspectiveModeFOV", @@ -142,7 +143,7 @@ "aperture" : [ "description", - """ + _(""" The width and height of the aperture when using the _Aperture and Focal Length_ perspective mode. Use this in conjunction with a focal length to define the camera's @@ -163,7 +164,7 @@ The final field of view of a render will depend on these settings in combination with the `resolution` and `filmFit` render options. - """, + """), "layout:visibilityActivator", "perspectiveModeFocalLength", @@ -188,7 +189,7 @@ "focalLength" : [ "description", - """ + _(""" The focal length portion of the _Aperture and Focal Length_ perspective mode. This is equivalent to the lens's focal length in a real camera setup. Use this in conjunction with @@ -204,7 +205,7 @@ The final field of view of a render using this camera will depend on these settings in combination with the `resolution` and `filmFit` render options. - """, + """), "layout:visibilityActivator", "perspectiveModeFocalLength", @@ -214,10 +215,10 @@ "orthographicAperture" : [ "description", - """ + _(""" The width and height of the orthographic camera's aperture, in world space units. - """, + """), "layout:visibilityActivator", "orthographic", "layout:divider", True, @@ -227,7 +228,7 @@ "apertureOffset" : [ "description", - """ + _(""" Offsets the aperture parallel to the image plane, to achieve a skewed viewing frustum. The scale of the offset depends on the projection and perspective mode: @@ -242,19 +243,19 @@ For use in special cases, such as simulating a tilt-shift lens, rendering tiles for a large panorama, or matching a plate that has been asymmetrically cropped. - """, + """), ], "fStop" : [ "description", - """ + _(""" The setting equivalent to the f-number on a camera, which ultimately determines the strength of the depth of field blur. A lower value produces more blur. As in a real camera, `fStop` is defined as `focalLength / lens aperture`. To enable depth of field blur (if your renderer supports it), give this plug a value greater than 0, and, on a downstream StandardOptions node, enable the _Depth Of Field_ plug and turn it on. - """, + """), "layout:section", "Depth of Field", ], @@ -262,7 +263,7 @@ "focalLengthWorldScale" : [ "description", - """ + _(""" The scale to convert from focal length units to world space units. Combined with f-stop to calculate the lens aperture. Set this to scale the lens units into scene units, to @@ -287,7 +288,7 @@ aperture size. For example, `3.5` would convert 1 centimeter (Alembic/USD default) to 35mm, which would simulate a 35mm lens. - """, + """), "preset:No Conversion ( 1.0 )", 1.0, "preset:Millimeters to Centimeters ( 0.1 )", 0.1, @@ -306,10 +307,10 @@ "focusDistance" : [ "description", - """ + _(""" The distance from the camera at which objects are in perfect focus, in world space units. - """, + """), "layout:activator", "dof", "layout:section", "Depth of Field", ], @@ -317,21 +318,21 @@ "clippingPlanes" : [ "description", - """ + _(""" The near and far clipping planes, defining a region of forward depth within which objects are visible to this camera. - """, + """), ], "renderSettingOverrides" : [ "description", - """ + _(""" Render settings specified here will override their corresponding global render options. - """, + """), "layout:section", "Render Overrides", "compoundDataPlugValueWidget:editable", False, @@ -346,9 +347,9 @@ "visualiserAttributes" : [ "description", - """ + _(""" Attributes that affect the visualisation of this camera in the Viewer. - """, + """), "layout:section", "Visualisation", "compoundDataPlugValueWidget:editable", False, @@ -364,19 +365,19 @@ "visualiserAttributes.scale" : [ "description", - """ + _(""" Scales non-geometric visualisations in the viewport to make them easier to work with. - """, + """), ], "visualiserAttributes.frustum" : [ "description", - """ + _(""" Controls whether the camera draws a visualisation of its frustum. - """ + """) ], @@ -429,7 +430,7 @@ __overrideMetadata[ overridePlug ] = [ "description", - "Overrides the `{option}` option:\n\n{description}".format( + _("Overrides the `{option}` option:\n\n{description}").format( option = option, description = Gaffer.Metadata.value( "option:" + option, "description" ) ) @@ -443,10 +444,10 @@ GafferScene.Camera, "description", - """ + _(""" Produces scenes containing a camera. To choose which camera is used for rendering, use a StandardOptions node. - """, + """), "layout:activator:perspective", lambda node : node["projection"].getValue() == "perspective", "layout:activator:perspectiveModeFOV", lambda node : node["perspectiveMode"].getValue() == GafferScene.Camera.PerspectiveMode.FieldOfView and node["projection"].getValue() == "perspective", diff --git a/python/GafferSceneUI/CatalogueSelectUI.py b/python/GafferSceneUI/CatalogueSelectUI.py index a10cc84c03b..68caf5f5940 100644 --- a/python/GafferSceneUI/CatalogueSelectUI.py +++ b/python/GafferSceneUI/CatalogueSelectUI.py @@ -36,6 +36,7 @@ import IECore import Gaffer import GafferScene +from GafferUI.i18n import _ def __imageNames( plug ) : node = plug.node() @@ -68,16 +69,16 @@ def __imagePresetValues( plug ) : GafferScene.CatalogueSelect, "description", - "Finds an image in a directly connected Catalogue by name.", + _("Finds an image in a directly connected Catalogue by name."), plugs = { "imageName" : { "description" : - """ + _(""" The name of the image to extract. - """, + """), "presetNames" : __imagePresetNames, "presetValues" : __imagePresetValues, diff --git a/python/GafferSceneUI/CatalogueUI.py b/python/GafferSceneUI/CatalogueUI.py index 29d7acc9b54..abb014fc2a6 100644 --- a/python/GafferSceneUI/CatalogueUI.py +++ b/python/GafferSceneUI/CatalogueUI.py @@ -44,6 +44,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage import GafferScene import GafferImageUI @@ -322,7 +323,7 @@ def __init__( self, title ) : def headerData( self, canceller = None ) : - return self.CellData( icon = "catalogueOutputHeader.png", toolTip = "Output Index" ) + return self.CellData( icon = "catalogueOutputHeader.png", toolTip = _("Output Index") ) def _imageCellData( self, image, catalogue ) : @@ -332,7 +333,7 @@ def _imageCellData( self, image, catalogue ) : "state:normal" : "catalogueOutput{}.png".format( i ) if i else "", "state:highlighted" : "catalogueOutput{}Highlighted{}.png".format( i or 1, "" if i else "Transparent" ), } ), - toolTip = "Click to set this image as Output 1 so it can be referenced from the Viewer or by CatalogueSelect nodes. Right-click to set other output indexes." + toolTip = _("Click to set this image as Output 1 so it can be referenced from the Viewer or by CatalogueSelect nodes. Right-click to set other output indexes.") ) def __buttonPress( self, path, widget, event ) : @@ -348,7 +349,7 @@ def __buttonRelease( self, path, widget, event ) : if event.button == event.Buttons.Left and event.modifiers == event.Modifiers.None_ : self.__setOutputIndex( image, 1 if image["outputIndex"].getValue() == 0 else 0 ) elif event.button == event.Buttons.Right and event.modifiers == event.Modifiers.None_ : - self.__popupMenu = GafferUI.Menu( self.__contextMenuDefinition( image ), title = "Output Index" ) + self.__popupMenu = GafferUI.Menu( self.__contextMenuDefinition( image ), title = _("Output Index") ) self.__popupMenu.popup() return True @@ -388,7 +389,7 @@ def __setOutputIndex( self, image, index, *unused ) : GafferScene.Catalogue, "description", - """ + _(""" Stores a catalogue of images to be browsed. Images can either be loaded from files or rendered directly into the catalogue. @@ -400,14 +401,14 @@ def __setOutputIndex( self, image, index, *unused ) : - displayPort : `GafferScene.Catalogue.displayDriverServer().portNumber()` - remoteDisplayType : "GafferScene::GafferDisplayDriver" - catalogue:name : The name of the catalogue to render to (optional) - """, + """), plugs = { "images" : { "description" : - """ + _(""" Specifies the list of images currently stored in the catalogue. @@ -415,7 +416,7 @@ def __setOutputIndex( self, image, index, *unused ) : using the UI, or use the API to construct Catalogue.Image plugs and parent them here. - """, + """), "plugValueWidget:type" : "", @@ -424,11 +425,11 @@ def __setOutputIndex( self, image, index, *unused ) : "imageIndex" : { "description" : - """ + _(""" Specifies the index of the currently selected image. This forms the output from the catalogue node. - """, + """), "plugValueWidget:type" : "GafferSceneUI.CatalogueUI.ImageListing", "label" : "", @@ -439,24 +440,24 @@ def __setOutputIndex( self, image, index, *unused ) : "name" : { "description" : - """ + _(""" Used to distinguish between catalogues, so that when multiple catalogues exist, it is possible to send a render to just one of them. Renders are matched to catalogues by comparing the "catalogue:name" parameter from the renderer output with the value of this plug. - """, + """), }, "directory" : { "description" : - """ + _(""" The directory where completed renders are saved. This allows them to remain in the catalogue for the next session. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : False, @@ -466,13 +467,13 @@ def __setOutputIndex( self, image, index, *unused ) : "imageNames" : { "description" : - """ + _(""" Output containing all the names of the images in the Catalogue. Possible uses include : - Looping over all images using a Wedge and a CatalogueSelect. - Making a ContactSheet using the Collect mode and a CatalogueSelect. - """, + """), "layout:section" : "Advanced" @@ -761,24 +762,24 @@ def __init__( self, plug, **kw ) : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) as self.__buttonRow : - addButton = GafferUI.Button( image = "pathChooser.png", hasFrame = False, toolTip = "Load image" ) + addButton = GafferUI.Button( image = "pathChooser.png", hasFrame = False, toolTip = _("Load image") ) addButton.clickedSignal().connect( Gaffer.WeakMethod( self.__addClicked ) ) - self.__duplicateButton = GafferUI.Button( image = "duplicate.png", hasFrame = False, toolTip = "Duplicate selected image, hold alt to view copy. [Ctrl-D]" ) + self.__duplicateButton = GafferUI.Button( image = "duplicate.png", hasFrame = False, toolTip = _("Duplicate selected image, hold alt to view copy. [Ctrl-D]") ) self.__duplicateButton.setEnabled( False ) self.__duplicateButton.clickedSignal().connect( Gaffer.WeakMethod( self.__duplicateClicked ) ) - self.__exportButton = GafferUI.Button( image = "export.png", hasFrame = False, toolTip = "Export selected image" ) + self.__exportButton = GafferUI.Button( image = "export.png", hasFrame = False, toolTip = _("Export selected image") ) self.__exportButton.setEnabled( False ) self.__exportButton.clickedSignal().connect( Gaffer.WeakMethod( self.__exportClicked ) ) - self.__extractButton = GafferUI.Button( image = "extract.png", hasFrame = False, toolTip = "Create CatalogueSelect node for selected image" ) + self.__extractButton = GafferUI.Button( image = "extract.png", hasFrame = False, toolTip = _("Create CatalogueSelect node for selected image") ) self.__extractButton.setEnabled( False ) self.__extractButton.clickedSignal().connect( Gaffer.WeakMethod( self.__extractClicked ) ) GafferUI.Spacer( imath.V2i( 0 ), parenting = { "expand" : True } ) - self.__removeButton = GafferUI.Button( image = "delete.png", hasFrame = False, toolTip = "Remove selected image [Delete]" ) + self.__removeButton = GafferUI.Button( image = "delete.png", hasFrame = False, toolTip = _("Remove selected image [Delete]") ) self.__removeButton.setEnabled( False ) self.__removeButton.clickedSignal().connect( Gaffer.WeakMethod( self.__removeClicked ) ) @@ -788,15 +789,15 @@ def __init__( self, plug, **kw ) : GafferUI.Spacer( size = imath.V2i( 2 ) ) - GafferUI.Label( "

Image Properties

" ) + GafferUI.Label( "

" + _("Image Properties") + "

" ) GafferUI.Spacer( size = imath.V2i( 2 ) ) with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) : - GafferUI.Label( "Name" ) + GafferUI.Label( _("Name") ) self.__nameWidget = GafferUI.NameWidget( graphComponent = None ) - GafferUI.Label( "Description" ) + GafferUI.Label( _("Description") ) self.__descriptionWidget = GafferUI.MultiLineStringPlugValueWidget( plug = None ) self.__mergeGroupId = 0 @@ -960,7 +961,7 @@ def __addClicked( self, *unused ) : ) ) - dialogue = GafferUI.PathChooserDialogue( path, title = "Add image", confirmLabel = "Add", valid = True, leaf = True, bookmarks = bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title = _("Add image"), confirmLabel = _("Add"), valid = True, leaf = True, bookmarks = bookmarks ) dialogue.pathChooserWidget().pathListingWidget().setColumns( dialogue.pathChooserWidget().pathListingWidget().getColumns() + [ GafferUI.PathListingWidget.StandardColumn( "Frame Range", "fileSystem:frameRange" ) ] @@ -1039,7 +1040,7 @@ def __exportClicked( self, *unused ) : ) ) - dialogue = GafferUI.PathChooserDialogue( path, title = "Export image", confirmLabel = "Export", leaf = True, bookmarks = bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title = _("Export image"), confirmLabel = _("Export"), leaf = True, bookmarks = bookmarks ) path = dialogue.waitForPath( parentWindow = self.ancestor( GafferUI.Window ) ) if not path : @@ -1200,7 +1201,7 @@ def __columnContextMenuDefinition( self ) : allColumnsSorted = sorted( registeredColumns() ) menu = IECore.MenuDefinition() - menu.append( "/Reset", { "command" : Gaffer.WeakMethod( self.__resetColumns ) } ) + menu.append( "/" + _("Reset"), { "command" : Gaffer.WeakMethod( self.__resetColumns ) } ) menu.append( "/__resetDivider__", { "divider" : True } ) for column in allColumnsSorted : @@ -1225,7 +1226,7 @@ def __contextMenu( self, *unused ) : if not headerRect.contains( mousePosition[0], mousePosition[1] ) : return False - self.__popupMenu = GafferUI.Menu( self.__columnContextMenuDefinition(), title = "Columns" ) + self.__popupMenu = GafferUI.Menu( self.__columnContextMenuDefinition(), title = _("Columns") ) self.__popupMenu.popup( parent = self ) return True diff --git a/python/GafferSceneUI/ClippingPlaneUI.py b/python/GafferSceneUI/ClippingPlaneUI.py index 548fcaf20af..d46023414da 100644 --- a/python/GafferSceneUI/ClippingPlaneUI.py +++ b/python/GafferSceneUI/ClippingPlaneUI.py @@ -38,27 +38,28 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ClippingPlane, "description", - """ + _(""" Creates an arbitrary clipping plane. This is like the near and far clipping planes provided by the Camera node, but can be positioned arbitrarily in space. All geometry on the positive Z side of the plane is clipped away. - """, + """), plugs = { "name" : { "description" : - """ + _(""" The name of the clipping plane to be created. - """, + """), }, diff --git a/python/GafferSceneUI/ClosestPointSamplerUI.py b/python/GafferSceneUI/ClosestPointSamplerUI.py index cb024e7ec0b..a655759557c 100644 --- a/python/GafferSceneUI/ClosestPointSamplerUI.py +++ b/python/GafferSceneUI/ClosestPointSamplerUI.py @@ -36,28 +36,29 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ClosestPointSampler, "description", - """ + _(""" Samples primitive variables from the closest point on the surface of a source primitive, and transfers the values onto new primitive variable on the sampling objects. - """, + """), plugs = { "position" : { "description" : - """ + _(""" The primitive variable that provides the positions to find the closest point to. This defaults to "P", the vertex position of the sampling object. - """, + """), "layout:section" : "Settings.Input", # Put the Input section before the Output section diff --git a/python/GafferSceneUI/CollectPrimitiveVariablesUI.py b/python/GafferSceneUI/CollectPrimitiveVariablesUI.py index 52682fd92d1..1163e541f25 100644 --- a/python/GafferSceneUI/CollectPrimitiveVariablesUI.py +++ b/python/GafferSceneUI/CollectPrimitiveVariablesUI.py @@ -36,20 +36,21 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.CollectPrimitiveVariables, "description", - """ + _(""" Make copies of target primitive variables with different suffixes, where the new suffixed copies come from different Contexts. By combining this with a TimeWarp, you can create copies of primitive variables at different times, useful for creating trail effects. - """, + """), "ui:spreadsheet:enabledRowNamesConnection", "suffixes", "ui:spreadsheet:selectorContextVariablePlug", "suffixContextVariable", @@ -58,27 +59,27 @@ "primitiveVariables" : { "description" : - """ + _(""" A match pattern for which primitive variables will be copied. - """ + """) }, "suffixes" : { "description" : - """ + _(""" The names of the new suffixes to add to copies of the target primitive variables. The new suffixed variables will be copied from different Contexts. - """, + """), }, "suffixContextVariable" : { "description" : - """ + _(""" The name of a Context Variable that is set to the current suffix when evaluating the input object. This can be used in upstream expressions and string substitutions to vary @@ -87,20 +88,20 @@ For example, you could drive a TimeWarp with this variable in order create copies of a primitive variable at different times. - """, + """), }, "requireVariation" : { "description" : - """ + _(""" If true, newly copied primitive variables will only be created if the source object is differs in some of the suffix Contexts. If the source object never changes, it will be passed through unchanged ( since there is no variation, you can just use the original primitive variables ). - """ + """) }, diff --git a/python/GafferSceneUI/CollectScenesUI.py b/python/GafferSceneUI/CollectScenesUI.py index b68b4217810..84dc3995003 100644 --- a/python/GafferSceneUI/CollectScenesUI.py +++ b/python/GafferSceneUI/CollectScenesUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.CollectScenes, "description", - """ + _(""" Builds a scene by bundling multiple input scenes together, each under their own root location. Instead of using an array of inputs like the Group node, a single input is used instead, and a Context @@ -54,7 +55,7 @@ Since merging globals from multiple scenes often doesn't make sense, the output globals are taken directly from the scene corresponding to `rootNames[0]`. - """, + """), "ui:spreadsheet:enabledRowNamesConnection", "rootNames", "ui:spreadsheet:selectorContextVariablePlug", "rootNameVariable", @@ -64,33 +65,33 @@ "rootNames" : { "description" : - """ + _(""" The paths to the root locations to create in the output scene. The input scene is copied underneath each of these root locations. Often the rootNames will be driven by an expression that generates a dynamic number of root locations, perhaps by querying an asset management system or listing cache files on disk. - """, + """), }, "rootNameVariable" : { "description" : - """ + _(""" The name of a Context Variable that is set to the current root location when evaluating the input scene. This can be used in upstream expressions and string substitutions to generate a different hierarchy under each root location. - """, + """), }, "sourceRoot" : { "description" : - """ + _(""" Specifies the root of the subtree to be copied from the input scene. The default value causes the whole scene to be collected. @@ -101,7 +102,7 @@ > Tip : > By specifying a leaf location as the root, it is possible to > collect single objects from the input scene. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", @@ -110,13 +111,13 @@ "mergeGlobals" : { "description" : - """ + _(""" Controls how the output globals are generated from the collected scenes. By default, the globals from the first scene alone are passed through. When `mergeGlobals` is on, the globals from all collected scenes are merged, with the last scene winning in the case of multiple scenes specifying the same global. - """, + """), }, diff --git a/python/GafferSceneUI/CollectTransformsUI.py b/python/GafferSceneUI/CollectTransformsUI.py index 8f38afca544..bc361ec869a 100644 --- a/python/GafferSceneUI/CollectTransformsUI.py +++ b/python/GafferSceneUI/CollectTransformsUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.CollectTransforms, "description", - """ + _(""" Collects transforms in different Contexts, storing the results as attributes. The names of the attributes being collected are provided as a Context Variable, which can be used to vary the transforms that are collected. @@ -50,24 +51,24 @@ By combining this with a TimeWarp, you can create copies of the transform at different times, useful for creating trail effects. - """, + """), plugs = { "attributes" : { "description" : - """ + _(""" The names of the new attributes to create. The new attributes will be copied from the transform in different Contexts. - """, + """), }, "attributeContextVariable" : { "description" : - """ + _(""" The name of a Context Variable that is set to the current attribute name when evaluating the transform. This can be used in upstream expressions and string substitutions to vary @@ -76,17 +77,17 @@ For example, you could drive a TimeWarp with this variable in order create copies of the transform at different times. - """, + """), }, "space" : { "description" : - """ + _(""" If you select world space, the created attributes will contain a concatenation of all transforms from the root of the scene to the current location. - """, + """), "preset:Local" : GafferScene.Transform.Space.Local, "preset:World" : GafferScene.Transform.Space.World, @@ -98,26 +99,26 @@ "requireVariation" : { "description" : - """ + _(""" If true, new attributes will only be created if the transform differs in some of the Contexts. If the transform never changes, no new attributes will be created ( you can just use the transform instead of accessing the new attributes ). - """ + """) }, "transforms" : { "description" : - """ + _(""" This hidden plug is a CompoundObject that contains just the new transform attributes. It is primarily used for internal computation, but there are cases where you can improve performance by naughtily plugging it into an expression. - """, + """), "plugValueWidget:type" : "" }, diff --git a/python/GafferSceneUI/ConstraintUI.py b/python/GafferSceneUI/ConstraintUI.py index 279f50da18a..68ee7aeb67a 100644 --- a/python/GafferSceneUI/ConstraintUI.py +++ b/python/GafferSceneUI/ConstraintUI.py @@ -38,6 +38,7 @@ import GafferUI import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -48,10 +49,10 @@ GafferScene.Constraint, "description", - """ + _(""" Base type for nodes which constrain objects to a target object by manipulating their transform. - """, + """), "layout:activator:targetModeIsUV", lambda node : node["targetMode"].getValue() == GafferScene.Constraint.TargetMode.UV, "layout:activator:targetModeIsVertex", lambda node : node["targetMode"].getValue() == GafferScene.Constraint.TargetMode.Vertex, @@ -63,23 +64,23 @@ "targetScene" : { "description" : - """ + _(""" The scene containing the target location to which objects are constrained. If this is unconnected, the main input scene is used instead. - """, + """), }, "target" : { "description" : - """ + _(""" The scene location to which the objects are constrained. The world space transform of this location forms the basis of the constraint target, but is modified by the targetMode and targetOffset values before the constraint is applied. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "targetScene in", @@ -89,21 +90,21 @@ "ignoreMissingTarget" : { "description" : - """ + _(""" Causes the constraint to do nothing if the target location doesn't exist in the scene, instead of erroring. - """, + """), }, "targetMode" : { "description" : - """ + _(""" The precise location of the target transform - this can be derived from the origin, bounding box or from a specific primitive uv coordinate or vertex id of the target location. - """, + """), "preset:Origin" : GafferScene.Constraint.TargetMode.Origin, "preset:BoundMin" : GafferScene.Constraint.TargetMode.BoundMin, @@ -119,11 +120,11 @@ "targetUV" : { "description" : - """ + _(""" UV coordinate used in \"UV\" target mode. The node will error if the specified uv coordinate is out of range or does not map unambiguously to a single position on the primitive's surface unless ignoreMissingTarget is true. - """, + """), "layout:activator" : "targetModeIsUV", }, @@ -131,13 +132,13 @@ "targetVertex" : { "description" : - """ + _(""" Vertex id used in \"Vertex\" target mode. The node will error if the specified vertex id is out of range unless ignoreMissingTarget is true. The node will error if the specified primitive does not have a set of uvs named \"uv\" with FaceVarying or Vertex interpolation unless ignoreMissingTarget is true. The uvs will be used to construct a local coordinate frame. - """, + """), "layout:activator" : "targetModeIsVertex", }, @@ -145,12 +146,12 @@ "targetOffset" : { "description" : - """ + _(""" An offset applied to the target transform before the constraint is applied. The offset is measured in the object space of the target location unless the target mode is UV or Vertex in which case the offset is measured relative to the local surface coordinate frame. - """, + """), "divider" : True, @@ -159,20 +160,20 @@ "keepReferencePosition" : { "description" : - """ + _(""" Adjusts the constraint so that the original position of the object at the `referenceFrame` is maintained. - """, + """), }, "referenceFrame" : { "description" : - """ + _(""" The reference frame used by the `keepReferencePosition` mode. The constraint is adjusted so that the original position at this frame is maintained. - """, + """), "layout:activator" : "keepReferencePositionIsOn", diff --git a/python/GafferSceneUI/CoordinateSystemUI.py b/python/GafferSceneUI/CoordinateSystemUI.py index e371ab3ed94..c6877483b7a 100644 --- a/python/GafferSceneUI/CoordinateSystemUI.py +++ b/python/GafferSceneUI/CoordinateSystemUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.CoordinateSystem, "description", - """ + _(""" Produces scenes containing a coordinate system. Coordinate systems have two main uses : @@ -52,6 +53,6 @@ render time. This is useful for defining projections or procedural solid textures. The full path to the location of the coordinate system should be used to refer to it within shaders. - """, + """), ) diff --git a/python/GafferSceneUI/CopyAttributesUI.py b/python/GafferSceneUI/CopyAttributesUI.py index c664003ceeb..00c9164b6e9 100644 --- a/python/GafferSceneUI/CopyAttributesUI.py +++ b/python/GafferSceneUI/CopyAttributesUI.py @@ -36,47 +36,48 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.CopyAttributes, "description", - """ + _(""" Copies attributes from a source scene, adding them to the attributes of the main input scene. - """, + """), plugs = { "source" : { "description" : - """ + _(""" The scene from which the attributes are copied. - """, + """), }, "attributes" : { "description" : - """ + _(""" The names of the attributes to be copied. These should be separated by spaces and can use Gaffer's standard wildcards to match multiple attributes. - """, + """), }, "sourceLocation" : { "description" : - """ + _(""" The location in the source scene that attributes are copied from. By default, attributes are copied from the location equivalent to the one they are being copied to. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "source", @@ -86,10 +87,10 @@ "deleteExisting" : { "description" : - """ + _(""" Deletes all attributes from the input scene before adding the copied attributes. - """, + """), }, diff --git a/python/GafferSceneUI/CopyOptionsUI.py b/python/GafferSceneUI/CopyOptionsUI.py index e5eda5e96e3..91a36475cd3 100644 --- a/python/GafferSceneUI/CopyOptionsUI.py +++ b/python/GafferSceneUI/CopyOptionsUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -46,28 +47,28 @@ GafferScene.CopyOptions, "description", - """ + _(""" A node which copies options from a source scene. - """, + """), plugs = { "options" : { "description" : - """ + _(""" The names of the options to be copied. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), }, "source" : { "description" : - """ + _(""" The source of the options to be copied. - """, + """), }, } diff --git a/python/GafferSceneUI/CopyPrimitiveVariablesUI.py b/python/GafferSceneUI/CopyPrimitiveVariablesUI.py index 6eeef484fab..da2dfe22cff 100644 --- a/python/GafferSceneUI/CopyPrimitiveVariablesUI.py +++ b/python/GafferSceneUI/CopyPrimitiveVariablesUI.py @@ -36,48 +36,49 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.CopyPrimitiveVariables, "description", - """ + _(""" Copies primitive variables from a source scene, adding them to the objects of the main input scene. - """, + """), plugs = { "source" : { "description" : - """ + _(""" The scene from which the primitive variables are copied. - """, + """), }, "primitiveVariables" : { "description" : - """ + _(""" The names of the primitive variables to be copied. These should be separated by spaces and can use Gaffer's standard wildcards to match multiple variables. - """, + """), }, "sourceLocation" : { "description" : - """ + _(""" The location in the source scene that primitive variables are copied from. By default, variables are copied from the location equivalent to the one they are being copied to. It is not an error if the location to be copied from does not exist; instead, no variables are copied. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "source", @@ -87,19 +88,19 @@ "prefix" : { "description" : - """ + _(""" A prefix applied to the names of the copied primitive variables. - """, + """), }, "ignoreIncompatible" : { "description" : - """ + _(""" Causes the node to not error when attempting to copy primitive variables from the source object that are not compatible with the destination object. - """, + """), } } diff --git a/python/GafferSceneUI/CropWindowToolUI.py b/python/GafferSceneUI/CropWindowToolUI.py index 21c8c54f6f9..d243bb2bc7f 100644 --- a/python/GafferSceneUI/CropWindowToolUI.py +++ b/python/GafferSceneUI/CropWindowToolUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferSceneUI Gaffer.Metadata.registerNode( @@ -45,7 +46,7 @@ GafferSceneUI.CropWindowTool, "description", - """ + _(""" Tool for adjusting crop window for rendering. The crop window is displayed as a masked area which can be adjusted using drag and drop. @@ -54,7 +55,7 @@ that there is something to adjust - typically this will be a StandardOptions node. The name of the plug being manipulated is displayed underneath the cropped area - it can be used to verify that the expected node is being adjusted. - """, + """), "viewer:shortCut", "C", "order", 5, @@ -101,11 +102,11 @@ def __init__( self, tool, **kw ) : with GafferUI.ListContainer( orientation = GafferUI.ListContainer.Orientation.Horizontal ) as self.__controls : - self.__enabledLabel = GafferUI.Label( "Enabled" ) + self.__enabledLabel = GafferUI.Label( _("Enabled") ) self.__enabled = GafferUI.BoolPlugValueWidget( None ) self.__enabled.boolWidget().setDisplayMode( GafferUI.BoolWidget.DisplayMode.Switch ) - button = GafferUI.Button( "Reset" ) + button = GafferUI.Button( _("Reset") ) button._qtWidget().setFixedWidth( 50 ) button.clickedSignal().connect( Gaffer.WeakMethod( self.__buttonClicked ) ) diff --git a/python/GafferSceneUI/CryptomatteUI.py b/python/GafferSceneUI/CryptomatteUI.py index 3353daea5d0..97a4e4265df 100644 --- a/python/GafferSceneUI/CryptomatteUI.py +++ b/python/GafferSceneUI/CryptomatteUI.py @@ -44,6 +44,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage import GafferScene import GafferSceneUI @@ -142,9 +143,9 @@ def __layerPresetValues( plug ) : GafferScene.Cryptomatte, "description", - """ + _(""" Outputs a matte channel generated from IDs selected from Cryptomatte AOVs. - """, + """), "layout:activator:metadataManifest", lambda node : node["manifestSource"].getValue() == GafferScene.Cryptomatte.ManifestSource.Metadata, "layout:activator:sidecarManifest", lambda node : node["manifestSource"].getValue() == GafferScene.Cryptomatte.ManifestSource.Sidecar, @@ -154,27 +155,27 @@ def __layerPresetValues( plug ) : "in" : { "description" : - """ + _(""" The input image containing Cryptomatte image layers and optional metadata. - """, + """), }, "out" : { "description" : - """ + _(""" The resulting image. - """, + """), }, "layer" : { "description" : - """ + _(""" The name of the Cryptomatte layer to use. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "presetNames" : __layerPresetNames, @@ -185,7 +186,7 @@ def __layerPresetValues( plug ) : "manifestSource" : { "description" : - """ + _(""" The source of the Cryptomatte manifest. - None: No manifest will be loaded. @@ -195,7 +196,7 @@ def __layerPresetValues( plug ) : - `manif_file` : The name of a JSON manifest file stored in a directory specified on the `manifestDirectory` plug. - Sidecar File: From a JSON file specified on the `sidecarFile` plug. - """, + """), "preset:None" : GafferScene.Cryptomatte.ManifestSource.None_, "preset:Metadata" : GafferScene.Cryptomatte.ManifestSource.Metadata, @@ -207,7 +208,7 @@ def __layerPresetValues( plug ) : "manifestDirectory" : { "description" : - """ + _(""" A directory of JSON files containing Cryptomatte manifests. If a `manif_file` metadata entry exists for the selected Cryptomatte @@ -217,7 +218,7 @@ def __layerPresetValues( plug ) : If this is not specified, the directory will be inferred from the image's `filePath` metadata. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : False, @@ -227,12 +228,12 @@ def __layerPresetValues( plug ) : "sidecarFile" : { "description" : - """ + _(""" A JSON file containing a Cryptomatte manifest. File sequences with arbitrary padding may be specified using the '#' character as a placeholder for the frame numbers. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -245,7 +246,7 @@ def __layerPresetValues( plug ) : "matteNames" : { "description" : - """ + _(""" The list of names to be extracted as a matte. Names are matched against entries in the Cryptomatte manifest and @@ -272,7 +273,7 @@ def __layerPresetValues( plug ) : angle brackets. - ``. - """, + """), "plugValueWidget:type" : "GafferSceneUI.CryptomatteUI._CryptomatteNamesPlugValueWidget", }, @@ -280,18 +281,18 @@ def __layerPresetValues( plug ) : "outputChannel" : { "description" : - """ + _(""" The name of the output channel containing the extracted matte. - """, + """), }, "manifestScene" : { "description" : - """ + _(""" A scene containing locations representing the contents of the Cryptomatte manifest. - """, + """), }, @@ -443,7 +444,7 @@ def appendNodeContextMenuDefinitions( graphEditor, node, menuDefinition ) : return menuDefinition.append( "/CryptomatteDivider", { "divider" : True } ) - menuDefinition.append( "/Select Affected Objects", { "command" : functools.partial( __selectAffected, node, graphEditor.context() ) } ) + menuDefinition.append( "/" + _("Select Affected Objects"), { "command" : functools.partial( __selectAffected, node, graphEditor.context() ), "label" : _("Select Affected Objects") } ) ########################################################################## # NodeEditor tool menu @@ -455,4 +456,4 @@ def appendNodeEditorToolMenuDefinitions( nodeEditor, node, menuDefinition ) : return menuDefinition.append( "/CryptomatteDivider", { "divider" : True } ) - menuDefinition.append( "/Select Affected Objects", { "command" : functools.partial( __selectAffected, node, nodeEditor.context() ) } ) + menuDefinition.append( "/" + _("Select Affected Objects"), { "command" : functools.partial( __selectAffected, node, nodeEditor.context() ), "label" : _("Select Affected Objects") } ) diff --git a/python/GafferSceneUI/CubeUI.py b/python/GafferSceneUI/CubeUI.py index 0952734ee0a..e5d362f04ff 100644 --- a/python/GafferSceneUI/CubeUI.py +++ b/python/GafferSceneUI/CubeUI.py @@ -36,34 +36,35 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Cube, "description", - """ + _(""" Produces scenes containing a cube. - """, + """), plugs = { "dimensions" : { "description" : - """ + _(""" The size of the cube. - """, + """), }, "divisions" : { "description" : - """ + _(""" The number of subdivisions of the cube in the X, Y and Z directions. - """, + """), }, diff --git a/python/GafferSceneUI/CurveSamplerUI.py b/python/GafferSceneUI/CurveSamplerUI.py index bce497d3951..315984c4f20 100644 --- a/python/GafferSceneUI/CurveSamplerUI.py +++ b/python/GafferSceneUI/CurveSamplerUI.py @@ -36,27 +36,28 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.CurveSampler, "description", - """ + _(""" Samples primitive variables from parametric positions on some source curves. The positions are specified using the index of the curve and its `v` parameter. - """, + """), plugs = { "curveIndex" : { "description" : - """ + _(""" The name of an integer primitive variable that specifies the index of the curve to be sampled. If left unspecified, the first curve will be sampled. - """, + """), "layout:section" : "Settings.Input", # Put the Input section before the Output section @@ -67,7 +68,7 @@ "v" : { "description" : - """ + _(""" The name of a float primitive variable that specifies the parametric position on the curve to be sampled. A value of 0 corresponds to the start of the curve, and a value of 1 corresponds to the end. @@ -76,7 +77,7 @@ > Note : Values outside the `0-1` range are invalid and cannot > be sampled. In this case, the `status` output primitive variable > will contain `False` to indicate failure. - """, + """), "layout:section" : "Settings.Input", diff --git a/python/GafferSceneUI/CustomAttributesUI.py b/python/GafferSceneUI/CustomAttributesUI.py index da92e08552e..dba9aab7d1e 100644 --- a/python/GafferSceneUI/CustomAttributesUI.py +++ b/python/GafferSceneUI/CustomAttributesUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -49,14 +50,14 @@ GafferScene.CustomAttributes, "description", - """ + _(""" Applies arbitrary user-defined attributes to locations in the scene. Note that for most common cases the StandardAttributes or renderer-specific attributes nodes should be preferred, as they provide predefined sets of attributes with customised user interfaces. The CustomAttributes node is of most use when needing to set an attribute not supported by the specialised nodes. - """, + """), plugs = { @@ -210,7 +211,7 @@ def __addFromPathsMenuDefinition( menu, paths ) : if not len( result.items() ) : result.append( - "/No Attributes Found", { "active" : False } + "/No Attributes Found", { "active" : False, "label" : _("No Attributes Found") } ) return result @@ -267,7 +268,7 @@ def __attributesDropHandler( widget, dragDropEvent ) : attributes = __filteredAttributes( widget, dragDropEvent ) if not attributes : - GafferUI.PopupWindow.showWarning( "Attributes added already", parent = widget ) + GafferUI.PopupWindow.showWarning( _("Attributes added already"), parent = widget ) with Gaffer.UndoScope( widget.plugParent().ancestor( Gaffer.ScriptNode ) ) : for name, value in attributes.items() : diff --git a/python/GafferSceneUI/CustomOptionsUI.py b/python/GafferSceneUI/CustomOptionsUI.py index 6d6d6e29886..7ba04fc9fc2 100644 --- a/python/GafferSceneUI/CustomOptionsUI.py +++ b/python/GafferSceneUI/CustomOptionsUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -49,24 +50,24 @@ "description", - """ + _(""" Applies arbitrary user-defined options to the root of the scene. Note that for most common cases the StandardOptions or renderer-specific options nodes should be preferred, as they provide predefined sets of options with customised user interfaces. The CustomOptions node is of most use when needing to set am option not supported by the specialised nodes. - """, + """), plugs = { "options" : { "description" : - """ + _(""" The options to be applied - arbitrary numbers of user defined options may be added as children of this plug via the user interface, or using the CompoundDataPlug API via python. - """, + """), "plugCreationWidget:excludedTypes" : "Gaffer.ObjectPlug", "compoundDataPlugValueWidget:editable" : True, @@ -84,11 +85,11 @@ "prefix" : { "description" : - """ + _(""" A prefix applied to the name of each option. For example, a prefix of "myCategory:" and a name of "test" will create an option named "myCategory:test". - """, + """), "layout:section" : "Advanced", @@ -132,7 +133,7 @@ def __addFromGlobalsMenuDefinition( menu ) : if not len( result.items() ) : result.append( - "/No Options Found", { "active" : False } + "/No Options Found", { "active" : False, "label" : _("No Options Found") } ) return result @@ -182,7 +183,7 @@ def __optionsDropHandler( widget, dragDropEvent ) : options = __filteredOptions( widget, dragDropEvent ) if not options : - GafferUI.PopupWindow.showWarning( "Options added already", parent = widget ) + GafferUI.PopupWindow.showWarning( _("Options added already"), parent = widget ) with Gaffer.UndoScope( widget.plugParent().ancestor( Gaffer.ScriptNode ) ) : for name, value in options.items() : diff --git a/python/GafferSceneUI/DeformerUI.py b/python/GafferSceneUI/DeformerUI.py index 5afecd6c93f..ced1f547dce 100644 --- a/python/GafferSceneUI/DeformerUI.py +++ b/python/GafferSceneUI/DeformerUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( @@ -46,13 +47,13 @@ "adjustBounds" : { "description" : - """ + _(""" Adjusts bounding boxes to account for the changes made to the object. > Caution : Adjusting boundings boxes has a performance penalty. > If you do not need accurate bounds or you know that the bounds > will only change slightly, you may prefer to turn this off. - """, + """), "layout:index" : -1, diff --git a/python/GafferSceneUI/DeleteAttributesUI.py b/python/GafferSceneUI/DeleteAttributesUI.py index b18d3a6e080..fc1d41f4b5c 100644 --- a/python/GafferSceneUI/DeleteAttributesUI.py +++ b/python/GafferSceneUI/DeleteAttributesUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -46,22 +47,22 @@ GafferScene.DeleteAttributes, "description", - """ + _(""" Deletes attributes from locations within the scene. Those locations will then inherit the attribute values from ancestor locations instead, or will fall back to using the default attribute value. - """, + """), plugs = { "names" : { "description" : - """ + _(""" The names of attributes to be removed. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), "ui:scene:acceptsAttributeNames" : True, @@ -70,9 +71,9 @@ "invertNames" : { "description" : - """ + _(""" When on, matching names are kept, and non-matching names are removed. - """, + """), }, diff --git a/python/GafferSceneUI/DeleteCurvesUI.py b/python/GafferSceneUI/DeleteCurvesUI.py index 57af0af7e58..d2d24a50d63 100644 --- a/python/GafferSceneUI/DeleteCurvesUI.py +++ b/python/GafferSceneUI/DeleteCurvesUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.DeleteCurves, "description", - """ + _(""" Delete curves from a curves primitive using a primitive variable to choose the curves. - """, + """), plugs = { @@ -56,23 +57,23 @@ "curves" : { "description" : - """ + _(""" Uniformly interpolated int, float or bool primitive variable to choose which curves to delete. Note a non-zero value indicates the curve will be deleted. - """ + """) }, "invert" : { "description" : - """ + _(""" Invert the condition used to delete curves. If the primvar is zero then the curve will be deleted. - """ + """) }, "ignoreMissingVariable" : { "description" : - """ + _(""" Causes the node to do nothing if the primitive variable doesn't exist on the curves, instead of erroring. - """ + """) }, } diff --git a/python/GafferSceneUI/DeleteFacesUI.py b/python/GafferSceneUI/DeleteFacesUI.py index d873b93b6ae..a3ac3f8c2a6 100644 --- a/python/GafferSceneUI/DeleteFacesUI.py +++ b/python/GafferSceneUI/DeleteFacesUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.DeleteFaces, "description", - """ + _(""" Deletes faces from a mesh using a primitive variable to choose the faces. - """, + """), plugs = { @@ -56,23 +57,23 @@ "faces" : { "description" : - """ + _(""" Uniformly interpolated int, float or bool primitive variable to choose which faces to delete. Note a non-zero value indicates the face will be deleted. - """ + """) }, "invert" : { "description" : - """ + _(""" Invert the condition used to delete faces. If the primvar is zero then the face will be deleted. - """ + """) }, "ignoreMissingVariable" : { "description" : - """ + _(""" Causes the node to do nothing if the primitive variable doesn't exist on the curves, instead of erroring. - """ + """) }, } diff --git a/python/GafferSceneUI/DeleteGlobalsUI.py b/python/GafferSceneUI/DeleteGlobalsUI.py index 043ac5434bd..08365b63bef 100644 --- a/python/GafferSceneUI/DeleteGlobalsUI.py +++ b/python/GafferSceneUI/DeleteGlobalsUI.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -49,32 +50,32 @@ GafferScene.DeleteGlobals, "description", - """ + _(""" A node which removes named items from the globals. To delete outputs or options specifically, prefer the DeleteOutputs and DeleteOptions nodes respectively, as they provide improved interfaces for their specific tasks. - """, + """), plugs = { "names" : { "description" : - """ + _(""" The names of globals to be removed. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), }, "invertNames" : { "description" : - """ + _(""" When on, matching names are kept, and non-matching names are removed. - """, + """), }, diff --git a/python/GafferSceneUI/DeleteObjectUI.py b/python/GafferSceneUI/DeleteObjectUI.py index 9821bd103ee..04c3570c8fb 100644 --- a/python/GafferSceneUI/DeleteObjectUI.py +++ b/python/GafferSceneUI/DeleteObjectUI.py @@ -36,28 +36,29 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.DeleteObject, "description", - """ + _(""" Deletes the object at a location, keeping the location itself intact. This is most useful when a location contains an unwanted object, but the location also has children which need to be preserved. - """, + """), plugs = { "adjustBounds" : { "description" : - """ + _(""" Computes new tightened bounding boxes taking into account the removed objects. This can be an expensive operation - turn on with care. - """, + """), }, diff --git a/python/GafferSceneUI/DeleteOptionsUI.py b/python/GafferSceneUI/DeleteOptionsUI.py index c24799b1ff5..5c9a6a3156f 100644 --- a/python/GafferSceneUI/DeleteOptionsUI.py +++ b/python/GafferSceneUI/DeleteOptionsUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -46,28 +47,28 @@ GafferScene.DeleteOptions, "description", - """ + _(""" A node which removes options from the globals. - """, + """), plugs = { "names" : { "description" : - """ + _(""" The names of options to be removed. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), }, "invertNames" : { "description" : - """ + _(""" When on, matching names are kept, and non-matching names are removed. - """, + """), }, diff --git a/python/GafferSceneUI/DeleteOutputsUI.py b/python/GafferSceneUI/DeleteOutputsUI.py index b14de2f9412..bc337c33fa7 100644 --- a/python/GafferSceneUI/DeleteOutputsUI.py +++ b/python/GafferSceneUI/DeleteOutputsUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -46,28 +47,28 @@ GafferScene.DeleteOutputs, "description", - """ + _(""" A node which removes outputs from the globals. - """, + """), plugs = { "names" : { "description" : - """ + _(""" The names of outputs to be removed. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), }, "invertNames" : { "description" : - """ + _(""" When on, matching names are kept, and non-matching names are removed. - """, + """), }, diff --git a/python/GafferSceneUI/DeletePointsUI.py b/python/GafferSceneUI/DeletePointsUI.py index bb68c85638f..442018f9777 100644 --- a/python/GafferSceneUI/DeletePointsUI.py +++ b/python/GafferSceneUI/DeletePointsUI.py @@ -36,26 +36,27 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.DeletePoints, "description", - """ + _(""" Deletes points from a points primitive using a primitive variable or id list to choose the points. - """, + """), plugs = { "selectionMode" : { "description" : - """ + _(""" Chooses how to select points to delete. - VertexPrimitiveVariable : Deletes points with a non-zero value in the `points` primitive variable. - IdListPrimitiveVariable : Deletes points with Ids in the `idListVariable` primitive variable. - IdList : Deletes points with Ids in the `idList`. - """, + """), "preset:Vertex Primitive Variable" : GafferScene.DeletePoints.SelectionMode.VertexPrimitiveVariable, "preset:Id List Primitive Variable" : GafferScene.DeletePoints.SelectionMode.IdListPrimitiveVariable, "preset:Id List" : GafferScene.DeletePoints.SelectionMode.IdList, @@ -72,37 +73,37 @@ "points" : { "description" : - """ + _(""" Vertex interpolated int, float or bool primitive variable to choose which points to delete. Note a non-zero value indicates the point will be deleted. Only used when `selectionMode` is "VertexPrimitiveVariable". - """, + """), "layout:visibilityActivator" : lambda plug : plug.node()["selectionMode"].getValue() == GafferScene.DeletePoints.SelectionMode.VertexPrimitiveVariable }, "idListVariable" : { "description" : - """ + _(""" The name of a constant primitive variable holding a list of ids to delete. Must be type IntVectorData or Int64VectorData. Only used when `selectionMode` is "IdListPrimitiveVariable". - """, + """), "layout:visibilityActivator" : lambda plug : plug.node()["selectionMode"].getValue() == GafferScene.DeletePoints.SelectionMode.IdListPrimitiveVariable }, "idList" : { "description" : - """ + _(""" A list of ids to delete. Only used when `selectionMode` is "IdList". - """, + """), "layout:visibilityActivator" : lambda plug : plug.node()["selectionMode"].getValue() == GafferScene.DeletePoints.SelectionMode.IdList }, "id" : { "description" : - """ + _(""" When using an id list to delete points, this primitive variable defines the id used for each point. If this primitive variable is not found, then the index of each point is its id. - """, + """), "layout:visibilityActivator" : lambda plug : plug.node()["selectionMode"].getValue() in [ GafferScene.DeletePoints.SelectionMode.IdList, GafferScene.DeletePoints.SelectionMode.IdListPrimitiveVariable ] }, @@ -110,16 +111,16 @@ "invert" : { "description" : - """ + _(""" Invert the condition used to delete points. If the primvar is zero then the point will be deleted. - """ + """) }, "ignoreMissingVariable" : { "description" : - """ + _(""" Causes the node to do nothing if the primitive variable doesn't exist on the points, instead of erroring. - """ + """) }, } diff --git a/python/GafferSceneUI/DeletePrimitiveVariablesUI.py b/python/GafferSceneUI/DeletePrimitiveVariablesUI.py index 01a00efe71a..b5e121adeab 100644 --- a/python/GafferSceneUI/DeletePrimitiveVariablesUI.py +++ b/python/GafferSceneUI/DeletePrimitiveVariablesUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.DeletePrimitiveVariables, "description", - """ + _(""" Deletes primitive variables from objects. The primitive variables to be deleted are chosen based on name. - """, + """), ) diff --git a/python/GafferSceneUI/DeleteRenderPassesUI.py b/python/GafferSceneUI/DeleteRenderPassesUI.py index f43d043b580..6cf17513206 100644 --- a/python/GafferSceneUI/DeleteRenderPassesUI.py +++ b/python/GafferSceneUI/DeleteRenderPassesUI.py @@ -40,26 +40,27 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.DeleteRenderPasses, "description", - """ + _(""" Deletes render passes from the scene globals. - """, + """), plugs = { "mode" : { "description" : - """ + _(""" Defines how the names listed in the `names` plug are treated. Delete mode deletes the listed names. Keep mode keeps the listed names, deleting all others. - """, + """), "preset:Delete" : GafferScene.DeleteRenderPasses.Mode.Delete, "preset:Keep" : GafferScene.DeleteRenderPasses.Mode.Keep, @@ -71,12 +72,12 @@ "names" : { "description" : - """ + _(""" The names of render passes to be deleted (or kept if the mode is set to Keep). Names should be separated by spaces and may contain any of Gaffer's standard wildcards. - """, + """), "ui:scene:acceptsRenderPassNames" : True, @@ -117,7 +118,7 @@ def __passPopupMenu( menuDefinition, plugValueWidget ) : passNames = globals.get( "option:renderPass:names" ) or [] if not len( passNames ) : - menuDefinition.prepend( "/Render Passes/No Render Passes Available", { "active" : False } ) + menuDefinition.prepend( "/" + _("Render Passes") + "/" + _("No Render Passes Available"), { "active" : False } ) return for passName in reversed( sorted( list( passNames ) ) ) : diff --git a/python/GafferSceneUI/DeleteSetsUI.py b/python/GafferSceneUI/DeleteSetsUI.py index 8f833b678e2..e1139fde988 100644 --- a/python/GafferSceneUI/DeleteSetsUI.py +++ b/python/GafferSceneUI/DeleteSetsUI.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -49,18 +50,18 @@ GafferScene.DeleteSets, "description", - """ + _(""" A node which removes object sets. - """, + """), plugs = { "names" : { "description" : - """ + _(""" Space separated list of set names to be removed. - """, + """), "ui:scene:acceptsSetNames" : True, @@ -69,9 +70,9 @@ "invertNames" : { "description" : - """ + _(""" When on, matching names are kept, and non-matching names are removed. - """, + """), }, diff --git a/python/GafferSceneUI/DisplayUI.py b/python/GafferSceneUI/DisplayUI.py index c5fe2ce82c6..008b2ecb0ce 100644 --- a/python/GafferSceneUI/DisplayUI.py +++ b/python/GafferSceneUI/DisplayUI.py @@ -40,6 +40,7 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ __all__ = [] @@ -48,7 +49,7 @@ GafferScene.Display, "description", - """ + _(""" Interactively displays images as they are rendered. This node runs a server on a background thread, @@ -57,19 +58,19 @@ output to the Display node, use an Outputs node with an Interactive output configured to render to the same port as is specified on the Display node. - """, + """), plugs = { "port" : { "description" : - """ + _(""" The port number on which to run the display server. Outputs which specify this port number will appear in this node - use multiple nodes with different port numbers to receive multiple images at once. - """, + """), }, diff --git a/python/GafferSceneUI/DuplicateUI.py b/python/GafferSceneUI/DuplicateUI.py index a1c7592c945..7f7b39d6d94 100644 --- a/python/GafferSceneUI/DuplicateUI.py +++ b/python/GafferSceneUI/DuplicateUI.py @@ -39,6 +39,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -49,11 +50,11 @@ GafferScene.Duplicate, "description", - """ + _(""" Duplicates a part of the scene. The duplicates are parented alongside the original, and have a transform applied to them. - """, + """), "layout:activator:targetInUse", lambda node : not node["target"].isSetToDefault(), @@ -62,9 +63,9 @@ "parent" : { "description" : - """ + _(""" For internal use only. - """, + """), # we hide the parent (which comes from the base class) because # the value for it is computed from the target plug automatically. @@ -75,11 +76,11 @@ "target" : { "description" : - """ + _(""" The part of the scene to be duplicated. > Caution : Deprecated. Please connect a filter instead. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", # We want people to use filters rather than the `target` plug. So @@ -91,16 +92,16 @@ "copies" : { "description" : - """ + _(""" The number of copies to be made. - """, + """), }, "name" : { "description" : - """ + _(""" The name given to the copies. If this is left empty, the name from the target will be used instead. The names will have @@ -109,28 +110,28 @@ single copy is being made. Even in the case of a single copy, a suffix will be applied if necessary to keep the names unique. - """, + """), }, "transform" : { "description" : - """ + _(""" The transform to be applied to the copies. The transform is applied iteratively, so the second copy is transformed twice, the third copy is transformed three times and so on. - """, + """), }, "destination" : { "description" : - """ + _(""" The location where the copies will be placed in the output scene. The default value places them alongside the original. - """, + """), }, diff --git a/python/GafferSceneUI/EditScopeUI.py b/python/GafferSceneUI/EditScopeUI.py index 376a44834e7..879191c3b40 100644 --- a/python/GafferSceneUI/EditScopeUI.py +++ b/python/GafferSceneUI/EditScopeUI.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -196,7 +197,7 @@ def __pruneSelection( editor ) : readOnlyReason = GafferScene.EditScopeAlgo.prunedReadOnlyReason( editScope ) if readOnlyReason is not None : - GafferUI.PopupWindow.showWarning( "{} is read-only.".format( readOnlyReason ), parent = editor ) + GafferUI.PopupWindow.showWarning( _("{} is read-only.").format( readOnlyReason ), parent = editor ) return True with editor.context() : @@ -204,7 +205,7 @@ def __pruneSelection( editor ) : # to interact with processors directly. pruningProcessor = editScope.acquireProcessor( "PruningEdits", createIfNecessary = False ) if pruningProcessor is not None and not pruningProcessor["enabled"].getValue() : - GafferUI.PopupWindow.showWarning( "{} is disabled.".format( pruningProcessor.relativeName( editScope.parent() ) ), parent = editor ) + GafferUI.PopupWindow.showWarning( _("{} is disabled.").format( pruningProcessor.relativeName( editScope.parent() ) ), parent = editor ) return True ## \todo Maybe we might want to ask if we can prune a common ancestor @@ -259,7 +260,7 @@ def __editSelectionVisibility( editor, makeVisible = False ) : # to interact with processors directly. attributeEdits = editScope.acquireProcessor( "AttributeEdits", createIfNecessary = False ) if attributeEdits is not None and not attributeEdits["enabled"].getValue() : - GafferUI.PopupWindow.showWarning( "{} is disabled.".format( attributeEdits.relativeName( editScope.parent() ) ), parent = editor ) + GafferUI.PopupWindow.showWarning( _("{} is disabled.").format( attributeEdits.relativeName( editScope.parent() ) ), parent = editor ) return True with Gaffer.UndoScope( editScope.ancestor( Gaffer.ScriptNode ) ) : @@ -284,8 +285,8 @@ def __selectInvisibleAncestorsPopup( editor, ancestors ) : with GafferUI.PopupWindow() as editor.__selectInvisibleAncestorsPopup : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) : GafferUI.Image( "warningSmall.png" ) - GafferUI.Label( "

Location(s) have been unhidden, but are still not visible because they have invisible ancestors.

" ) - button = GafferUI.Button( image = "selectInvisibleAncestors.png", hasFrame = False, toolTip = "Select invisible ancestors" ) + GafferUI.Label( "

" + _("Location(s) have been unhidden, but are still not visible because they have invisible ancestors.") + "

" ) + button = GafferUI.Button( image = "selectInvisibleAncestors.png", hasFrame = False, toolTip = _("Select invisible ancestors") ) button.clickedSignal().connect( functools.partial( __selectAncestorsClicked, scriptNode = editor.scriptNode(), ancestors = ancestors ) ) editor.__selectInvisibleAncestorsPopup.popup( parent = editor ) @@ -354,7 +355,7 @@ def _summary( processor, linkCreator ) : return "None" summaries[0] = summaries[0][0].upper() + summaries[0][1:] - return " and ".join( summaries ) + return (" " + _("and") + " ").join( summaries ) GafferUI.EditScopeUI.ProcessorWidget.registerProcessorWidget( "AttributeEdits TransformEdits *LightEdits *SurfaceEdits *FilterEdits", __LocationEditsWidget ) @@ -436,7 +437,7 @@ def _summary( processor, linkCreator ) : return "None" summaries[0] = summaries[0][0].upper() + summaries[0][1:] - return " and ".join( summaries ) + return (" " + _("and") + " ").join( summaries ) GafferUI.EditScopeUI.ProcessorWidget.registerProcessorWidget( "RenderPassOptionEdits", __RenderPassOptionEditsWidget ) @@ -458,13 +459,13 @@ def _summary( processor, linkCreator ) : summaries = [] if enabledSetCount > 0 : - summaries.append( "edits to {} set{}".format( enabledSetCount, "s" if enabledSetCount > 1 else "" ) ) + summaries.append( _("edits to {} set{}").format( enabledSetCount, "s" if enabledSetCount > 1 else "" ) ) if disabledSetCount > 0 : - summaries.append( "disabled edits to {} set{}".format( disabledSetCount, "s" if disabledSetCount > 1 else "" ) ) + summaries.append( _("disabled edits to {} set{}").format( disabledSetCount, "s" if disabledSetCount > 1 else "" ) ) if not summaries : return None summaries[0] = summaries[0][0].upper() + summaries[0][1:] - return " and ".join( summaries ) + return (" " + _("and") + " ").join( summaries ) GafferUI.EditScopeUI.ProcessorWidget.registerProcessorWidget( "SetMembershipEdits", __SetMembershipEditsWidget ) diff --git a/python/GafferSceneUI/EncapsulateUI.py b/python/GafferSceneUI/EncapsulateUI.py index 17669037b12..0384ee1ee91 100644 --- a/python/GafferSceneUI/EncapsulateUI.py +++ b/python/GafferSceneUI/EncapsulateUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Encapsulate, "description", - """ + _(""" Encapsulates a portion of the scene by collapsing the hierarchy and replacing it with a procedural which will be evaluated at render time. @@ -67,6 +68,6 @@ > - The `usd:purpose` attribute is not inherited - only > attributes within the encapsulated hierarchy are > considered. - """, + """), ) diff --git a/python/GafferSceneUI/ExistenceQueryUI.py b/python/GafferSceneUI/ExistenceQueryUI.py index 1c546bf1837..0a171a171f7 100644 --- a/python/GafferSceneUI/ExistenceQueryUI.py +++ b/python/GafferSceneUI/ExistenceQueryUI.py @@ -36,33 +36,34 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ExistenceQuery, "description", - """ + _(""" Queries the existence of a specified location in a scene. - """, + """), plugs = { "scene" : { "description" : - """ + _(""" The scene to query. - """ + """) }, "location" : { "description" : - """ + _(""" The location to query for existence. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -73,9 +74,9 @@ "exists" : { "description" : - """ + _(""" Outputs true if the specified location exists, otherwise false. - """, + """), "layout:section" : "Settings.Outputs" @@ -84,9 +85,9 @@ "closestAncestor" : { "description" : - """ + _(""" Path to the closest ancestor that exists. - """, + """), "layout:section" : "Settings.Outputs" diff --git a/python/GafferSceneUI/ExternalProceduralUI.py b/python/GafferSceneUI/ExternalProceduralUI.py index 66cdbb6e952..7bc5825e92f 100644 --- a/python/GafferSceneUI/ExternalProceduralUI.py +++ b/python/GafferSceneUI/ExternalProceduralUI.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -49,18 +50,18 @@ GafferScene.ExternalProcedural, "description", - """ + _(""" References external geometry procedurals and archives. - """, + """), plugs = { "fileName" : { "description" : - """ + _(""" The path to the external procedural or archive. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -72,9 +73,9 @@ "bound" : { "description" : - """ + _(""" The bounding box of the external procedural or archive. - """, + """), }, @@ -82,9 +83,9 @@ "parameters" : { "description" : - """ + _(""" An arbitrary set of parameters to be passed to the external procedural. - """, + """), }, diff --git a/python/GafferSceneUI/FilterPlugValueWidget.py b/python/GafferSceneUI/FilterPlugValueWidget.py index 48f7e094ee3..6325352b3f6 100644 --- a/python/GafferSceneUI/FilterPlugValueWidget.py +++ b/python/GafferSceneUI/FilterPlugValueWidget.py @@ -43,6 +43,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -89,7 +90,7 @@ def _updateFromValues( self, values, exception ) : # update the selection menu text if filterNode is None : - self.__menuButton.setText( "Add..." ) + self.__menuButton.setText( _("Add...") ) elif filterNode.parent().isSame( thisNode ) : self.__menuButton.setText( filterNode.getName() ) else : @@ -147,11 +148,12 @@ def __menuDefinition( self ) : result = IECore.MenuDefinition() if filterNode is not None : - result.append( "/Remove", { "command" : Gaffer.WeakMethod( self.__removeFilter ) } ) + result.append( "/" + _("Remove"), { "command" : Gaffer.WeakMethod( self.__removeFilter ), "label" : _("Remove") } ) result.append( "/RemoveDivider", { "divider" : True } ) for filterType in self.__filterTypes() : - result.append( "/" + filterType.staticTypeName().rpartition( ":" )[2], { "command" : functools.partial( Gaffer.WeakMethod( self.__addFilter ), filterType ) } ) + typeName = IECore.CamelCase.toSpaced( filterType.staticTypeName().rpartition( ":" )[2] ) + result.append( "/" + _(typeName), { "command" : functools.partial( Gaffer.WeakMethod( self.__addFilter ), filterType ) } ) return result diff --git a/python/GafferSceneUI/FilterProcessorUI.py b/python/GafferSceneUI/FilterProcessorUI.py index 31ee72259f3..2899f6ff54a 100644 --- a/python/GafferSceneUI/FilterProcessorUI.py +++ b/python/GafferSceneUI/FilterProcessorUI.py @@ -39,15 +39,16 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.FilterProcessor, "description", - """ + _(""" The base type for all filters which operate using one or more input filters. - """, + """), plugs = { @@ -55,10 +56,10 @@ "enabled" : { "description" : - """ + _(""" The on/off state of the filter. When it is off, the result of the first input is passed through unchanged. - """, + """), }, diff --git a/python/GafferSceneUI/FilterQueryUI.py b/python/GafferSceneUI/FilterQueryUI.py index e1e959f24d7..ee741fcc526 100644 --- a/python/GafferSceneUI/FilterQueryUI.py +++ b/python/GafferSceneUI/FilterQueryUI.py @@ -36,16 +36,17 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.FilterQuery, "description", - """ + _(""" Queries a filter for a particular location in a scene and outputs the results. - """, + """), # Work around StandardNodeGadget layout bug that would # place the `filter` nodule inside the frame. @@ -56,18 +57,18 @@ "scene" : { "description" : - """ + _(""" The scene to query the filter for. - """, + """), }, "filter" : { "description" : - """ + _(""" The filter to query. - """, + """), "plugValueWidget:type" : "GafferUI.ConnectionPlugValueWidget", "noduleLayout:section" : "right", @@ -77,12 +78,12 @@ "location" : { "description" : - """ + _(""" The location within the scene to query the filter at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -93,9 +94,9 @@ "exactMatch" : { "description" : - """ + _(""" Outputs `True` if the filter matches the location, and `False` otherwise. - """, + """), "layout:section" : "Settings.Outputs" @@ -104,10 +105,10 @@ "descendantMatch" : { "description" : - """ + _(""" Outputs `True` if the filter matches a descendant of the location, and `False` otherwise. - """, + """), "layout:section" : "Settings.Outputs" @@ -116,10 +117,10 @@ "ancestorMatch" : { "description" : - """ + _(""" Outputs `True` if the filter matches an ancestor of the location, and `False` otherwise. - """, + """), "layout:section" : "Settings.Outputs" @@ -128,10 +129,10 @@ "closestAncestor" : { "description" : - """ + _(""" Outputs the location of the first ancestor matched by the filter. In the case of an exact match, this will be the location itself. - """, + """), "layout:section" : "Settings.Outputs" diff --git a/python/GafferSceneUI/FilterResultsUI.py b/python/GafferSceneUI/FilterResultsUI.py index 05f76c89cb6..b6d63d6dd7e 100644 --- a/python/GafferSceneUI/FilterResultsUI.py +++ b/python/GafferSceneUI/FilterResultsUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.FilterResults, "description", - """ + _(""" Searches an input scene for all locations matched by a filter. @@ -51,27 +52,27 @@ used. In particular it should be noted that the usage of `...` in a PathFilter will cause the entire input scene to be searched even if there are no matches to be found. - """, + """), plugs = { "scene" : { "description" : - """ + _(""" The scene to be searched for matching locations. - """, + """), }, "filter" : { "description" : - """ + _(""" The filter to be used when searching for matching locations. - """, + """), "plugValueWidget:type" : "GafferUI.ConnectionPlugValueWidget", @@ -80,9 +81,9 @@ "root" : { "description" : - """ + _(""" Isolates the search to this location and its descendants. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -93,11 +94,11 @@ "out" : { "description" : - """ + _(""" The results of the search, as an `IECore::PathMatcher` object. This is most useful for performing hierarchical queries and for iterating through the paths without an expensive conversion to strings. - """, + """), "plugValueWidget:type" : "", @@ -106,11 +107,11 @@ "outStrings" : { "description" : - """ + _(""" The results of the search, converted to a list of strings. This is useful for connecting directly to other plugs, such as `Wedge.strings` or `CollectScenes.rootNames`. - """, + """), "plugValueWidget:type" : "", diff --git a/python/GafferSceneUI/FilterUI.py b/python/GafferSceneUI/FilterUI.py index 930fe5383cd..b7d52c3bbdb 100644 --- a/python/GafferSceneUI/FilterUI.py +++ b/python/GafferSceneUI/FilterUI.py @@ -37,26 +37,27 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Filter, "description", - """ + _(""" The base type for all nodes which are capable of choosing which scene locations a FilteredSceneProcessor applies to. - """, + """), plugs = { "enabled" : { "description" : - """ + _(""" The on/off state of the filter. When it is off, the filter does not match any locations. - """, + """), "nodule:type" : "", @@ -65,10 +66,10 @@ "out" : { "description" : - """ + _(""" The result of the filter. This should be connected into the "filter" plug of a FilteredSceneProcessor. - """, + """), "plugValueWidget:type" : "", diff --git a/python/GafferSceneUI/FilteredSceneProcessorUI.py b/python/GafferSceneUI/FilteredSceneProcessorUI.py index 5b45b5dc20a..d665a837548 100644 --- a/python/GafferSceneUI/FilteredSceneProcessorUI.py +++ b/python/GafferSceneUI/FilteredSceneProcessorUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -53,20 +54,20 @@ GafferScene.FilteredSceneProcessor, "description", - """ + _(""" The base type for scene processors which use a Filter node to control which part of the scene is affected. - """, + """), plugs = { "filter" : { "description" : - """ + _(""" The filter used to control which parts of the scene are processed. A Filter node should be connected here. - """, + """), "layout:section" : "Filter", "noduleLayout:section" : "right", @@ -122,7 +123,7 @@ def appendNodeContextMenuDefinitions( graphEditor, node, menuDefinition ) : return menuDefinition.append( "/FilteredSceneProcessorDivider", { "divider" : True } ) - menuDefinition.append( "/Select Affected Objects", { "command" : functools.partial( __selectAffected, node ) } ) + menuDefinition.append( "/" + _("Select Affected Objects"), { "command" : functools.partial( __selectAffected, node ), "label" : _("Select Affected Objects") } ) ########################################################################## # NodeEditor tool menu @@ -134,4 +135,4 @@ def appendNodeEditorToolMenuDefinitions( nodeEditor, node, menuDefinition ) : return menuDefinition.append( "/FilteredSceneProcessorDivider", { "divider" : True } ) - menuDefinition.append( "/Select Affected Objects", { "command" : functools.partial( __selectAffected, node ) } ) + menuDefinition.append( "/" + _("Select Affected Objects"), { "command" : functools.partial( __selectAffected, node ), "label" : _("Select Affected Objects") } ) diff --git a/python/GafferSceneUI/FramingConstraintUI.py b/python/GafferSceneUI/FramingConstraintUI.py index 89c20dec4a0..69b7eb6fd76 100644 --- a/python/GafferSceneUI/FramingConstraintUI.py +++ b/python/GafferSceneUI/FramingConstraintUI.py @@ -38,6 +38,7 @@ import GafferUI import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -48,9 +49,9 @@ GafferScene.FramingConstraint, "description", - """ + _(""" Position a camera so that all of a target is visible. - """, + """), "layout:activator:useTargetFrame", lambda node : node["useTargetFrame"].getValue(), @@ -59,20 +60,20 @@ "targetScene" : { "description" : - """ + _(""" The scene containing the target location to which cameras are pointed. If this is unconnected, the main input scene is used instead. - """, + """), }, "target" : { "description" : - """ + _(""" The scene location to which the cameras are pointed. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "targetScene in", @@ -82,23 +83,23 @@ "ignoreMissingTarget" : { "description" : - """ + _(""" Causes the constraint to do nothing if the target location doesn't exist in the scene, instead of erroring. - """, + """), "divider" : True, }, "boundMode" : { "description" : - """ + _(""" How the camera frustum is fit to the target. `Sphere` approximates the bounding box of the target with a sphere. `Box` uses the actual bounding box, which allows framing closer, but means the camera will move closer or farther depending on the exact alignment of the box to the view ( which makes for a bumpy looking turntable ). - """, + """), "preset:Box" : "box", "preset:Sphere" : "sphere", @@ -110,37 +111,37 @@ "padding" : { "description" : - """ + _(""" Add a border between the edge of the camera frustum and the target. 0.1 adds a 10% border. Using negative padding moves the camera closer. - """, + """), }, "extendFarClip" : { "description" : - """ + _(""" If the target is larger than the current clipping planes, increase the far clipping plane to enclose it. - """, + """), "divider" : True, }, "useTargetFrame" : { "description" : - """ + _(""" Use a fixed frame to access the target at. This can be used to produce a consistent framing if the target has high-frequency animation you want to ignore. - """, + """), }, "targetFrame" : { "description" : - """ + _(""" The frame used to access the target when `useTargetFrame` is set. - """, + """), "layout:activator" : "useTargetFrame", }, diff --git a/python/GafferSceneUI/FreezeTransformUI.py b/python/GafferSceneUI/FreezeTransformUI.py index aa559d18699..dee8bcae005 100644 --- a/python/GafferSceneUI/FreezeTransformUI.py +++ b/python/GafferSceneUI/FreezeTransformUI.py @@ -36,18 +36,19 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.FreezeTransform, "description", - """ + _(""" Resets the transforms at the specified scene locations, baking the old transforms into the vertices of any child objects so that they remain the same in world space. Essentially this turns transforms in the hierarchy into rigid deformations of the objects. - """, + """), ) diff --git a/python/GafferSceneUI/GlobalShaderUI.py b/python/GafferSceneUI/GlobalShaderUI.py index e3dbb9a81ea..cda8cd03d7e 100644 --- a/python/GafferSceneUI/GlobalShaderUI.py +++ b/python/GafferSceneUI/GlobalShaderUI.py @@ -36,27 +36,28 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.GlobalShader, "description", - """ + _(""" Assigns global shaders such as background and atmosphere shaders. This node is an abstract base class, so it can not be used directly - instead use the nodes derived from it. - """, + """), plugs = { "shader" : { "description" : - """ + _(""" The shader to be assigned. This will be stored as an option within the scene globals. - """, + """), "noduleLayout:section" : "left", "nodule:type" : "GafferUI::StandardNodule", diff --git a/python/GafferSceneUI/GridUI.py b/python/GafferSceneUI/GridUI.py index 23e542c26b5..e1bad0cc4e1 100644 --- a/python/GafferSceneUI/GridUI.py +++ b/python/GafferSceneUI/GridUI.py @@ -37,36 +37,37 @@ import Gaffer import GafferScene import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Grid, "description", - """" + _("""" A grid. This is used to draw the grid in the viewer, but is also included as a node in case it might be useful, perhaps for placing a grid in renders done using the OpenGLRender node. - """, + """), plugs = { "name" : { "description" : - """ + _(""" The name of the grid. - """, + """), }, "transform" : { "description" : - """ + _(""" The transform applied to the grid. - """, + """), "layout:section" : "Transform", @@ -75,62 +76,62 @@ "dimensions" : { "description" : - """ + _(""" The size of the grid in the x and y axes. Use the transform to rotate the grid into a different plane. - """, + """), }, "spacing" : { "description" : - """ + _(""" The size of the space between adjacent lines in the grid. - """ + """) }, "gridColor" : { "description" : - """ + _(""" The colour of the lines forming the main part of the grid. - """ + """) }, "centerColor" : { "description" : - """ + _(""" The colour of the two lines forming the central cross of the grid. - """ + """) }, "borderColor" : { "description" : - """ + _(""" The colour of the lines forming the border of the grid. - """ + """) }, "gridPixelWidth" : { "description" : - """ + _(""" The width of the lines forming the main part of the grid. This width applies only to the OpenGL representation of the grid. - """ + """) }, @@ -138,22 +139,22 @@ "centerPixelWidth" : { "description" : - """ + _(""" The width of the two lines forming the central cross of the grid. This width applies only to the OpenGL representation of the grid. - """ + """) }, "borderPixelWidth" : { "description" : - """ + _(""" The width of the lines forming the border of the grid. This width applies only to the OpenGL representation of the grid. - """ + """) }, diff --git a/python/GafferSceneUI/GroupUI.py b/python/GafferSceneUI/GroupUI.py index 4a1ccdfea93..cde9340c470 100644 --- a/python/GafferSceneUI/GroupUI.py +++ b/python/GafferSceneUI/GroupUI.py @@ -37,6 +37,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -47,32 +48,32 @@ GafferScene.Group, "description", - """ + _(""" Groups together several input scenes under a new parent. If the input scenes contain locations with identical names, they are automatically renamed to make them unique in the output scene. - """, + """), plugs = { "name" : { "description" : - """ + _(""" The name of the group to be created. All the input scenes will be parented under this group. - """, + """), }, "sets" : { "description" : - """ + _(""" A list of sets to include the group in. The names should be separated by spaces. - """, + """), "layout:divider" : True, @@ -81,10 +82,10 @@ "transform" : { "description" : - """ + _(""" The transform for the group itself. This will be inherited by the objects parented under it. - """, + """), }, diff --git a/python/GafferSceneUI/HierarchyView.py b/python/GafferSceneUI/HierarchyView.py index ee796dd5c6c..d7542eeec13 100644 --- a/python/GafferSceneUI/HierarchyView.py +++ b/python/GafferSceneUI/HierarchyView.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI from . import _GafferSceneUI @@ -85,7 +86,7 @@ def __init__( self, scriptNode, **kw ) : self.__pathListing = GafferUI.PathListingWidget( GafferScene.ScenePath( self.settings()["__filteredIn"], self.context(), "/" ), columns = [ - GafferUI.PathListingWidget.StandardColumn( "Name", "name", GafferUI.PathColumn.SizeMode.Stretch ), + GafferUI.PathListingWidget.StandardColumn( _("Name"), "name", GafferUI.PathColumn.SizeMode.Stretch ), _GafferSceneUI._HierarchyViewInclusionsColumn( scriptNode ), _GafferSceneUI._HierarchyViewExclusionsColumn( scriptNode ), GafferSceneUI.Private.VisibilityColumn( self.settings()["__adaptedIn"], self.settings()["editScope"] ), @@ -198,7 +199,8 @@ def __columnContextMenuSignal( self, column, pathListing, menuDefinition ) : { "command" : Gaffer.WeakMethod( self.__copySelectedPaths ), "active" : not selection.isEmpty(), - "shortCut" : "Ctrl+C" + "shortCut" : "Ctrl+C", + "label" : _("Copy Path") if selection.size() == 1 else _("Copy Paths"), } ) menuDefinition.append( @@ -206,7 +208,8 @@ def __columnContextMenuSignal( self, column, pathListing, menuDefinition ) : { "command" : Gaffer.WeakMethod( self.__frameSelectedPaths ), "active" : not selection.isEmpty(), - "shortCut" : "F" + "shortCut" : "F", + "label" : _("Frame Selection"), } ) @@ -276,8 +279,8 @@ def __init__( self ) : button = GafferUI.MenuButton( image = "bookmarks.png", hasFrame = False, - toolTip = "Visible Set Bookmarks", - menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title = "Visible Set Bookmarks" ) + toolTip = _("Visible Set Bookmarks"), + menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title = _("Visible Set Bookmarks") ) ) GafferUI.Widget.__init__( self, button ) @@ -316,9 +319,9 @@ def __menuDefinition( self ) : "active" : not readOnly, } ) - menuDefinition.append( "/Save As/Divider", { "divider" : True } ) + menuDefinition.append( "/" + _("Save As") + "/Divider", { "divider" : True } ) else : - menuDefinition.append( "/No Bookmarks Available", { "active" : False } ) + menuDefinition.append( "/" + _("No Bookmarks Available"), { "active" : False, "label" : _("No Bookmarks Available") } ) menuDefinition.append( "/NoBookmarksDivider", { "divider" : True } ) menuDefinition.append( @@ -326,6 +329,7 @@ def __menuDefinition( self ) : { "command" : functools.partial( Gaffer.WeakMethod( self.__save ) ), "active" : not readOnly, + "label" : _("New Bookmark..."), } ) @@ -333,7 +337,7 @@ def __menuDefinition( self ) : def __save( self, *unused ) : - d = GafferUI.TextInputDialogue( initialText = "", title = "Save Bookmark", confirmLabel = "Save" ) + d = GafferUI.TextInputDialogue( initialText = "", title = _("Save Bookmark"), confirmLabel = _("Save") ) name = d.waitForText( parentWindow = self.ancestor( GafferUI.Window ) ) if not name : @@ -341,9 +345,9 @@ def __save( self, *unused ) : if name in GafferSceneUI.ScriptNodeAlgo.visibleSetBookmarks( self.ancestor( GafferUI.Editor ).scriptNode() ) : c = GafferUI.ConfirmationDialogue( - "Replace existing bookmark?", - "A bookmark named {} already exists. Do you want to replace it?".format( name ), - confirmLabel = "Replace" + _("Replace existing bookmark?"), + _("A bookmark named {} already exists. Do you want to replace it?").format( name ), + confirmLabel = _("Replace") ) if not c.waitForConfirmation( parentWindow = self.ancestor( GafferUI.Window ) ) : return diff --git a/python/GafferSceneUI/ImageScatterUI.py b/python/GafferSceneUI/ImageScatterUI.py index d538d7b6002..0daa92201a5 100644 --- a/python/GafferSceneUI/ImageScatterUI.py +++ b/python/GafferSceneUI/ImageScatterUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -48,7 +49,7 @@ GafferScene.ImageScatter, "description", - """ + _(""" Scatters points across an image, using pixel values to control the density of the points. Arbitrary image channels may be converted to additional primitive variables on the points, and point width may also be driven by an @@ -57,7 +58,7 @@ > Note : Only the area of the `displayWindow` is considered. To > include overscan pixels, use a Crop node to extend the display > window. - """, + """), plugs = { @@ -70,9 +71,9 @@ "image" : { "description" : - """ + _(""" The image used to drive the point scattering process. - """, + """), "nodule:type" : "GafferUI::StandardNodule", @@ -81,9 +82,9 @@ "view" : { "description" : - """ + _(""" The view within the image to be used by the scattering process. - """, + """), "plugValueWidget:type" : "GafferImageUI.ViewPlugValueWidget", "layout:divider" : True, @@ -93,21 +94,21 @@ "density" : { "description" : - """ + _(""" The overall density of the scattered points, defined in points per pixel. - """ + """) }, "densityChannel" : { "description" : - """ + _(""" The image channel used to modulate the density of the scattered points. Black pixels will receive no points and white pixels will receive the full amount as defined by the `density` plug. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", "channelPlugValueWidget:imagePlugName" : "image", @@ -117,7 +118,7 @@ "primitiveVariables" : { "description" : - """ + _(""" The image channels to be converted to primitive variables on the points. The chosen channels are converted using the following rules : @@ -125,7 +126,7 @@ - The main `RGB` channels are converted to a colour primitive variable called `Cs`. - `.RGB` channels are converted to a colour primitive variable called ``. - Other channels are converted to individual float primitive variables. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelMaskPlugValueWidget", @@ -134,19 +135,19 @@ "width" : { "description" : - """ + _(""" The width of the points. If `widthChannel` is used as well, then this acts as a multiplier on the channel values. - """ + """) }, "widthChannel" : { "description" : - """ + _(""" The channel used to provide per-point width values for the points. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", "channelPlugValueWidget:imagePlugName" : "image", diff --git a/python/GafferSceneUI/ImageSelectionToolUI.py b/python/GafferSceneUI/ImageSelectionToolUI.py index d1484a3e042..9e4fb14356e 100644 --- a/python/GafferSceneUI/ImageSelectionToolUI.py +++ b/python/GafferSceneUI/ImageSelectionToolUI.py @@ -39,13 +39,14 @@ import Gaffer import GafferUI import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferSceneUI.ImageSelectionTool, "description", - """ + _(""" Tool for selecting objects based on image data. Requires one of the following : - An `id` image layer with associated render manifest (enabled using the StandardOptions node). @@ -59,7 +60,7 @@ - Drag and drop selected objects - Drag to Python Editor to get their names - Drag to PathFilter or Set node to add/remove their paths - """, + """), "viewer:shortCut", "Q", "order", 1, @@ -89,18 +90,18 @@ "selectMode" : { "description" : - """ + _(""" The standard mode selects locations based on an `id` layer with a corresponding manifest. `Instance` mode instead picks instance ids based on an `instanceID` layer ( this will only contain information for encapsulated instancers, which don't pass multiple locations to the renderer, but do set up special instance id information ). - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Standard" : "standard", "preset:Instance" : "instance", - "label" : "Select", + "label" : _("Select"), "toolbarLayout:section" : "Bottom", "toolbarLayout:width" : 80, diff --git a/python/GafferSceneUI/ImageToPointsUI.py b/python/GafferSceneUI/ImageToPointsUI.py index 6c39e374c43..093163ae390 100644 --- a/python/GafferSceneUI/ImageToPointsUI.py +++ b/python/GafferSceneUI/ImageToPointsUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -48,7 +49,7 @@ GafferScene.ImageToPoints, "description", - """ + _(""" Converts an image into a points primitive, with a point for each pixel in the image. Point positions may be defined either by the original pixel coordinates or an image layer providing position data. @@ -59,7 +60,7 @@ > Note : Only pixels within the display window are converted. To > include overscan pixels, use a Crop node to extend the display > window. - """, + """), plugs = { @@ -72,9 +73,9 @@ "image" : { "description" : - """ + _(""" The image to be converted into a points primitive. - """, + """), "nodule:type" : "GafferUI::StandardNodule", @@ -83,9 +84,9 @@ "view" : { "description" : - """ + _(""" The view within the image to be converted. - """, + """), "plugValueWidget:type" : "GafferImageUI.ViewPlugValueWidget", "layout:divider" : True, @@ -95,10 +96,10 @@ "position" : { "description" : - """ + _(""" The image channels used to provide 3d positions for the points. If `None`, the pixel's 2d position within the image is used instead. - """, + """), "plugValueWidget:type" : "GafferImageUI.RGBAChannelsPlugValueWidget", "rgbaChannelsPlugValueWidget:allowNone" : True, @@ -108,7 +109,7 @@ "primitiveVariables" : { "description" : - """ + _(""" The image channels to be converted to primitive variables on the points primitive. The chosen channels are converted using the following rules : @@ -116,7 +117,7 @@ - The main `RGB` channels are converted to a colour primitive variable called `Cs`. - `.RGB` channels are converted to a colour primitive variable called ``. - Other channels are converted to individual float primitive variables. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelMaskPlugValueWidget", @@ -125,19 +126,19 @@ "width" : { "description" : - """ + _(""" The width of the points. If `widthChannel` is used as well, then this acts as a multiplier on the channel values. - """ + """) }, "widthChannel" : { "description" : - """ + _(""" The channel used to provide per-point width values for the points primitive. - """, + """), "plugValueWidget:type" : "GafferImageUI.ChannelPlugValueWidget", "channelPlugValueWidget:imagePlugName" : "image", @@ -150,20 +151,20 @@ "ignoreTransparent" : { "description" : - """ + _(""" Omits pixels from the points primitive if their alpha value is less than or equal to `alphaThreshold`. - """, + """), }, "alphaThreshold" : { "description" : - """ + _(""" Threshold used to exclude pixels from the points primitive when `ignoreTransparent` is on. - """, + """), "layout:activator" : lambda plug : plug.node()["ignoreTransparent"].getValue() diff --git a/python/GafferSceneUI/InstancerUI.py b/python/GafferSceneUI/InstancerUI.py index fb624151251..16765e48d22 100644 --- a/python/GafferSceneUI/InstancerUI.py +++ b/python/GafferSceneUI/InstancerUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ # Similar to CompoundDataPlugValueWidget, but different enough that the code can't be shared class _ContextVariableListWidget( GafferUI.PlugValueWidget ) : @@ -267,7 +268,7 @@ def __init__( self, headings, toolTipOverride = "" ) : GafferScene.Instancer, "description", - """ + _(""" Copies from an input scene onto the vertices of a target object, making one copy per vertex. Additional vertex primitive variables on the target object can be used to choose between @@ -281,7 +282,7 @@ def __init__( self, headings, toolTipOverride = "" ) : > supported wherever a variable with `Vertex` interpolation > is expected, provided that the primitive variable has the > same size as the equivalent `Vertex` variable. - """, + """), "layout:section:Settings.General:collapsed", False, "layout:section:Settings.Transforms:collapsed", False, @@ -346,11 +347,11 @@ def __init__( self, headings, toolTipOverride = "" ) : "parent" : { "description" : - """ + _(""" Using the `parent` plug to select the source is now deprecated, please use a filter instead. This plug is still supported for backwards compatibility, but is incompatible with recent features, like accurately reporting variation counts. - """, + """), "layout:section" : "Settings.General", @@ -359,11 +360,11 @@ def __init__( self, headings, toolTipOverride = "" ) : "name" : { "description" : - """ + _(""" The name of the location the instances will be generated below. This will be parented directly under the parent location. - """, + """), "layout:section" : "Settings.General", @@ -372,7 +373,7 @@ def __init__( self, headings, toolTipOverride = "" ) : "prototypes" : { "description" : - """ + _(""" The scene containing the prototypes to be applied to each vertex. Use the `prototypeMode` and associated plugs to control the mapping between prototypes and @@ -380,7 +381,7 @@ def __init__( self, headings, toolTipOverride = "" ) : Note that the prototypes are not limited to being a single object - they can have arbitrary child hierarchies. - """, + """), "plugValueWidget:type" : "", @@ -389,7 +390,7 @@ def __init__( self, headings, toolTipOverride = "" ) : "prototypeMode" : { "description" : - """ + _(""" The method used to define how the prototypes map onto each instance. @@ -413,7 +414,7 @@ def __init__( self, headings, toolTipOverride = "" ) : > Note : it is advisable to provide an indexed string array in order to limit the number of unique prototypes. - """, + """), "preset:Indexed (Roots List)" : GafferScene.Instancer.PrototypeMode.IndexedRootsList, "preset:Indexed (Roots Variable)" : GafferScene.Instancer.PrototypeMode.IndexedRootsVariable, @@ -426,12 +427,12 @@ def __init__( self, headings, toolTipOverride = "" ) : "prototypeIndex" : { "description" : - """ + _(""" The name of a per-vertex integer primitive variable used to determine which prototype is applied to the vertex. This plug is used in "Indexed (Roots List)" mode as well as "Indexed (Roots Variable)" mode. - """, + """), "userDefault" : "prototypeIndex", "layout:section" : "Prototypes", @@ -442,7 +443,7 @@ def __init__( self, headings, toolTipOverride = "" ) : "prototypeRoots" : { "description" : - """ + _(""" If `prototypeMode` is set to "Indexed (Roots Variable)", then this should specify the name of a constant string array primitive variable used to map between `prototypeIndex` @@ -454,7 +455,7 @@ def __init__( self, headings, toolTipOverride = "" ) : for each instance. This plug is not used in "Indexed (Roots List)" mode. - """, + """), "layout:section" : "Prototypes", "layout:visibilityActivator" : "modeIsNotIndexedRootsList", @@ -464,11 +465,11 @@ def __init__( self, headings, toolTipOverride = "" ) : "prototypeRootsList" : { "description" : - """ + _(""" An explicit list of paths used to map between `prototypeIndex` and paths in the prototypes scene. This plug is only used in "Indexed (Roots List)" mode. - """, + """), "layout:section" : "Prototypes", "layout:visibilityActivator" : "modeIsIndexedRootsList", @@ -478,13 +479,13 @@ def __init__( self, headings, toolTipOverride = "" ) : "id" : { "description" : - """ + _(""" The name of a per-vertex integer primitive variable used to give each instance a unique identity. This is useful when points are added and removed over time, as is often the case in a particle simulation. The id is used to name the instance in the output scene. - """, + """), "layout:section" : "Settings.General", @@ -493,11 +494,11 @@ def __init__( self, headings, toolTipOverride = "" ) : "omitDuplicateIds" : { "description" : - """ + _(""" When off, having the same ids on multiple points is considered an error. Setting on will allow a render to proceed, with all instances that share an id being omitted. - """, + """), "layout:section" : "Settings.General", @@ -508,10 +509,10 @@ def __init__( self, headings, toolTipOverride = "" ) : "position" : { "description" : - """ + _(""" The name of the per-vertex primitive variable used to specify the position of each instance. - """, + """), "layout:section" : "Settings.Transforms", @@ -520,13 +521,13 @@ def __init__( self, headings, toolTipOverride = "" ) : "orientation" : { "description" : - """ + _(""" The name of the per-vertex primitive variable used to specify the orientation of each instance. This must be provided as a quaternion : use an upstream Orientation node to convert from other representations before instancing. - """, + """), "userDefault" : "orientation", "layout:section" : "Settings.Transforms", @@ -536,12 +537,12 @@ def __init__( self, headings, toolTipOverride = "" ) : "scale" : { "description" : - """ + _(""" The name of the per-vertex primitive variable used to specify the scale of each instance. Scale can be provided as a float for uniform scaling, or as a vector to define different scaling in each axis. - """, + """), "userDefault" : "scale", "layout:section" : "Settings.Transforms", @@ -551,14 +552,14 @@ def __init__( self, headings, toolTipOverride = "" ) : "inactiveIds" : { "description" : - """ + _(""" A space separated list of names of primitive variables specifying instances to make inactive. Inactive instances are not output from the instancer or rendered. Each primitive variable either must be a constant vector of type Int or Int64 with a list of matching ids to deactivate, or it must be a vertex bool primitive variable, in which case it will deactivate the instance for the corresponding vertex if the value is true. - """, + """), # This user default will pick up any of the standard USD ways of controlling this. "userDefault" : "inactiveIds invisibleIds", @@ -570,12 +571,12 @@ def __init__( self, headings, toolTipOverride = "" ) : "attributes" : { "description" : - """ + _(""" The names of per-vertex primitive variables to be turned into per-instance attributes. Names should be separated by spaces and can use Gaffer's standard wildcards. - """, + """), "layout:section" : "Settings.Attributes", @@ -584,10 +585,10 @@ def __init__( self, headings, toolTipOverride = "" ) : "attributePrefix" : { "description" : - """ + _(""" A prefix added to all per-instance attributes specified via the \"attributes\" plug. - """, + """), "userDefault" : "user:", "layout:section" : "Settings.Attributes", @@ -597,7 +598,7 @@ def __init__( self, headings, toolTipOverride = "" ) : "encapsulate" : { "description" : - """ + _(""" Converts instances into a capsule, which won't be expanded until you Unencapsulate or render. When keeping these locations encapsulated, downstream nodes can't see the @@ -610,7 +611,7 @@ def __init__( self, headings, toolTipOverride = "" ) : - Fewer unnecessary updates during interactive rendering. - Faster performance in renderer backends with special instancer capsule support ( ie. Arnold ) - """, + """), "layout:section" : "Settings.Encapsulation", @@ -618,21 +619,21 @@ def __init__( self, headings, toolTipOverride = "" ) : "seedEnabled" : { "description" : - """ + _(""" Creates a seed context variable based on a hash of the instance ID, which could come from the primitive varable specified in the `id` plug or otherwise the point index. This integer is available to the upstream prototypes network, and might typically be used with a Random node to randomise properties of the prototype. - """, + """), "layout:section" : "Context Variations", "layout:index" : 101, }, "seedVariable" : { "description" : - """ + _(""" Name of the context variable to put the seed value in. - """, + """), "layout:section" : "Context Variations", "layout:index" : 102, "layout:visibilityActivator" : "seedEnabled", @@ -640,10 +641,10 @@ def __init__( self, headings, toolTipOverride = "" ) : "seeds" : { "description" : - """ + _(""" The number of possible seed values. Increasing this allows for more different variations to be driven by the seed, increasing the total number of variations required. - """, + """), "layout:section" : "Context Variations", "layout:index" : 103, "layout:visibilityActivator" : "seedEnabled", @@ -652,10 +653,10 @@ def __init__( self, headings, toolTipOverride = "" ) : "seedPermutation" : { "description" : - """ + _(""" Changing the seedPermutation changes the mapping of ids to seeds. This results in a different grouping of which instances end up with the same seed. - """, + """), "layout:section" : "Context Variations", "layout:index" : 104, "layout:visibilityActivator" : "seedEnabled", @@ -664,12 +665,12 @@ def __init__( self, headings, toolTipOverride = "" ) : "rawSeed" : { "description" : - """ + _(""" Enable this in rare cases when it is required to pass through every single id directly into the seed context variable. This is very expensive, because every single instance will need a separate context, but is sometimes useful, and may be an acceptable cost if there isn't a huge number of total instances. - """, + """), "layout:section" : "Context Variations", "layout:index" : 105, "layout:visibilityActivator" : "seedEnabled", @@ -677,12 +678,12 @@ def __init__( self, headings, toolTipOverride = "" ) : "contextVariables" : { "description" : - """ + _(""" Specifies context variables to be created from primitive variables. These variables are available to upstream prototypes network, allowing the prototypes scene to be generated differently depending on the source point. Supports quantization to avoid re-evaluating the prototypes scene too many times. - """, + """), "layout:section" : "Context Variations", "layout:index" : 106, "plugValueWidget:type" : "GafferSceneUI.InstancerUI._ContextVariableListWidget", @@ -694,56 +695,56 @@ def __init__( self, headings, toolTipOverride = "" ) : "contextVariables.*.name" : { "description" : - """ + _(""" Name of the primitive variable to read. The same name will be used for the context variables available to the upstream prototype network. - """, + """), }, "contextVariables.*.enabled" : { "description" : - """ + _(""" Puts this variable in the context for the upstream prototypes network. - """, + """), }, "contextVariables.*.quantize" : { "description" : - """ + _(""" Quantizing to a large interval reduces the number of variations created. For example, if the primvar varies from 0 to 1, and you quantize to 0.2, then only 6 unique variations will be created, even if there are millions of instances. This dramatically improves performance, but if you need to see more continuous changes in the primvar values, you will need to reduce quantize, or in extreme cases where you need full accuracy and don't care about performance, set it to 0. - """, + """), }, "timeOffset" : { "description" : - "Modify the current time when evaluating the prototypes network, by adding a primvar.", + _("Modify the current time when evaluating the prototypes network, by adding a primvar."), "layout:section" : "Context Variations", "layout:index" : 107, "plugValueWidget:type" : "GafferSceneUI.InstancerUI._TimeOffsetContextVariableWidget", }, "timeOffset.name" : { "description" : - """ + _(""" Name of a primitive variable to add to the time. Must be a float or int primvar. It will be treated as a number of frames, and can be negative or positive to adjust time forward or back. - """, + """), }, "timeOffset.enabled" : { "description" : - """ + _(""" Modifies the current time for the network upstream of the prototypes plug. - """, + """), }, "timeOffset.quantize" : { "description" : - """ + _(""" Quantizes the variable value before adding it to the time. Quantizing to a large interval reduces the number of variations created. For example, if the primvar varies from 0 to 1, and you quantize to 0.2, then only 6 unique variations will be created, even if there are millions of instances. This dramatically improves performance, but if you need to see more continuous changes in the primvar values, you will need to reduce quantize, or in extreme cases where you need full accuracy and don't care about performance, set it to 0. - """, + """), }, "variations" : { "description" : - """ + _(""" This special output plug returns an CompoundData dictionary with counts about how many variations are being created. For each context variable variable being set ( including "frame" when using Time Offset ), there is an entry with the name of the context variable, @@ -757,7 +758,7 @@ def __init__( self, headings, toolTipOverride = "" ) : extra evaluations of the `prototypes` scene, and can dramatically increase the cost of the Instancer. Note that variations are measured across all locations in the scene where the instancer is filtered. - """, + """), "layout:section" : "Context Variations", "layout:index" : 108, "plugValueWidget:type" : "GafferSceneUI.InstancerUI._TotalCountWidget", diff --git a/python/GafferSceneUI/InteractiveRenderUI.py b/python/GafferSceneUI/InteractiveRenderUI.py index 673f002967d..d376d93b145 100644 --- a/python/GafferSceneUI/InteractiveRenderUI.py +++ b/python/GafferSceneUI/InteractiveRenderUI.py @@ -43,6 +43,7 @@ import GafferScene import GafferSceneUI import GafferUI +from GafferUI.i18n import _ import GafferImageUI from GafferUI.PlugValueWidget import sole @@ -95,7 +96,7 @@ def __init__( self, view, **kwargs ) : with self.__frame : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) : GafferUI.Spacer( imath.V2i( 1, 1 ), imath.V2i( 1, 1 ) ) - self.__label = GafferUI.Label( "Render" ) + self.__label = GafferUI.Label( _("Render") ) self.__stateWidget = _StatePlugValueWidget( None ) self.__messagesWidget = _MessageSummaryPlugValueWidget( None ) @@ -315,7 +316,7 @@ def messageWidget( self ) : def __updateTitle( self, *unused ) : plug = self.getChild().getPlug() - self.setTitle( "{} Messages".format( plug.node().relativeName( plug.ancestor( Gaffer.ScriptNode ) ) ) ) + self.setTitle( _("{} Messages").format( plug.node().relativeName( plug.ancestor( Gaffer.ScriptNode ) ) ) ) def __destroy( self, *unused ) : @@ -380,10 +381,10 @@ def _updateFromValues( self, values, exception ) : GafferScene.InteractiveRender, "description", - """ + _(""" Performs interactive renders, updating the render on the fly whenever the input scene changes. - """, + """), "layout:section:Settings.Log:collapsed", False, @@ -398,9 +399,9 @@ def _updateFromValues( self, values, exception ) : "in" : { "description" : - """ + _(""" The scene to be rendered. - """, + """), "nodule:type" : "GafferUI::StandardNodule", @@ -409,14 +410,14 @@ def _updateFromValues( self, values, exception ) : "renderer" : { "description" : - """ + _(""" The renderer to use. Default mode uses the `render:defaultRenderer` option from the input scene globals to choose the renderer. This can be authored using the StandardOptions node. > Note : Changing renderer currently requires that the current render is > manually stopped and restarted. - """, + """), "plugValueWidget:type" : "GafferSceneUI.RenderUI.RendererPlugValueWidget", @@ -435,11 +436,11 @@ def _updateFromValues( self, values, exception ) : "state" : { "description" : - """ + _(""" Turns the rendering on and off, or pauses it. - """, + """), - "label" : "Render", + "label" : _("Render"), "plugValueWidget:type" : "GafferSceneUI.InteractiveRenderUI._StatePlugValueWidget", }, @@ -447,10 +448,10 @@ def _updateFromValues( self, values, exception ) : "resolvedRenderer" : { "description" : - """ + _(""" The renderer that will be used, accounting for the value of the `render:defaultRenderer` option if `renderer` is set to "Default". - """, + """), "layout:section" : "Advanced", @@ -459,11 +460,11 @@ def _updateFromValues( self, values, exception ) : "messages" : { "description" : - """ + _(""" Messages from the render process. - """, + """), - "label" : "Messages", + "label" : _("Messages"), "plugValueWidget:type" : "GafferSceneUI.InteractiveRenderUI._MessagesPlugValueWidget", "layout:section" : "Settings.Log" @@ -472,9 +473,9 @@ def _updateFromValues( self, values, exception ) : "out" : { "description" : - """ + _(""" A direct pass-through of the input scene. - """, + """), }, diff --git a/python/GafferSceneUI/IsolateUI.py b/python/GafferSceneUI/IsolateUI.py index d9db043cceb..2ed3c157764 100644 --- a/python/GafferSceneUI/IsolateUI.py +++ b/python/GafferSceneUI/IsolateUI.py @@ -39,6 +39,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -49,7 +50,7 @@ GafferScene.Isolate, "description", - """ + _(""" Isolates objects by removing paths not matching a filter from the scene. > Caution : The Isolate node does not work well with the `...` wildcard in @@ -63,17 +64,17 @@ > alternative would be to search the scene recursively looking for a true > match, but this would defeat the goal of lazy evaluation and could cause > poor performance. - """, + """), plugs = { "from" : { "description" : - """ + _(""" The ancestor to isolate the objects from. Only locations below this will be removed. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", @@ -82,35 +83,35 @@ "keepLights" : { "description" : - """ + _(""" Keeps all lights and light filters, regardless of other settings. This is useful when isolating an asset but wanting to render it using a light rig located elsewhere in the scene. - """, + """), }, "keepCameras" : { "description" : - """ + _(""" Keeps all cameras, regardless of other settings. This is useful when isolating an asset but wanting to render it through a camera located elsewhere in the scene. - """, + """), }, "adjustBounds" : { "description" : - """ + _(""" By default, the bounding boxes of ancestor locations are automatically updated when children are removed. This can be turned off if necessary to get improved performance - in this case the bounding boxes will still wholly contain the contents at each location, but may be bigger than necessary. - """, + """), }, diff --git a/python/GafferSceneUI/LightEditor.py b/python/GafferSceneUI/LightEditor.py index a5e53a027f2..87907e6763f 100644 --- a/python/GafferSceneUI/LightEditor.py +++ b/python/GafferSceneUI/LightEditor.py @@ -44,13 +44,62 @@ import Gaffer import GafferUI +from GafferUI.i18n import _, translateLabel import GafferScene import GafferSceneUI from . import _GafferSceneUI +from .SetEditor import _TranslatedColumn from Qt import QtWidgets +class _TranslatedCellColumn( GafferUI.PathColumn ) : + """Wraps an InspectorColumn to translate string cell values for display.""" + + def __init__( self, column ) : + + GafferUI.PathColumn.__init__( self ) + self._inner = column + self._inner.changedSignal().connect( Gaffer.WeakMethod( self.__innerChanged ) ) + + def cellData( self, path, canceller = None ) : + + d = self._inner.cellData( path, canceller ) + if d.value is not None and isinstance( d.value, str ) : + translated = translateLabel( d.value ) + if translated != d.value : + return GafferUI.PathColumn.CellData( + value = translated, icon = d.icon, + background = d.background, toolTip = d.toolTip + ) + return d + + def headerData( self, canceller = None ) : + + return self._inner.headerData( canceller ) + + def inspect( self, path ) : + + if hasattr( self._inner, "inspect" ) : + return self._inner.inspect( path ) + return None + + def inspector( self, path ) : + + if hasattr( self._inner, "inspector" ) : + return self._inner.inspector( path ) + return None + + def inspectorContext( self, path ) : + + if hasattr( self._inner, "inspectorContext" ) : + return self._inner.inspectorContext( path ) + return None + + def __innerChanged( self, column ) : + + self.changedSignal()( self ) + class LightEditor( GafferSceneUI.SceneEditor ) : class Settings( GafferSceneUI.SceneEditor.Settings ) : @@ -82,20 +131,23 @@ def __init__( self, scriptNode, **kw ) : GafferSceneUI.SceneEditor.__init__( self, column, scriptNode, **kw ) self.__commonColumns = [ - _GafferSceneUI._LightEditorLocationNameColumn(), + _TranslatedColumn( _GafferSceneUI._LightEditorLocationNameColumn(), "Name" ), GafferSceneUI.Private.VisibilityColumn( self.settings()["__adaptedIn"], self.settings()["editScope"] ), - _GafferSceneUI._LightEditorMuteColumn( - self.settings()["__adaptedIn"], - self.settings()["editScope"] + _TranslatedColumn( + _GafferSceneUI._LightEditorMuteColumn( + self.settings()["__adaptedIn"], + self.settings()["editScope"] + ), + "Mute" ), _GafferSceneUI._LightEditorSetMembershipColumn( self.settings()["__adaptedIn"], self.settings()["editScope"], "soloLights", - "Solo" + _("Solo") ), ] @@ -150,6 +202,13 @@ def sceneListing( self ) : return self.__pathListing + @classmethod + def __parameterDisplayName( cls, paramName ) : + + name = paramName.split( ":" )[-1] if ":" in paramName else paramName + spaced = IECore.CamelCase.toSpaced( name ) + return " ".join( word.capitalize() for word in spaced.replace( "_", " " ).split() ) + @classmethod def __parseParameter( cls, parameter ) : @@ -171,13 +230,14 @@ def __parseParameter( cls, parameter ) : def registerParameter( cls, rendererKey, parameter, section = None, columnName = None ) : parameter = cls.__parseParameter( parameter ) + displayName = columnName if columnName is not None else cls.__parameterDisplayName( parameter.name ) GafferSceneUI.LightEditor.registerColumn( rendererKey, ".".join( x for x in [ parameter.shader, parameter.name ] if x ), lambda scene, editScope : GafferSceneUI.Private.InspectorColumn( GafferSceneUI.Private.ParameterInspector( scene, editScope, rendererKey, parameter ), - columnName if columnName is not None else "" + _(displayName) ), section ) @@ -190,6 +250,7 @@ def registerParameter( cls, rendererKey, parameter, section = None, columnName = def registerShaderParameter( cls, rendererKey, parameter, shaderAttribute = None, section = None, columnName = None ) : parameter = cls.__parseParameter( parameter ) + displayName = columnName if columnName is not None else cls.__parameterDisplayName( parameter.name ) shaderAttribute = shaderAttribute if shaderAttribute is not None else rendererKey @@ -198,7 +259,7 @@ def registerShaderParameter( cls, rendererKey, parameter, shaderAttribute = None ".".join( x for x in [ parameter.shader, parameter.name ] if x ), lambda scene, editScope : GafferSceneUI.Private.InspectorColumn( GafferSceneUI.Private.ParameterInspector( scene, editScope, shaderAttribute, parameter ), - columnName if columnName is not None else "" + _(displayName) ), section ) @@ -206,13 +267,15 @@ def registerShaderParameter( cls, rendererKey, parameter, shaderAttribute = None @classmethod def registerAttribute( cls, rendererKey, attributeName, section = None ) : - displayName = attributeName.split( ':' )[-1] + displayName = cls.__parameterDisplayName( attributeName.split( ':' )[-1] ) GafferSceneUI.LightEditor.registerColumn( rendererKey, attributeName, - lambda scene, editScope : GafferSceneUI.Private.InspectorColumn( - GafferSceneUI.Private.AttributeInspector( scene, editScope, attributeName ), - displayName + lambda scene, editScope : _TranslatedCellColumn( + GafferSceneUI.Private.InspectorColumn( + GafferSceneUI.Private.AttributeInspector( scene, editScope, attributeName ), + _(displayName) + ) ), section ) @@ -332,7 +395,7 @@ def __selectLinked (self, *unused ) : context = self.context() - dialogue = GafferUI.BackgroundTaskDialogue( "Selecting Linked Objects" ) + dialogue = GafferUI.BackgroundTaskDialogue( _("Selecting Linked Objects") ) # There may be multiple columns with a selection, but we only operate on the name column. selectedLights = self.__pathListing.getSelection()[0] @@ -421,7 +484,7 @@ def __init__( self, plug, **kw ) : def _updateFromValues( self, values, exception ) : text = values[0] - text = "Main" if text == "" else text + text = _("Main") if text == "" else _(text) for i in range( 0, self._qtWidget().count() ) : if self._qtWidget().tabText( i ) == text : try : @@ -437,10 +500,10 @@ def __currentChanged( self, index ) : return index = self._qtWidget().currentIndex() - text = self._qtWidget().tabText( index ) + originalSection = self._qtWidget().tabData( index ) with self._blockedUpdateFromValues() : self.getPlug().setValue( - text if text != "Main" else "" + originalSection if originalSection else "" ) def __updateTabs( self ) : @@ -455,7 +518,8 @@ def __updateTabs( self ) : for rendererKey, sections in LightEditor._LightEditor__columnRegistry.items() : if IECore.StringAlgo.match( attribute, rendererKey ) : for section in sections.keys() : - self._qtWidget().addTab( section or "Main" ) + idx = self._qtWidget().addTab( _(section) if section else _("Main") ) + self._qtWidget().setTabData( idx, section or "" ) finally : self.__ignoreCurrentChanged = False diff --git a/python/GafferSceneUI/LightFilterUI.py b/python/GafferSceneUI/LightFilterUI.py index c363b6bc2c8..9355ba24d9c 100644 --- a/python/GafferSceneUI/LightFilterUI.py +++ b/python/GafferSceneUI/LightFilterUI.py @@ -40,6 +40,7 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ def __parameterUserDefault( plug ) : @@ -70,9 +71,9 @@ def __parameterUserDefault( plug ) : GafferScene.LightFilter, "description", - """ + _(""" Creates a scene with a single light filter in it. - """, + """), plugs = { @@ -85,11 +86,11 @@ def __parameterUserDefault( plug ) : "filteredLights" : { "description" : - """ + _(""" The lights that are being filtered. Accepts a SetExpression. You might want to set it to 'defaultLights' to have the filter affect all lights that haven't been excluded from that set. - """, + """), "layout:index" : 1, }, @@ -104,9 +105,9 @@ def __parameterUserDefault( plug ) : "parameters" : { "description" : - """ + _(""" The parameters of the light filter shader - these will vary based on the type. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "nodule:type" : "GafferUI::CompoundNodule", @@ -148,7 +149,7 @@ def __parameterMetadata( plug, key ) : for key in [ "description", - "label", + _("label"), "noduleLayout:label", "layout:divider", "layout:section", diff --git a/python/GafferSceneUI/LightPositionToolUI.py b/python/GafferSceneUI/LightPositionToolUI.py index b4911ca75ec..903347aac37 100644 --- a/python/GafferSceneUI/LightPositionToolUI.py +++ b/python/GafferSceneUI/LightPositionToolUI.py @@ -41,13 +41,14 @@ import Gaffer import GafferUI import GafferSceneUI +from GafferUI.i18n import _ def __toolTip( tool ) : mode = tool["mode"].getValue() result = None if mode == GafferSceneUI.LightPositionTool.Mode.Shadow : - result = "Hold 'Shift' + 'V' to place shadow pivot\nHold 'V' to place shadow target" + result = "Hold 'Shift' + 'V' to place shadow pivot" + "\n" + "Hold 'V' to place shadow target" elif mode == GafferSceneUI.LightPositionTool.Mode.Highlight : result = "Hold 'V' to place highlight target" else : @@ -60,9 +61,9 @@ def __toolTip( tool ) : GafferSceneUI.LightPositionTool, "description", - """ + _(""" Tool for placing lights. - """, + """), "viewer:shortCut", "D", "order", 7, @@ -75,14 +76,14 @@ def __toolTip( tool ) : "mode" : { "description" : - """ + _(""" The method to use for placing the light. - Shadow : Places the light so that it casts a shadow from the pivot point onto the target point. - Highlight : Places the light so that it creates a specular highlight at the target point. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", diff --git a/python/GafferSceneUI/LightToCameraUI.py b/python/GafferSceneUI/LightToCameraUI.py index ada0faedb5e..7b830718d8b 100644 --- a/python/GafferSceneUI/LightToCameraUI.py +++ b/python/GafferSceneUI/LightToCameraUI.py @@ -36,17 +36,18 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.LightToCamera, "description", - """ + _(""" Converts lights into cameras. Spotlights are converted to a perspective camera with the field of view matching the cone angle, and distant lights are converted to an orthographic camera. - """, + """), plugs = { @@ -62,30 +63,30 @@ "distantAperture" : { "description" : - """ + _(""" The orthographic aperture used when converting distant lights ( which are theoretically infinite in extent ) - """, + """), }, "clippingPlanes" : { "description" : - """ + _(""" Clipping planes for the created cameras. When creating a perspective camera, a near clip <= 0 is invalid, and will be replaced with 0.01. Also, certain lights only start casting light at some distance - if near clip is less than this, it will be increased. - """, + """), }, "filter" : { "description" : - """ + _(""" Specifies which lights to convert. - """, + """), }, } diff --git a/python/GafferSceneUI/LightToolUI.py b/python/GafferSceneUI/LightToolUI.py index 5afbcf1bc99..c96faa86b21 100644 --- a/python/GafferSceneUI/LightToolUI.py +++ b/python/GafferSceneUI/LightToolUI.py @@ -42,15 +42,16 @@ import Gaffer import GafferUI import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferSceneUI.LightTool, "description", - """ + _(""" Tool for editing light shapes, such as spot light cones or quad light width and height. - """, + """), "viewer:shortCut", "A", "order", 6, diff --git a/python/GafferSceneUI/LightUI.py b/python/GafferSceneUI/LightUI.py index 30b247a0bad..f69f6e4ceee 100644 --- a/python/GafferSceneUI/LightUI.py +++ b/python/GafferSceneUI/LightUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -80,9 +81,9 @@ def __parameterMetadata( plug, key ) : GafferScene.Light, "description", - """ + _(""" Creates a scene with a single light in it. - """, + """), plugs = { @@ -95,11 +96,11 @@ def __parameterMetadata( plug, key ) : "attributes" : { "description" : - """ + _(""" Arbitrary attributes which are applied to the light. Typical uses include setting renderer specific visibility attributes to hide the shape from the camera. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -125,9 +126,9 @@ def __parameterMetadata( plug, key ) : "parameters" : { "description" : - """ + _(""" The parameters of the light shader - these will vary based on the light type. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "nodule:type" : "GafferUI::CompoundNodule", @@ -171,12 +172,12 @@ def __parameterMetadata( plug, key ) : "defaultLight" : { "description" : - """ + _(""" Whether this light illuminates all geometry by default. When toggled, the light will be added to the \"defaultLights\" set, which can be referenced in set expressions and manipulated by downstream nodes. - """, + """), "layout:section" : "Light Linking", @@ -185,10 +186,10 @@ def __parameterMetadata( plug, key ) : "mute" : { "description" : - """ + _(""" Whether this light is muted. When toggled, the attribute \"light:mute\" will be set to true. When not toggled, it will be omitted from the attributes. - """, + """), "layout:section" : "Light Linking", "nameValuePlugPlugValueWidget:ignoreNamePlug" : True, @@ -197,9 +198,9 @@ def __parameterMetadata( plug, key ) : "visualiserAttributes" : { "description" : - """ + _(""" Attributes that affect the visualisation of this Light in the Viewer. - """, + """), "layout:section" : "Visualisation", "compoundDataPlugValueWidget:editable" : False, @@ -218,31 +219,31 @@ def __parameterMetadata( plug, key ) : "visualiserAttributes.lightDrawingMode" : { "description" : - """ + _(""" Controls how lights are presented in the Viewer. - """, + """), - "label" : "Light Drawing Mode", + "label" : _("Light Drawing Mode"), }, "visualiserAttributes.maxTextureResolution" : { "description" : - """ + _(""" Visualisers that load textures will respect this setting to limit their resolution. - """, + """), }, "visualiserAttributes.frustum" : { "description" : - """ + _(""" Controls whether applicable lights draw a representation of their light projection in the viewer. - """ + """) }, @@ -258,19 +259,19 @@ def __parameterMetadata( plug, key ) : "visualiserAttributes.lightFrustumScale" : { "description" : - """ + _(""" Allows light projections to be scaled to better suit the scene. - """ + """) }, "visualiserAttributes.scale" : { "description" : - """ + _(""" Scales non-geometric visualisations in the viewport to make them easier to work with. - """, + """), }, @@ -286,9 +287,9 @@ def __parameterMetadata( plug, key ) : "visualiserAttributes.lookThroughAperture" : { "description" : - """ + _(""" Specifies the aperture used when looking through this light. Overrides the Viewer's Camera Settings. - """, + """), "layout:visibilityActivator" : "lookThroughApertureVisibility" @@ -297,9 +298,9 @@ def __parameterMetadata( plug, key ) : "visualiserAttributes.lookThroughClippingPlanes" : { "description" : - """ + _(""" Specifies the clipping planes used when looking through this light. Overrides the Viewer's Camera Settings. - """, + """), "layout:visibilityActivator" : "lookThroughClippingPlanesVisibility" @@ -317,6 +318,7 @@ def appendViewContextMenuItems( viewer, view, menuDefinition ) : menuDefinition.append( "/Light Links", { + "label" : _("Light Links"), "subMenu" : functools.partial( __lightLinksSubMenu, view ) } ) @@ -336,8 +338,9 @@ def __lightLinksSubMenu( view ) : result.append( "Select Linked Objects", { + "label" : _("Select Linked Objects"), "command" : functools.partial( - __selectLinked, context = view.context(), title = "Selecting Linked Objects", + __selectLinked, context = view.context(), title = _("Selecting Linked Objects"), linkingQuery = functools.partial( GafferScene.SceneAlgo.linkedObjects, view["in"], selectedLights ) ), "active" : not selectedLights.isEmpty(), @@ -347,8 +350,9 @@ def __lightLinksSubMenu( view ) : result.append( "Select Linked Lights", { + "label" : _("Select Linked Lights"), "command" : functools.partial( - __selectLinked, context = view.context(), title = "Selecting Linked Lights", + __selectLinked, context = view.context(), title = _("Selecting Linked Lights"), linkingQuery = functools.partial( GafferScene.SceneAlgo.linkedLights, view["in"], selectedObjects ) ), "active" : not selectedObjects.isEmpty(), diff --git a/python/GafferSceneUI/LocaliseAttributesUI.py b/python/GafferSceneUI/LocaliseAttributesUI.py index 43f61b8ce74..b4bfd93d3fe 100644 --- a/python/GafferSceneUI/LocaliseAttributesUI.py +++ b/python/GafferSceneUI/LocaliseAttributesUI.py @@ -36,37 +36,38 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.LocaliseAttributes, "description", - """ + _(""" Copies inherited attributes into local attributes. - """, + """), plugs = { "attributes" : { "description" : - """ + _(""" The names of the attributes to localise. These should be separated by spaces and can use Gaffer's standard wildcards to match multiple attributes. - """, + """), }, "includeGlobalAttributes" : { "description" : - """ + _(""" When enabled, global attributes matching the names in `attributes` will be localised if an equivalent local or inherited attribute is not found. - """, + """), }, diff --git a/python/GafferSceneUI/MapOffsetUI.py b/python/GafferSceneUI/MapOffsetUI.py index ba59a79b202..3ee9e6f9c7f 100644 --- a/python/GafferSceneUI/MapOffsetUI.py +++ b/python/GafferSceneUI/MapOffsetUI.py @@ -37,46 +37,47 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.MapOffset, "description", - """ + _(""" Adds an offset to object texture coordinates. This provides a convenient way of looking at specific texture UDIMs. - """, + """), plugs = { "offset" : { "description" : - """ + _(""" An offset added to the texture coordinates. Note that moving the texture coordinates in the positive direction will move the texture in the negative direction. - """, + """), }, "udim" : { "description" : - """ + _(""" A specific UDIM to offset the texture coordinates to. The UDIM is converted to an offset which is added to the offset above. - """, + """), }, "uvSet" : { "description" : - """ + _(""" The name of the primitive variable holding the UV coordinates. - """, + """), }, diff --git a/python/GafferSceneUI/MapProjectionUI.py b/python/GafferSceneUI/MapProjectionUI.py index b7d8c754425..95e2631e6a2 100644 --- a/python/GafferSceneUI/MapProjectionUI.py +++ b/python/GafferSceneUI/MapProjectionUI.py @@ -40,6 +40,7 @@ import GafferUI import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -50,20 +51,20 @@ GafferScene.MapProjection, "description", - """ + _(""" Applies texture coordinates to meshes via a camera projection. In Gaffer, texture coordinates (commonly referred to as UVs) are represented as primitive variables. - """, + """), plugs = { "camera" : { "description" : - """ + _(""" The location of the camera to use for the projection. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:setNames" : IECore.StringVectorData( [ "__cameras" ] ), @@ -74,21 +75,21 @@ "position" : { "description" : - """ + _(""" The primitive variable that provides the position to be used in the projection. - """, + """), }, "uvSet" : { "description" : - """ + _(""" The name of the primitive variable used to store the projected UV coordinates. This may be changed to store multiple sets of UVs on a single mesh. - """, + """), }, diff --git a/python/GafferSceneUI/MergeCurvesUI.py b/python/GafferSceneUI/MergeCurvesUI.py index 7d04612d19c..77776eb6655 100644 --- a/python/GafferSceneUI/MergeCurvesUI.py +++ b/python/GafferSceneUI/MergeCurvesUI.py @@ -41,6 +41,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -51,9 +52,9 @@ GafferScene.MergeCurves, "description", - """ + _(""" Merge curves from all filtered location into a single curves primitive, or into multiple destinations. - """, + """), ) diff --git a/python/GafferSceneUI/MergeMeshesUI.py b/python/GafferSceneUI/MergeMeshesUI.py index 3f58621f586..c04365da38a 100644 --- a/python/GafferSceneUI/MergeMeshesUI.py +++ b/python/GafferSceneUI/MergeMeshesUI.py @@ -41,6 +41,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -51,13 +52,13 @@ GafferScene.MergeMeshes, "description", - """ + _(""" Merge meshes from all filtered location into a single mesh, or into multiple destinations. For primitive variables that are only present on some input locations the missing values will be filled with zeros. This can produce unexpected results when some inputs are missing normals, Cs, or uvs. - """, + """), ) diff --git a/python/GafferSceneUI/MergeObjectsUI.py b/python/GafferSceneUI/MergeObjectsUI.py index 5f57204084b..e712ee367c3 100644 --- a/python/GafferSceneUI/MergeObjectsUI.py +++ b/python/GafferSceneUI/MergeObjectsUI.py @@ -41,6 +41,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -51,11 +52,11 @@ GafferScene.MergeObjects, "description", - """ + _(""" The base type for scene nodes that merge locations into combined locations. Appropriate for nodes which merge primitives, or convert transforms to points. - """, + """), "layout:activator:sortKeyIsPrimVar", lambda node : node["sortKey"].getValue() == GafferScene.MergeObjects.SortKey.PrimitiveVariable, @@ -66,22 +67,22 @@ "filter" : { "description" : - """ + _(""" The filter used to choose the source locations to be merged. Source locations are pruned from the output scene, unless they are reused as part of a destination location (or a separate source scene is connected). - """ + """) }, "source" : { "description" : - """ + _(""" An optional alternate scene to provide the locations to be merged. When connected : - The `filter` chooses locations to be merged from the `source` scene rather than then `in` scene. - Source locations are not pruned from the output scene. - """ + """) }, @@ -89,12 +90,12 @@ "destination" : { "description" : - """ + _(""" The destination location where filtered locations will be merged to. The destination location will be created if it doesn't exist already. If the name overlaps with an existing location that isn't filtered, the name will get a suffix. May depend on the current value of scene:path in order to individually map input locations to different destinations. - """, + """), }, diff --git a/python/GafferSceneUI/MergePointsUI.py b/python/GafferSceneUI/MergePointsUI.py index 1524d2694f1..19baf5445e2 100644 --- a/python/GafferSceneUI/MergePointsUI.py +++ b/python/GafferSceneUI/MergePointsUI.py @@ -41,6 +41,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -51,9 +52,9 @@ GafferScene.MergePoints, "description", - """ + _(""" Merge points from all filtered location into a single points primitive, or into multiple destinations. - """, + """), ) diff --git a/python/GafferSceneUI/MergeScenesUI.py b/python/GafferSceneUI/MergeScenesUI.py index f891d2c8423..9b1ebf6ff8a 100644 --- a/python/GafferSceneUI/MergeScenesUI.py +++ b/python/GafferSceneUI/MergeScenesUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.MergeScenes, "description", - """ + _(""" Merges multiple input scenes into a single output scene. Merging is performed left to right, starting with `in[0]`. @@ -59,19 +60,19 @@ > Caution : When `transformMode` and/or `objectMode` is not `Keep`, > bounding box computations have significant overhead. Consider > not using these operations, or turning off `adjustBounds`. - """, + """), plugs = { "transformMode" : { "description" : - """ + _(""" The method used to merge transforms when the same location exists in multiple input scenes. Keep mode keeps the transform from the first input, and Replace mode replaces it with the transform of the last input. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Keep" : GafferScene.MergeScenes.Mode.Keep, @@ -82,13 +83,13 @@ "attributesMode" : { "description" : - """ + _(""" The method used to merge attributes when the same location exists in multiple input scenes. Keep mode keeps the attributes from the first input, Replace mode replaces them with the attributes from the last input, and Merge mode merges all attributes together from first to last. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Keep" : GafferScene.MergeScenes.Mode.Keep, @@ -100,12 +101,12 @@ "objectMode" : { "description" : - """ + _(""" The method used to merge objects when the same location exists in multiple input scenes. Keep mode keeps the object from the first input, and Replace mode replaces it with the object from the last input which has one. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Keep" : GafferScene.MergeScenes.Mode.Keep, @@ -116,12 +117,12 @@ "globalsMode" : { "description" : - """ + _(""" The method used to merge scene globals. Keep mode keeps the globals from the first input, Replace mode replaces them with the globals from the last input, and Merge mode merges all globals together from first to last. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Keep" : GafferScene.MergeScenes.Mode.Keep, @@ -133,12 +134,12 @@ "adjustBounds" : { "description" : - """ + _(""" Adjusts bounding boxes to take account of the merging operation. > Caution : This has considerable overhead when the `objectsMode` and/or > `transformsMode` is not `Keep`. - """, + """), }, diff --git a/python/GafferSceneUI/MeshDistortionUI.py b/python/GafferSceneUI/MeshDistortionUI.py index 75ff11fa829..2015fe7af9b 100644 --- a/python/GafferSceneUI/MeshDistortionUI.py +++ b/python/GafferSceneUI/MeshDistortionUI.py @@ -36,71 +36,72 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.MeshDistortion, "description", - """ + _(""" Measures how much a mesh has been distorted from a reference shape. The distortion is calculated by comparing edge lengths between the reference and deformed shapes. Compressed areas have negative distortion values, stretched areas have positive distortion values, and areas with no deformation have distortion values of zero. The calculated distortion is output as primitive variables on the mesh. - """, + """), plugs = { "position" : { "description" : - """ + _(""" The name of the primitive variable which contains the deformed vertex positions for the mesh. - """, + """), }, "referencePosition" : { "description" : - """ + _(""" The name of the primitive variable which contains the undeformed vertex positions for the mesh. - """, + """), }, "uvSet" : { "description" : - """ + _(""" The name of the primitive variable which contains the UV set used to calculate UV distortion. - """, + """), }, "distortion" : { "description" : - """ + _(""" The name of the primitive variable created to store the distortion values. This will contain a float per vertex. - """, + """), }, "uvDistortion" : { "description" : - """ + _(""" The name of the primitive variable created to store the UV distortion values. This will contain a V2f with separate distortion values for the U and V directions. - """, + """), }, diff --git a/python/GafferSceneUI/MeshNormalsUI.py b/python/GafferSceneUI/MeshNormalsUI.py index 1f39af5964f..0dc30e9c1f9 100644 --- a/python/GafferSceneUI/MeshNormalsUI.py +++ b/python/GafferSceneUI/MeshNormalsUI.py @@ -37,6 +37,7 @@ import Gaffer import GafferScene import IECoreScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( @@ -44,9 +45,9 @@ GafferScene.MeshNormals, "description", - """ + _(""" Creates a normal primitive variable on a mesh, using the positions of adjacent vertices. - """, + """), "layout:activator:weighting", lambda parent : parent["interpolation"].getValue() != int(IECoreScene.PrimitiveVariable.Interpolation.Uniform), "layout:activator:thresholdAngle", lambda parent : parent["interpolation"].getValue() == int(IECoreScene.PrimitiveVariable.Interpolation.FaceVarying), @@ -55,9 +56,9 @@ "interpolation" : { "description" : - """ + _(""" The interpolation of the normal primitive variable we are creating. Affects the shape of the resulting normals, because Uniform ( Per-Face ) normals are inherently faceted, whereas Vertex normals are always smooth. - """, + """), "preset:Uniform (Faceted)" : IECoreScene.PrimitiveVariable.Interpolation.Uniform, "preset:Vertex (Smooth)" : IECoreScene.PrimitiveVariable.Interpolation.Vertex, @@ -68,12 +69,12 @@ "weighting" : { "description" : - """ + _(""" How to weight the multiple faces that contribute to the normal of a vertex. "Equal" averages all faces connected to the vertex - simple to compute, but low quality. "Angle" gives good results for most meshes. "Area" may give good results on hard edge models with tight chamfers and large flat faces. - """, + """), "preset:Equal" : IECoreScene.MeshAlgo.NormalWeighting.Equal, "preset:Angle" : IECoreScene.MeshAlgo.NormalWeighting.Angle, @@ -86,28 +87,28 @@ "thresholdAngle" : { "description" : - """ + _(""" Used to decide whether edges are smooth or sharp when generating a normal primvar with FaceVarying interpolation. FaceVertices with normals that differ by less than this angle will be averaged together into a smooth normal. - """, + """), "layout:activator" : "thresholdAngle", }, "position" : { "description" : - """ + _(""" The name of the position primitive variable that drives everything. - """, + """), "divider" : True, }, "normal" : { "description" : - """ + _(""" The name of the normal primitive variable to output. - """, + """), } } diff --git a/python/GafferSceneUI/MeshSegmentsUI.py b/python/GafferSceneUI/MeshSegmentsUI.py index f7688e3b030..24e346a71ad 100644 --- a/python/GafferSceneUI/MeshSegmentsUI.py +++ b/python/GafferSceneUI/MeshSegmentsUI.py @@ -36,19 +36,20 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.MeshSegments, "description", - """ + _(""" Creates a uniform primitive variable of integer indices indicating which connected segment each face belongs to. May create segments based on what is connected in the mesh's topology, or based on an indexed primitive variable ( for example, you may segment based on which faces share UVs in order to segment into UV islands ). - """, + """), "layout:section:Settings.Inputs:collapsed", False, "layout:section:Settings.Outputs:collapsed", False, @@ -59,7 +60,7 @@ "connectivity" : { "description" : - """ + _(""" The name of the primitive variable which will determine the segmentation. You may specify an empty string, or any vertex primitive variable to use the vertex topology to determine segments, or use an indexed face-varying @@ -68,17 +69,17 @@ Uniform and constant primitive variables are also supported for consistency, but they just output which faces have the same uniform value, or put all faces in one segment. - """, + """), "layout:section" : "Settings.Inputs" }, "segment" : { "description" : - """ + _(""" The name of the uniform primitive variable which will be created to hold the segment index for each face. - """, + """), "layout:section" : "Settings.Outputs" }, diff --git a/python/GafferSceneUI/MeshSplitUI.py b/python/GafferSceneUI/MeshSplitUI.py index 4013dd2920a..392dad62110 100644 --- a/python/GafferSceneUI/MeshSplitUI.py +++ b/python/GafferSceneUI/MeshSplitUI.py @@ -36,61 +36,62 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.MeshSplit, "description", - """ + _(""" Splits a mesh into separate meshes for each unique value of a chosen Uniform ( per-face ) primitive variable. The meshes will be created as children of the original mesh, and the original mesh will be removed. - """, + """), plugs = { "parent" : { "description" : - """ + _(""" Legacy plug. Do not use. - """ + """) }, "segment" : { "description" : - """ + _(""" The name of the primitive variable to split based on. Must be a Uniform ( per-face ) primitive variable. A separate mesh will be created for each unique value of this primitive variable. - """, + """), }, "nameFromSegment" : { "description" : - """ + _(""" If true, the resulting meshes will be named based on the value of the primitive variable chosen by `segment`. Requires that the chosen primitive variable be a string. Otherwise, the resulting meshes will just be named based on an integer index. - """, + """), }, "preciseBounds" : { "description" : - """ + _(""" Create tightly fitted bounding boxes that exactly fit each split child mesh. This requires visiting the vertices of the input mesh, so is more expensive. If false, the bounding box of the original mesh is used for all new meshes - this is technically correct, since they are all contained within this bounding box, but isn't as informative. - """, + """), }, } diff --git a/python/GafferSceneUI/MeshTangentsUI.py b/python/GafferSceneUI/MeshTangentsUI.py index ec75ff5d693..5809f8ce7ba 100644 --- a/python/GafferSceneUI/MeshTangentsUI.py +++ b/python/GafferSceneUI/MeshTangentsUI.py @@ -37,6 +37,7 @@ import Gaffer import GafferScene import IECoreScene +from GafferUI.i18n import _ ## To deprecate the uTangent and vTangent we hide them and feed in the new plugs. @@ -54,9 +55,9 @@ def postCreate( node, menu ) : GafferScene.MeshTangents, "description", - """ + _(""" Adds surface tangent primitive variables to the mesh based on either UV or topology information. - """, + """), "layout:activator:uvActivator", lambda parent : parent["mode"].getValue() == int(GafferScene.MeshTangents.Mode.UV), "layout:activator:uvDeactivator", lambda parent : parent["mode"].getValue() != int(GafferScene.MeshTangents.Mode.UV), @@ -68,13 +69,13 @@ def postCreate( node, menu ) : "mode" : { "description" : - """ + _(""" The style of how to calculate the Tangents. (UV) calculates the tangents based on the gradient of the the corresponding UVs (FirstEdge) defines the vector to the first neighbor as tangent and the bitangent orthogonal to tangent and normal (TwoEdges) defines the vector between the first two neighbors as tangent and the bitangent orthogonal to tangent and normal (PrimitiveCentroid) points the tangent towards the primitive centroid and the bitangent orthogonal to tangent and normal - """, + """), "preset:UV" : GafferScene.MeshTangents.Mode.UV, "preset:FirstEdge" : GafferScene.MeshTangents.Mode.FirstEdge, @@ -86,78 +87,78 @@ def postCreate( node, menu ) : "orthogonal" : { "description" : - """ + _(""" Adjusts vTangent to be orthogonal to the uTangent. - """, + """), }, "leftHanded" : { "description" : - """ + _(""" Make the local coordinate frame left handed - """, + """), "layout:activator" : "leftHandedActivator", }, "position" : { "description" : - """ + _(""" Name of the primitive variable which contains the position data used to calculate tangents & binormals. For example 'Pref' would compute tangents using the reference positions (if defined) - """, + """), "layout:section" : "Settings.Input", }, "normal" : { "description" : - """ + _(""" Name of the primitive variable which contains the normals used to calculate tangents & binormals. - """, + """), "layout:section" : "Settings.Input", "layout:activator" : "uvDeactivator", }, "uvSet" : { "description" : - """ + _(""" Name of the UV set primitive variable used to calculate uTangent & vTangent. - """, + """), "layout:section" : "Settings.Input", "layout:activator" : "uvActivator", }, "uTangent" : { "description" : - """ + _(""" Name of the primitive variable which will contain the uTangent data. - """, + """), "layout:section" : "Settings.Output", "layout:activator" : "uvActivator", }, "vTangent" : { "description" : - """ + _(""" Name of the primitive variable which will contain the vTangent data. - """, + """), "layout:section" : "Settings.Output", "layout:activator" : "uvActivator", }, "tangent" : { "description" : - """ + _(""" Name of the primitive variable which will contain the tangent data. - """, + """), "layout:section" : "Settings.Output", "layout:activator" : "uvDeactivator", }, "biTangent" : { "description" : - """ + _(""" Name of the primitive variable which will contain the biTangent data. - """, + """), "layout:section" : "Settings.Output", "layout:activator" : "uvDeactivator", } diff --git a/python/GafferSceneUI/MeshTessellateUI.py b/python/GafferSceneUI/MeshTessellateUI.py index dc602778a61..a1946b6ec08 100644 --- a/python/GafferSceneUI/MeshTessellateUI.py +++ b/python/GafferSceneUI/MeshTessellateUI.py @@ -39,6 +39,7 @@ import GafferScene.Private.IECoreScenePreview.MeshAlgo as MeshAlgo import IECoreScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( @@ -46,7 +47,7 @@ GafferScene.MeshTessellate, "description", - """ + _(""" Tessellates meshes according to their subdivision scheme, converting them into higher polygon meshes which follow the limit surface - usually the smooth regular quads of a Catmull-Clark scheme. @@ -61,36 +62,36 @@ ( Note that OpenSubdiv's "tessellation rate" parameter is the same as our "divisions" parameter, except "tessellation rate" is one higher than "divisions. ) - """, + """), "layout:activator:schemeNotOverridden", lambda node : node["scheme"].getValue() == "", plugs = { "divisions" : { "description" : - """ + _(""" The number of vertices to insert in each edge during tessellation. - """, + """), }, "calculateNormals" : { "description" : - """ + _(""" Calculate normals based on the limit surface. If there are existing normals, they will be overwritten. If this is not set, existing normals will be interpolated like any other primvar. Note that we currently output Vertex normals, which makes sense for most subdivs, but does not accurately capture infinitely sharp creases. - """, + """), }, "scheme" : { "description" : - """ + _(""" Overrides the subdivision scheme that determines the shape of the surface. By default, the subdivision scheme used comes from the mesh's interpolation property, which should be set with a MeshType node, so it will apply to rendering the surface, and also this node. Overriding is useful if a mesh has not been tagged correctly ( for example, if you want to force a mesh to be smooth, you can set scheme to CatmullClark ). - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:From Mesh" : "", "preset:Bilinear" : "bilinear", @@ -99,20 +100,20 @@ }, "tessellatePolygons" : { "description" : - """ + _(""" Force bilinear tessellation of meshes without subdivision schemes. If there is no subdivision scheme stored on the mesh ( `interpolation = "linear"` ), and you haven't overridden the scheme, we interpret that to mean no tessellation is required. Bilinear tessellation won't change the shape of the surface, but sometimes forcing tessellation is useful anyways ( for example, to apply deformation on a denser mesh ). - """, + """), "layout:activator" : "schemeNotOverridden", }, "interpolateBoundary" : { "description" : - """ + _(""" Specifies which parts of mesh boundaries are forced to exactly meet the boundary. Without this forcing, a subdivision surface will naturally shrink back from the boundary as it smooths out. @@ -121,7 +122,7 @@ change this are to use `Edge Only` if you want to produce curved edges from polygonal boundaries, or to use `None` if you're doing something tricky with seamlessly splitting subdiv meshes by providing the split meshes with a border of shared polygons in order to get continuous tangents. - """, + """), "preset:From Mesh" : "", "preset:None" : IECoreScene.MeshPrimitive.interpolateBoundaryNone, @@ -133,10 +134,10 @@ "faceVaryingLinearInterpolation" : { # This name is so long it's getting cropped ... better to lose the end than the start. - "label" : "Face Varying Linear Interp..", + "label" : _("Face Varying Linear Interp.."), "description" : - """ + _(""" Specifies where face varying primitive variables should use a simple linear interpolation instead of being smoothed. @@ -146,7 +147,7 @@ See the OpenSubdiv docs for explanation of the details of options like `Corners Plus 1`: https://graphics.pixar.com/opensubdiv/docs/subdivision_surfaces.html#schemes-and-options - """, + """), "preset:From Mesh" : "", "preset:None" : IECoreScene.MeshPrimitive.faceVaryingLinearInterpolationNone, @@ -161,10 +162,10 @@ "triangleSubdivisionRule" : { "description" : - """ + _(""" Option to use a non-standard `Smooth` subdivision rule that provides slightly better results at triangular faces in Catmull-Clark meshes than the standard Catmull-Clark algorithm. - """, + """), "preset:From Mesh" : "", "preset:CatmullClark" : IECoreScene.MeshPrimitive.triangleSubdivisionRuleCatmullClark, diff --git a/python/GafferSceneUI/MeshToPointsUI.py b/python/GafferSceneUI/MeshToPointsUI.py index 93e49bcd455..8a70952d956 100644 --- a/python/GafferSceneUI/MeshToPointsUI.py +++ b/python/GafferSceneUI/MeshToPointsUI.py @@ -37,20 +37,21 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.MeshToPoints, "description", - """ + _(""" Converts mesh primitives into points primitives. Primitive variables with FaceVarying or Uniform interpolation are discarded (because they have the wrong size for the new primitive), but all other primitive variables are preserved during conversion. - """, + """), plugs = { @@ -63,10 +64,10 @@ "type" : { "description" : - """ + _(""" The render type for the newly converted points primitives. - """, + """), "preset:Particle" : "particle", "preset:Sphere" : "sphere", diff --git a/python/GafferSceneUI/MeshTypeUI.py b/python/GafferSceneUI/MeshTypeUI.py index d65c34e28fc..571e9e7a3b5 100644 --- a/python/GafferSceneUI/MeshTypeUI.py +++ b/python/GafferSceneUI/MeshTypeUI.py @@ -39,6 +39,7 @@ import GafferScene import IECoreScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -49,7 +50,7 @@ GafferScene.MeshType, "description", - """ + _(""" Changes between polygon and subdivision representations for mesh objects, and optionally recalculates vertex normals for polygon meshes. @@ -57,16 +58,16 @@ Note that currently the Gaffer viewport does not display subdivision meshes with smoothing, so the results of using this node will not be seen until a render is performed. - """, + """), plugs = { "meshType" : { "description" : - """ + _(""" The interpolation type to apply to the mesh. - """, + """), "preset:Unchanged" : "", "preset:Polygon" : "linear", @@ -79,32 +80,32 @@ "calculatePolygonNormals" : { "description" : - """ + _(""" Causes new vertex normals to be calculated for polygon meshes. Has no effect for subdivision surfaces, since those are naturally smooth and do not require surface normals. Vertex normals are represented as primitive variables named "N". - """, + """), }, "overwriteExistingNormals" : { "description" : - """ + _(""" By default, vertex normals will only be calculated for polygon meshes which don't already have them. Turning this on will force new normals to be calculated even for meshes which had them already. - """, + """), }, "interpolateBoundary" : { "description" : - """ + _(""" Specifies which parts of mesh boundaries are forced to exactly meet the boundary. Without this forcing, a subdivision surface will naturally shrink back from the boundary as it smooths out. @@ -113,7 +114,7 @@ change this are to use `Edge Only` if you want to produce curved edges from polygonal boundaries, or to use `None` if you're doing something tricky with seamlessly splitting subdiv meshes by providing the split meshes with a border of shared polygons in order to get continuous tangents. - """, + """), "preset:Unchanged" : "", "preset:None" : IECoreScene.MeshPrimitive.interpolateBoundaryNone, @@ -127,10 +128,10 @@ "faceVaryingLinearInterpolation" : { # This name is so long it's getting cropped ... better to lose the end than the start. - "label" : "Face Varying Linear Interp..", + "label" : _("Face Varying Linear Interp.."), "description" : - """ + _(""" Specifies where face varying primitive variables should use a simple linear interpolation instead of being smoothed. @@ -140,7 +141,7 @@ See the OpenSubdiv docs for explanation of the details of options like `Corners Plus 1`: https://graphics.pixar.com/opensubdiv/docs/subdivision_surfaces.html#schemes-and-options - """, + """), "preset:Unchanged" : "", "preset:None" : IECoreScene.MeshPrimitive.faceVaryingLinearInterpolationNone, @@ -157,10 +158,10 @@ "triangleSubdivisionRule" : { "description" : - """ + _(""" Option to use a non-standard `Smooth` subdivision rule that provides slightly better results at triangular faces in Catmull-Clark meshes than the standard Catmull-Clark algorithm. - """, + """), "preset:Unchanged" : "", "preset:CatmullClark" : IECoreScene.MeshPrimitive.triangleSubdivisionRuleCatmullClark, diff --git a/python/GafferSceneUI/MotionPathUI.py b/python/GafferSceneUI/MotionPathUI.py index 248066886f8..1985716daac 100644 --- a/python/GafferSceneUI/MotionPathUI.py +++ b/python/GafferSceneUI/MotionPathUI.py @@ -38,16 +38,17 @@ import GafferScene import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.MotionPath, "description", - """ + _(""" Creates a motion path curve over the specified frame range for each filtered location. Note the output scene will be isolated to the matching locations only. - """, + """), "layout:activator:variableSampling", lambda node : node["samplingMode"].getValue() == GafferScene.MotionPath.SamplingMode.Variable, "layout:activator:fixedSampling", lambda node : node["samplingMode"].getValue() == GafferScene.MotionPath.SamplingMode.Fixed, @@ -57,9 +58,9 @@ "start" : { "description" : - """ + _(""" The first frame of motion tracking can be specified relative to the current frame or as an absolute value. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layoutPlugValueWidget:orientation" : "horizontal", @@ -69,9 +70,9 @@ "start.mode" : { "description" : - """ + _(""" Controls whether `start.frame` is relative to the current frame or an absolute value. - """, + """), "preset:Relative" : GafferScene.MotionPath.FrameMode.Relative, "preset:Absolute" : GafferScene.MotionPath.FrameMode.Absolute, @@ -84,9 +85,9 @@ "start.frame" : { "description" : - """ + _(""" The first frame of motion tracking. - """, + """), "layout:label" : "", @@ -95,9 +96,9 @@ "end" : { "description" : - """ + _(""" The last frame of motion tracking can be specified relative to the current frame or as an absolute value. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layoutPlugValueWidget:orientation" : "horizontal", @@ -107,9 +108,9 @@ "end.mode" : { "description" : - """ + _(""" Controls whether `end.frame` is relative to the current frame or an absolute value. - """, + """), "preset:Relative" : GafferScene.MotionPath.FrameMode.Relative, "preset:Absolute" : GafferScene.MotionPath.FrameMode.Absolute, @@ -122,9 +123,9 @@ "end.frame" : { "description" : - """ + _(""" The last frame of motion tracking. - """, + """), "layout:label" : "", @@ -133,7 +134,7 @@ "samplingMode" : { "description" : - """ + _(""" Use "Fixed" mode for a curve with a constant vertex count. Use "Variable" mode for a curve sampled at regular `step` intervals. @@ -143,7 +144,7 @@ > Caution : In "Variable" mode it may not be possible to render with deformation blur enabled. Be sure to disable it via `StandardAttributes` if you want to render a variable sampled curve. - """, + """), "preset:Variable" : GafferScene.MotionPath.SamplingMode.Variable, "preset:Fixed" : GafferScene.MotionPath.SamplingMode.Fixed, @@ -155,7 +156,7 @@ "step" : { "description" : - """ + _(""" The sampling rate between `start.frame` and `end.frame`. > Note : `start.frame` and `end.frame` will always be sampled @@ -163,7 +164,7 @@ > Caution : With a small `step` size it may not be possible to render with deformation blur enabled. - """, + """), "layout:activator" : "variableSampling", @@ -172,9 +173,9 @@ "samples" : { "description" : - """ + _(""" The exact number of samples (including `start.frame` and `end.frame`) when using a "Fixed" `samplingMode`. - """, + """), "layout:activator" : "fixedSampling", @@ -183,9 +184,9 @@ "adjustBounds" : { "description" : - """ + _(""" Opt in or out of bounds calculations. - """, + """), }, diff --git a/python/GafferSceneUI/ObjectSourceUI.py b/python/GafferSceneUI/ObjectSourceUI.py index f98c8f81e3e..78b598b21b8 100644 --- a/python/GafferSceneUI/ObjectSourceUI.py +++ b/python/GafferSceneUI/ObjectSourceUI.py @@ -37,33 +37,34 @@ import Gaffer import GafferScene import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ObjectSource, "description", - """ + _(""" A node which produces scenes with exactly one object in them. - """, + """), plugs = { "name" : { "description" : - """ + _(""" The name of the object in the output scene. - """, + """), }, "transform" : { "description" : - """ + _(""" The transform applied to the object. - """, + """), "layout:section" : "Transform", @@ -72,10 +73,10 @@ "sets" : { "description" : - """ + _(""" A list of sets to include the object in. The names should be separated by spaces. - """, + """), }, diff --git a/python/GafferSceneUI/ObjectToSceneUI.py b/python/GafferSceneUI/ObjectToSceneUI.py index b399603729b..58dda3deac2 100644 --- a/python/GafferSceneUI/ObjectToSceneUI.py +++ b/python/GafferSceneUI/ObjectToSceneUI.py @@ -37,6 +37,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -47,19 +48,19 @@ GafferScene.ObjectToScene, "description", - """ + _(""" Converts objects to be used with the nodes in the GafferScene module. - """, + """), plugs = { "object" : { "description" : - """ + _(""" The object to be placed in the output scene. - """, + """), "nodule:type" : "GafferUI::StandardNodule", diff --git a/python/GafferSceneUI/OpenGLAttributesUI.py b/python/GafferSceneUI/OpenGLAttributesUI.py index 540f0adbd20..0d2cbd01f67 100644 --- a/python/GafferSceneUI/OpenGLAttributesUI.py +++ b/python/GafferSceneUI/OpenGLAttributesUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -56,10 +57,10 @@ def __drawingSummary( plug ) : values = [] if plug["gl:primitive:"+name]["enabled"].getValue() : - values.append( "On" if plug["gl:primitive:" + name]["value"].getValue() else "Off" ) + values.append( _("On") if plug["gl:primitive:" + name]["value"].getValue() else _("Off") ) name = { "points" : "point" }.get( name, name ) if name != "solid" and plug["gl:primitive:" + name + "Color"]["enabled"].getValue() : - values.append( "Color" ) + values.append( _("Color") ) if name not in ( "solid", "bound" ) and plug["gl:primitive:" + name + "Width"]["enabled"].getValue() : values.append( "%0gpx" % plug["gl:primitive:" + name + "Width"]["value"].getValue() ) @@ -72,9 +73,9 @@ def __pointsPrimitivesSummary( plug ) : info = [] if plug["gl:pointsPrimitive:useGLPoints"]["enabled"].getValue() : - info.append( "Points On" if plug["gl:pointsPrimitive:useGLPoints"]["value"].getValue() else "Points Off" ) + info.append( _("Points") + " " + _("On") if plug["gl:pointsPrimitive:useGLPoints"]["value"].getValue() else _("Points") + " " + _("Off") ) if plug["gl:pointsPrimitive:glPointWidth"]["enabled"].getValue() : - info.append( "Width %0gpx" % plug["gl:pointsPrimitive:glPointWidth"]["value"].getValue() ) + info.append( _("Width %0gpx") % plug["gl:pointsPrimitive:glPointWidth"]["value"].getValue() ) return ", ".join( info ) @@ -82,11 +83,11 @@ def __curvesPrimitivesSummary( plug ) : info = [] if plug["gl:curvesPrimitive:useGLLines"]["enabled"].getValue() : - info.append( "Lines On" if plug["gl:curvesPrimitive:useGLLines"]["value"].getValue() else "Lines Off" ) + info.append( _("Lines") + " " + _("On") if plug["gl:curvesPrimitive:useGLLines"]["value"].getValue() else _("Lines") + " " + _("Off") ) if plug["gl:curvesPrimitive:glLineWidth"]["enabled"].getValue() : - info.append( "Width %0gpx" % plug["gl:curvesPrimitive:glLineWidth"]["value"].getValue() ) + info.append( _("Width %0gpx") % plug["gl:curvesPrimitive:glLineWidth"]["value"].getValue() ) if plug["gl:curvesPrimitive:ignoreBasis"]["enabled"].getValue() : - info.append( "Basis Ignored" if plug["gl:curvesPrimitive:ignoreBasis"]["value"].getValue() else "Basis On" ) + info.append( _("Basis Ignored") if plug["gl:curvesPrimitive:ignoreBasis"]["value"].getValue() else _("Basis On") ) return ", ".join( info ) @@ -95,10 +96,10 @@ def __curvesPrimitivesSummary( plug ) : GafferScene.OpenGLAttributes, "description", - """ + _(""" Applies attributes to modify the appearance of objects in the viewport and in renders done by the OpenGLRender node. - """, + """), plugs = { diff --git a/python/GafferSceneUI/OpenGLShaderUI.py b/python/GafferSceneUI/OpenGLShaderUI.py index 1a4b02d57f0..d02f03debbd 100644 --- a/python/GafferSceneUI/OpenGLShaderUI.py +++ b/python/GafferSceneUI/OpenGLShaderUI.py @@ -45,6 +45,7 @@ import GafferUI import GafferImage import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -55,14 +56,14 @@ GafferScene.OpenGLShader, "description", - """ + _(""" Loads GLSL shaders for use in the viewer and the OpenGLRender node. GLSL shaders are loaded from *.frag and *.vert files in directories specified by the IECOREGL_SHADER_PATHS environment variable. Use the ShaderAssignment node to assign shaders to objects in the scene. - """, + """), plugs = { diff --git a/python/GafferSceneUI/OptionQueryUI.py b/python/GafferSceneUI/OptionQueryUI.py index 7ddfa471653..92a32174c86 100644 --- a/python/GafferSceneUI/OptionQueryUI.py +++ b/python/GafferSceneUI/OptionQueryUI.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Internal utilities @@ -153,31 +154,31 @@ def childPlugValueWidget( self, childPlug ) : GafferScene.OptionQuery, "description", - """ + _(""" Queries global scene options, creating an output for each option. - """, + """), plugs = { "scene" : { "description" : - """ + _(""" The scene to query the options from. - """, + """), }, "queries" : { "description" : - """ + _(""" The options to be queried - arbitrary numbers of options may be added as children of this plug via the user interface, or via python. Each child is a `NameValuePlug` whose `name` plug is the option to query, and whose `value` plug is the default value to use if the option can not be retrieved. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -194,37 +195,37 @@ def childPlugValueWidget( self, childPlug ) : "queries.*" : { "description" : - """ + _(""" A pair of option name to query and default value. - """, + """), }, "queries.*.name" : { "description" : - """ + _(""" The name of the option to query. - """, + """), }, "queries.*.value" : { "description" : - """ + _(""" The value to output if the option does not exist. - """, + """), }, "out" : { "description" : - """ + _(""" The parent plug of the query outputs. The order of outputs corresponds to the order of children of `queries`. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -239,9 +240,9 @@ def childPlugValueWidget( self, childPlug ) : "out.*" : { "description" : - """ + _(""" The result of the query. - """, + """), "label" : functools.partial( __getLabel, parentPlug = ""), @@ -254,9 +255,9 @@ def childPlugValueWidget( self, childPlug ) : "out.*.exists" : { "description" : - """ + _(""" Outputs true if the option exists, otherwise false. - """, + """), "noduleLayout:label" : functools.partial( __getLabel, parentPlug = "exists" ), @@ -265,10 +266,10 @@ def childPlugValueWidget( self, childPlug ) : "out.*.value" : { "description" : - """ + _(""" Outputs the value of the option, or the default value if the option does not exist. - """, + """), }, @@ -326,7 +327,7 @@ def __plugPopupMenu( menuDefinition, plugValueWidget ) : if len( menuDefinition.items() ) : menuDefinition.append( "/DeleteDivider", { "divider" : True } ) - menuDefinition.append( "/Delete", { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) + menuDefinition.append( "/" + _("Delete"), { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) def __deletePlug( plug ) : diff --git a/python/GafferSceneUI/OptionTweaksUI.py b/python/GafferSceneUI/OptionTweaksUI.py index ec664dd2138..999975be42e 100644 --- a/python/GafferSceneUI/OptionTweaksUI.py +++ b/python/GafferSceneUI/OptionTweaksUI.py @@ -39,15 +39,16 @@ import Gaffer import GafferScene import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.OptionTweaks, "description", - """ + _(""" Makes modifications to options. - """, + """), "layout:section:Settings.Tweaks:collapsed", False, @@ -56,21 +57,21 @@ "ignoreMissing" : { "description" : - """ + _(""" Ignores tweaks targeting missing options. When off, missing options cause the node to error. - """ + """) }, "tweaks" : { "description" : - """ + _(""" The tweaks to be made to the options. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or using the OptionTweaks API via python. - """, + """), "layout:section" : "Settings.Tweaks", "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", diff --git a/python/GafferSceneUI/OptionsUI.py b/python/GafferSceneUI/OptionsUI.py index d8a3bea0155..4859be79c32 100644 --- a/python/GafferSceneUI/OptionsUI.py +++ b/python/GafferSceneUI/OptionsUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ # The following functions are protected rather than private so that # they can be shared by OptionTweaksUI. @@ -83,20 +84,20 @@ def __optionPresets( plug ) : GafferScene.Options, "description", - """ + _(""" The base type for nodes that apply options to the scene. - """, + """), plugs = { "options" : { "description" : - """ + _(""" The options to be applied - arbitrary numbers of user defined options may be added as children of this plug via the user interface, or using the CompoundDataPlug API via python. - """, + """), "compoundDataPlugValueWidget:editable" : False, @@ -130,7 +131,7 @@ def __optionPresets( plug ) : "extraOptions" : { "description" : - """ + _(""" An additional set of options to be added. Arbitrary numbers of options may be specified within a single `IECore.CompoundObject`, where each key/value pair in the object defines an option. @@ -142,7 +143,7 @@ def __optionPresets( plug ) : If the same option is defined by both the `options` and the `extraOptions` plugs, then the value from the `extraOptions` is taken. - """, + """), "plugValueWidget:type" : "", "layout:section" : "Extra", diff --git a/python/GafferSceneUI/OrientationUI.py b/python/GafferSceneUI/OrientationUI.py index a5c2ef939b2..05fb2c8d10c 100644 --- a/python/GafferSceneUI/OrientationUI.py +++ b/python/GafferSceneUI/OrientationUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ __modePresets = { "preset:Euler" : GafferScene.Orientation.Mode.Euler, @@ -61,7 +62,7 @@ GafferScene.Orientation, "description", - """ + _(""" Converts between different representations of orientation, stored as primitive variables on an object. Supported representations include euler angles, quaternions, axis-angle form, aim vectors and matrices. @@ -69,7 +70,7 @@ Typically used to prepare points for instancing, as the Instancer node requires orientation to be provided as a quaternion, but it is often more convenient to prepare orientations in another representation. - """, + """), "layout:activator:inModeIsEuler", lambda node : node["inMode"].getValue() == GafferScene.Orientation.Mode.Euler, "layout:activator:inModeIsQuaternion", lambda node : node["inMode"].getValue() in ( GafferScene.Orientation.Mode.Quaternion, GafferScene.Orientation.Mode.QuaternionXYZW ), @@ -98,9 +99,9 @@ "inMode" : { "description" : - """ + _(""" The method used to define the input orientations. - """, + """), "layout:section" : "Settings.Input", "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -114,12 +115,12 @@ "deleteInputs" : { "description" : - """ + _(""" Deletes the input primitive variables, so that they are not present on the output object. - """, + """), - "label" : "Delete", + "label" : _("Delete"), "layout:section" : "Settings.Input", "layout:index" : -1, @@ -131,13 +132,13 @@ "inEuler" : { "description" : - """ + _(""" Name of the primitive variable that defines the input orientation as euler angles, measured in degrees. This variable should contain V3fVectorData. - """, + """), - "label" : "Euler", + "label" : _("Euler"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsEuler", @@ -146,11 +147,11 @@ "inOrder" : { "description" : - """ + _(""" The rotation order of the input euler angles. - """, + """), - "label" : "Order", + "label" : _("Order"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsEuler", "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -163,12 +164,12 @@ "inQuaternion" : { "description" : - """ + _(""" Name of the primitive variable that defines the input orientation as quaternions. This variable should contain QuatfVectorData. - """, + """), - "label" : "Quaternion", + "label" : _("Quaternion"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsQuaternion", @@ -181,12 +182,12 @@ "inAxis" : { "description" : - """ + _(""" Name of the primitive variable that defines the axis component of the input orientations. This variable should contain V3fVectorData. - """, + """), - "label" : "Axis", + "label" : _("Axis"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsAxisAngle", @@ -196,12 +197,12 @@ "inAngle" : { "description" : - """ + _(""" Name of the primitive variable that defines the angle component of the input orientations. This variable should contain FloatVectorData. - """, + """), - "label" : "Angle", + "label" : _("Angle"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsAxisAngle", @@ -214,12 +215,12 @@ "inXAxis" : { "description" : - """ + _(""" Name of the primitive variable that defines the direction in which the X axis will be aimed. This variable should contain V3fVectorData. - """, + """), - "label" : "X Axis", + "label" : _("X Axis"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsAim", @@ -229,12 +230,12 @@ "inYAxis" : { "description" : - """ + _(""" Name of the primitive variable that defines the direction in which the Y axis will be aimed. This variable should contain V3fVectorData. - """, + """), - "label" : "Y Axis", + "label" : _("Y Axis"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsAim", @@ -244,12 +245,12 @@ "inZAxis" : { "description" : - """ + _(""" Name of the primitive variable that defines the direction in which the Z axis will be aimed. This variable should contain V3fVectorData. - """, + """), - "label" : "Z Axis", + "label" : _("Z Axis"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsAim", @@ -262,12 +263,12 @@ "inMatrix" : { "description" : - """ + _(""" Name of the primitive variable that defines the input orientations as a matrix. This variable should contain M33fVectorData. - """, + """), - "label" : "Matrix", + "label" : _("Matrix"), "layout:section" : "Settings.Input", "layout:visibilityActivator" : "inModeIsMatrix", @@ -280,24 +281,24 @@ "randomEnabled" : { "description" : - """ + _(""" Enables randomisation of the orientations. Randomisation is applied as a pre-transform of the input orientation. - """, + """), "layout:section" : "Settings.Random", - "label" : "Enabled", + "label" : _("Enabled"), }, "randomAxis" : { "description" : - """ + _(""" A reference axis which the randomisation is specified relative to. Typically this would be the primary axis of the model being instanced. - """, + """), "preset:X" : imath.V3f( 1, 0, 0 ), "preset:Y" : imath.V3f( 0, 1, 0 ), @@ -307,7 +308,7 @@ "presetsPlugValueWidget:allowCustom" : True, "layout:section" : "Settings.Random", - "label" : "Axis", + "label" : _("Axis"), "layout:activator" : "randomEnabled", }, @@ -315,14 +316,14 @@ "randomSpread" : { "description" : - """ + _(""" Applies a random rotation away from the axis, specified in degrees. The maximum spread of 180 degrees gives a uniform randomisation over all possible directions. - """, + """), "layout:section" : "Settings.Random", - "label" : "Spread", + "label" : _("Spread"), "layout:activator" : "randomEnabled", }, @@ -330,13 +331,13 @@ "randomTwist" : { "description" : - """ + _(""" Applies a random rotation around the axis, specified in degrees. - """, + """), "layout:section" : "Settings.Random", - "label" : "Twist", + "label" : _("Twist"), "layout:activator" : "randomEnabled", }, @@ -344,7 +345,7 @@ "randomSpace" : { "description" : - """ + _(""" The space in which the randomisation is specified. This defines how it is combined with the input orientations. @@ -360,10 +361,10 @@ When using the Instancer, this is equivalent to randomising the instances after they are positioned. - """, + """), "layout:section" : "Settings.Random", - "label" : "Space", + "label" : _("Space"), "preset:Local" : GafferScene.Orientation.Space.Local, "preset:Parent" : GafferScene.Orientation.Space.Parent, "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -376,11 +377,11 @@ "outMode" : { "description" : - """ + _(""" The method used to define the output orientations. When creating orientations for the Instancer, the Quaternion mode should be used. - """, + """), "layout:section" : "Settings.Output", "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -393,12 +394,12 @@ "outEuler" : { "description" : - """ + _(""" Name of the primitive variable that will be created to store the output orientations as euler angles, measured in degrees. - """, + """), - "label" : "Euler", + "label" : _("Euler"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsEuler", @@ -407,11 +408,11 @@ "outOrder" : { "description" : - """ + _(""" The rotation order of the output euler angles. - """, + """), - "label" : "Order", + "label" : _("Order"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsEuler", @@ -425,12 +426,12 @@ "outQuaternion" : { "description" : - """ + _(""" Name of the primitive variable that will be created to store the output orientations as quaternions. - """, + """), - "label" : "Quaternion", + "label" : _("Quaternion"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsQuaternion", @@ -442,12 +443,12 @@ "outAxis" : { "description" : - """ + _(""" Name of the primitive variable that will be created to store the axis component of the output orientation. - """, + """), - "label" : "Axis", + "label" : _("Axis"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsAxisAngle", @@ -456,12 +457,12 @@ "outAngle" : { "description" : - """ + _(""" Name of the primitive variable that will be created to store the angle component of the output orientation. - """, + """), - "label" : "Angle", + "label" : _("Angle"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsAxisAngle", @@ -473,12 +474,12 @@ "outXAxis" : { "description" : - """ + _(""" Name of the primitive variable that will be created to store the x-axis aim vector of the output orientation. - """, + """), - "label" : "X Axis", + "label" : _("X Axis"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsAim", @@ -487,12 +488,12 @@ "outYAxis" : { "description" : - """ + _(""" Name of the primitive variable that will be created to store the y-axis aim vector of the output orientation. - """, + """), - "label" : "Y Axis", + "label" : _("Y Axis"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsAim", @@ -501,12 +502,12 @@ "outZAxis" : { "description" : - """ + _(""" Name of the primitive variable that will be created to store the z-axis aim vector of the output orientation. - """, + """), - "label" : "Z Axis", + "label" : _("Z Axis"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsAim", @@ -518,13 +519,13 @@ "outMatrix" : { "description" : - """ + _(""" Name of the primitive variable that will be created to store the output orientations as matrices. The matrices will be stored as M33fVectorData. - """, + """), - "label" : "Matrix", + "label" : _("Matrix"), "layout:section" : "Settings.Output", "layout:visibilityActivator" : "outModeIsMatrix", diff --git a/python/GafferSceneUI/OutputsUI.py b/python/GafferSceneUI/OutputsUI.py index 31716e00d70..15c0a3881d9 100644 --- a/python/GafferSceneUI/OutputsUI.py +++ b/python/GafferSceneUI/OutputsUI.py @@ -47,6 +47,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -57,22 +58,22 @@ GafferScene.Outputs, "description", - """ + _(""" Defines the image outputs to be created by the renderer. Arbitrary outputs can be defined within the UI and also via the `Outputs::addOutput()` API. Commonly used outputs may also be predefined at startup via a config file - see $GAFFER_ROOT/startup/gui/outputs.py for an example. - """, + """), plugs = { "outputs" : { "description" : - """ + _(""" The outputs defined by this node. - """, + """), "plugValueWidget:type" : "GafferSceneUI.OutputsUI.OutputsPlugValueWidget", @@ -87,9 +88,9 @@ "outputs.*.parameters.quantize.value" : { "description" : - """ + _(""" The bit depth of the image. - """, + """), "preset:8 bit" : IECore.IntVectorData( [ 0, 255, 0, 255 ] ), "preset:16 bit" : IECore.IntVectorData( [ 0, 65535, 0, 65535 ] ), @@ -174,7 +175,7 @@ def __addMenuDefinition( self ) : if len( registeredOutputs ) : m.append( "/BlankDivider", { "divider" : True } ) - m.append( "/Blank", { "command" : functools.partial( node.addOutput, "", IECoreScene.Output( "", "", "" ) ) } ) + m.append( "/" + _("Blank"), { "command" : functools.partial( node.addOutput, "", IECoreScene.Output( "", "", "" ) ) } ) return m diff --git a/python/GafferSceneUI/ParametersUI.py b/python/GafferSceneUI/ParametersUI.py index d0bfcf04600..9750569c8ba 100644 --- a/python/GafferSceneUI/ParametersUI.py +++ b/python/GafferSceneUI/ParametersUI.py @@ -37,27 +37,28 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Parameters, "description", - """ + _(""" Modifies the parameters of cameras and procedurals. Existing parameters can be tweaked and new parameters be added. - """, + """), plugs = { "parameters" : { "description" : - """ + _(""" The parameters to be added - any number of arbitrary parameters may be specified here using either the user interface or the CompoundDataPlug API. - """, + """), } diff --git a/python/GafferSceneUI/ParentConstraintUI.py b/python/GafferSceneUI/ParentConstraintUI.py index 9ca2d896b0e..6bfd1d6bcfe 100644 --- a/python/GafferSceneUI/ParentConstraintUI.py +++ b/python/GafferSceneUI/ParentConstraintUI.py @@ -38,6 +38,7 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -48,22 +49,22 @@ GafferScene.ParentConstraint, "description", - """ + _(""" Constrains objects from one part of the scene hierarchy as if they were children of another part of the hierarchy. - """, + """), plugs = { "relativeTransform" : { "description" : - """ + _(""" Transforms the constrained object relative to the target location. > Note : This is ignored when `keepReferencePosition` is on. In this case it is easier > to modify the reference position instead. - """, + """), "layout:section" : "Transform", "layout:activator" : "keepReferencePositionIsOff", diff --git a/python/GafferSceneUI/ParentUI.py b/python/GafferSceneUI/ParentUI.py index 8880a132b3b..a2e853cefc9 100644 --- a/python/GafferSceneUI/ParentUI.py +++ b/python/GafferSceneUI/ParentUI.py @@ -38,6 +38,7 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -48,20 +49,20 @@ GafferScene.Parent, "description", - """ + _(""" Parents additional child hierarchies into the main scene hierarchy. - """, + """), plugs = { "parent" : { "description" : - """ + _(""" The location which the children are parented under. This is ignored when a filter is connected, in which case the children are parented under all the locations matched by the filter. - """, + """), "userDefault" : "/", # Base class hides this if its not in use, but it's still @@ -74,9 +75,9 @@ "children" : { "description" : - """ + _(""" The child hierarchies to be parented. - """, + """), "plugValueWidget:type" : "", "nodule:type" : "GafferUI::CompoundNodule", @@ -87,18 +88,18 @@ "parentVariable" : { "description" : - """ + _(""" A context variable used to pass the location of the parent to the upstream nodes connected into the `children` plug. This can be used to procedurally vary the children at each different parent location. - """, + """), }, "destination" : { "description" : - """ + _(""" The location where the children will be placed in the output scene. The default is to place the children under the parent, but they may be relocated anywhere while still inheriting the parent's transform. @@ -109,7 +110,7 @@ the source location matched by the filter. This allows the children to be placed relative to the "parent". For example, `${scene:path}/..` will place the children alongside the "parent" rather than under it. - """, + """), }, diff --git a/python/GafferSceneUI/PathFilterUI.py b/python/GafferSceneUI/PathFilterUI.py index a3d6a2a8912..93639e9da16 100644 --- a/python/GafferSceneUI/PathFilterUI.py +++ b/python/GafferSceneUI/PathFilterUI.py @@ -46,6 +46,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -56,10 +57,10 @@ GafferScene.PathFilter, "description", - """ + _(""" Chooses locations by matching them against a list of paths. - """, + """), "ui:spreadsheet:enabledRowNamesConnection", "paths", "ui:spreadsheet:selectorValue", "${scene:path}", @@ -69,7 +70,7 @@ "paths" : { "description" : - """ + _(""" The list of paths to the locations to be matched by the filter. A path is formed by a sequence of names separated by `/`, and specifies the hierarchical position of a location within the scene. @@ -89,7 +90,7 @@ the hierarchy. - `/.../house` matches `/house`, `/street/house` and `/city/street/house`. - """, + """), "nodule:type" : "", "ui:scene:acceptsPaths" : True, @@ -103,13 +104,13 @@ "roots" : { "description" : - """ + _(""" An optional filter input used to provide multiple root locations which the `paths` are relative to. This can be useful when working on a single asset in isolation, and then placing it into multiple locations within a layout. When no filter is connected, all `paths` are treated as being relative to `/`, the true scene root. - """, + """), "plugValueWidget:type" : "", @@ -172,7 +173,7 @@ def __dataMenu( self, vectorDataWidget, menuDefinition ) : menuDefinition.append( "/selectDivider", { "divider" : True } ) menuDefinition.append( - "/Select Affected Objects", + "/" + _("Select Affected Objects"), { "command" : functools.partial( _selectAffected, pathMatcher, scenes ), "active" : len( selectedIndices ) > 0 and len( scenes ) > 0, diff --git a/python/GafferSceneUI/PlaneUI.py b/python/GafferSceneUI/PlaneUI.py index 649a47d1998..2085674dc21 100644 --- a/python/GafferSceneUI/PlaneUI.py +++ b/python/GafferSceneUI/PlaneUI.py @@ -36,34 +36,35 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Plane, "description", - """ + _(""" Produces scenes containing a plane. - """, + """), plugs = { "dimensions" : { "description" : - """ + _(""" The size of the plane in the X and Y directions. - """, + """), }, "divisions" : { "description" : - """ + _(""" The number of subdivisions of the plane in the X and Y directions. - """, + """), }, diff --git a/python/GafferSceneUI/PointConstraintUI.py b/python/GafferSceneUI/PointConstraintUI.py index a5e8f736795..789f711e4a4 100644 --- a/python/GafferSceneUI/PointConstraintUI.py +++ b/python/GafferSceneUI/PointConstraintUI.py @@ -36,17 +36,18 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.PointConstraint, "description", - """ + _(""" Translates objects so that they are constrained to the world space position of the target. Leaves the scale and orientation of the object untouched. - """, + """), plugs = { @@ -59,40 +60,40 @@ "xEnabled" : { "description" : - """ + _(""" Enables the constraint in the world space x axis. - """, + """), }, "yEnabled" : { "description" : - """ + _(""" Enables the constraint in the world space y axis. - """, + """), }, "zEnabled" : { "description" : - """ + _(""" Enables the constraint in the world space z axis. - """, + """), }, "offset" : { "description" : - """ + _(""" A world space translation offset applied on top of the target position. > Note : This is ignored when `keepReferencePosition` is on. In this case it is easier > to modify the reference position instead. - """, + """), "layout:activator" : "keepReferencePositionIsOff", diff --git a/python/GafferSceneUI/PointsTypeUI.py b/python/GafferSceneUI/PointsTypeUI.py index 159148b141b..381372864ab 100644 --- a/python/GafferSceneUI/PointsTypeUI.py +++ b/python/GafferSceneUI/PointsTypeUI.py @@ -37,26 +37,27 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.PointsType, "description", - """ + _(""" Changes the render type for PointsPrimitive objects. Depending on the renderer, points may be rendered as particles, spheres, disks, patches or blobbies. - """, + """), plugs = { "type" : { "description" : - """ + _(""" The render type to assign. - """, + """), "preset:Unchanged" : "", "preset:Particle" : "particle", diff --git a/python/GafferSceneUI/PrimitiveInspector.py b/python/GafferSceneUI/PrimitiveInspector.py index ad94e6fdf66..b532cafcc4c 100644 --- a/python/GafferSceneUI/PrimitiveInspector.py +++ b/python/GafferSceneUI/PrimitiveInspector.py @@ -41,6 +41,7 @@ import IECoreScene import GafferUI +from GafferUI.i18n import _ import GafferSceneUI import collections @@ -181,11 +182,11 @@ def listContainer( child ) : self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.FaceVarying] = listContainer( self.__dataWidgets[IECoreScene.PrimitiveVariable.Interpolation.FaceVarying] ) - self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.Constant], "Constant" ) - self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.Uniform], "Uniform" ) - self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.Vertex], "Vertex" ) - self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.Varying], "Varying" ) - self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.FaceVarying], "FaceVarying" ) + self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.Constant], _("Constant") ) + self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.Uniform], _("Uniform") ) + self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.Vertex], _("Vertex") ) + self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.Varying], _("Varying") ) + self.__tabbedContainer.append( self.__tabbedChildWidgets[IECoreScene.PrimitiveVariable.Interpolation.FaceVarying], _("FaceVarying") ) self.__selectedPathsChangedConnection = GafferSceneUI.ScriptNodeAlgo.selectedPathsChangedSignal( scriptNode ).connect( Gaffer.WeakMethod( self.__selectedPathsChanged ) @@ -281,7 +282,7 @@ def __backgroundUpdatePostCall( self, backgroundResult ) : t = toolTips.get( interpolation, [] ) self.__tabbedContainer.setLabel( self.__tabbedChildWidgets[interpolation], - str( interpolation ) + ( " ({0})".format( len( pv ) ) if pv else "" ) ) + _( str( interpolation ) ) + ( " ({0})".format( len( pv ) ) if pv else "" ) ) self.__dataWidgets[interpolation].setToolTips( t ) self.__dataWidgets[interpolation].setHeader( h ) @@ -293,7 +294,7 @@ def __backgroundUpdatePostCall( self, backgroundResult ) : self.__dataWidgets[interpolation].setData( None ) self.__dataWidgets[interpolation].setToolTips( [] ) - self.__tabbedContainer.setLabel( self.__tabbedChildWidgets[interpolation], str( interpolation ) ) + self.__tabbedContainer.setLabel( self.__tabbedChildWidgets[interpolation], _( str( interpolation ) ) ) GafferUI.Editor.registerType( "PrimitiveInspector", PrimitiveInspector ) @@ -309,10 +310,10 @@ def __backgroundUpdatePostCall( self, backgroundResult ) : "location" : { "description" : - """ + _(""" The scene location to inspect. Defaults to the currently selected location. Use the HierarchyView or Viewer to select a location. - """, + """), "plugValueWidget:type" : "GafferSceneUI.SceneInspector._LocationPlugValueWidget", diff --git a/python/GafferSceneUI/PrimitiveSamplerUI.py b/python/GafferSceneUI/PrimitiveSamplerUI.py index ac5d3903306..a994df2eaa6 100644 --- a/python/GafferSceneUI/PrimitiveSamplerUI.py +++ b/python/GafferSceneUI/PrimitiveSamplerUI.py @@ -36,47 +36,48 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.PrimitiveSampler, "description", - """ + _(""" Base class for nodes which sample primitive variables from another primitive. - """, + """), plugs = { "filter" : { "description" : - """ + _(""" The filter used to determine which objects in the `in` scene will receive primitive variables sampled from the `sourceLocation` in the `source` scene. - """, + """), }, "source" : { "description" : - """ + _(""" The scene that contains the source primitive that primitive variables will be sampled from. - """, + """), }, "sourceLocation" : { "description" : - """ + _(""" The location of the primitive in the `source` scene that will be sampled from. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "source", @@ -86,24 +87,24 @@ "primitiveVariables" : { "description" : - """ + _(""" The names of the primitive variables to be sampled from the source primitive. These should be separated by spaces and can use Gaffer's standard wildcards to match multiple variables. The sampled variables are prefixed with `prefix` before being added to the sampling object. - """, + """), }, "prefix" : { "description" : - """ + _(""" A prefix applied to the names of the sampled primitive variables before they are added to the sampling object. This is particularly useful when sampling something like "P", and not not wanting to modify the true vertex positions of the sampling primitive. - """, + """), "layout:section" : "Settings.Output", @@ -112,10 +113,10 @@ "status" : { "description" : - """ + _(""" The name of a boolean primitive variable created to record the success or failure of the sampling operation. - """, + """), "layout:section" : "Settings.Output", diff --git a/python/GafferSceneUI/PrimitiveVariableExistsUI.py b/python/GafferSceneUI/PrimitiveVariableExistsUI.py index 969acc29da2..16793840c8b 100644 --- a/python/GafferSceneUI/PrimitiveVariableExistsUI.py +++ b/python/GafferSceneUI/PrimitiveVariableExistsUI.py @@ -36,28 +36,29 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.PrimitiveVariableExists, "description", - """ + _(""" Returns true if the given primitive variable exists in the input scene in the current scene path location. - """, + """), plugs = { "in" : { - "description" : "The scene to look for variables in.", + "description" : _("The scene to look for variables in."), }, "primitiveVariable" : { - "description" : "The name of the primitive vairable to check for.", + "description" : _("The name of the primitive vairable to check for."), "nodule:type" : "", }, "out" : { - "description" : "True if the given primitive variable exists.", + "description" : _("True if the given primitive variable exists."), }, } diff --git a/python/GafferSceneUI/PrimitiveVariableProcessorUI.py b/python/GafferSceneUI/PrimitiveVariableProcessorUI.py index 4d92236e9ac..3561e9df52e 100644 --- a/python/GafferSceneUI/PrimitiveVariableProcessorUI.py +++ b/python/GafferSceneUI/PrimitiveVariableProcessorUI.py @@ -36,38 +36,39 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.PrimitiveVariableProcessor, "description", - """ + _(""" Base class for nodes which modify PrimitiveVariables on objects in the scene hierarchy. - """, + """), plugs = { "names" : { "description" : - """ + _(""" The names of the primitive variables to be affected. Names should be separated by spaces, and Gaffer's standard wildcard characters may be used. - """, + """), }, "invertNames" : { "description" : - """ + _(""" When on, the primitive variables matched by names are unaffected, and the non-matching primitive variables are affected instead. - """, + """), }, diff --git a/python/GafferSceneUI/PrimitiveVariableQueryUI.py b/python/GafferSceneUI/PrimitiveVariableQueryUI.py index 66153e7e782..cd620388e06 100644 --- a/python/GafferSceneUI/PrimitiveVariableQueryUI.py +++ b/python/GafferSceneUI/PrimitiveVariableQueryUI.py @@ -45,6 +45,7 @@ import GafferUI import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Internal utilities @@ -194,30 +195,30 @@ def childPlugValueWidget( self, childPlug ) : GafferScene.PrimitiveVariableQuery, "description", - """ + _(""" Queries primitive variables at a scene location, creating an output for each primitive variable. - """, + """), plugs = { "scene" : { "description" : - """ + _(""" The scene to query the primitive variable from. - """, + """), }, "location" : { "description" : - """ + _(""" The location within the scene to query the primitive variable at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -228,13 +229,13 @@ def childPlugValueWidget( self, childPlug ) : "queries" : { "description" : - """ + _(""" The primitive variables to be queried - arbitrary numbers of primitive variables may be added as children of this plug via the user interface, or via python. Each child is a `NameValuePlug` whose `name` plug is the name of the primitive variable to query, and whose `value` plug is the default value to use if the primitive variable can not be retrieved. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -248,37 +249,37 @@ def childPlugValueWidget( self, childPlug ) : "queries.*" : { "description" : - """ + _(""" A pair of primitive variable name to query and default value. - """, + """), }, "queries.*.name" : { "description" : - """ + _(""" The name of the primitive variable to query. - """, + """), }, "queries.*.value" : { "description" : - """ + _(""" The value to output if the primitive variable does not exist. - """, + """), }, "out" : { "description" : - """ + _(""" The parent plug of the query outputs. The order of outputs corresponds to the order of children of `queries`. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -293,9 +294,9 @@ def childPlugValueWidget( self, childPlug ) : "out.*" : { "description" : - """ + _(""" The result of the query. - """, + """), "label" : functools.partial( __getLabel, parentPlug = ""), @@ -308,9 +309,9 @@ def childPlugValueWidget( self, childPlug ) : "out.*.exists" : { "description" : - """ + _(""" Outputs true if the primitive variable exists, otherwise false. - """, + """), "noduleLayout:label" : functools.partial( __getLabel, parentPlug = "exists" ), @@ -319,10 +320,10 @@ def childPlugValueWidget( self, childPlug ) : "out.*.value" : { "description" : - """ + _(""" Outputs the value of the primitive variable, or the default value if the primitive variable does not exist. - """, + """), }, @@ -335,10 +336,10 @@ def childPlugValueWidget( self, childPlug ) : "out.*.type" : { "description" : - """ + _(""" Outputs the type of the primitive variable data, or empty string if the primitive variable does not exist. - """, + """), "noduleLayout:label" : functools.partial( __getLabel, parentPlug = "type" ), @@ -347,10 +348,10 @@ def childPlugValueWidget( self, childPlug ) : "out.*.interpolation" : { "description" : - """ + _(""" Outputs the interpolation of the primitive variable, or `Invalid` if the primitive variable does not exist. - """, + """), "preset:Invalid" : IECoreScene.PrimitiveVariable.Interpolation.Invalid, "preset:Constant" : IECoreScene.PrimitiveVariable.Interpolation.Constant, @@ -494,7 +495,7 @@ def __plugPopupMenu( menuDefinition, plugValueWidget ) : if len( menuDefinition.items() ) : menuDefinition.append( "/DeleteDivider", { "divider" : True } ) - menuDefinition.append( "/Delete", { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) + menuDefinition.append( "/" + _("Delete"), { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) def __deletePlug( plug ) : diff --git a/python/GafferSceneUI/PrimitiveVariableTweaksUI.py b/python/GafferSceneUI/PrimitiveVariableTweaksUI.py index 086db8b984f..ac94d121e43 100644 --- a/python/GafferSceneUI/PrimitiveVariableTweaksUI.py +++ b/python/GafferSceneUI/PrimitiveVariableTweaksUI.py @@ -45,6 +45,7 @@ import GafferUI import GafferScene import GafferSceneUI +from GafferUI.i18n import _ def __primVarTweaksSelectionModeEnabled( node ): return not node["interpolation"].getValue() in [ @@ -57,10 +58,10 @@ def __primVarTweaksSelectionModeEnabled( node ): GafferScene.PrimitiveVariableTweaks, "description", - """ + _(""" Modify primitive variable values. Supports modifying values just for specific elements of the primitive. - """, + """), "layout:activator:selectionModeEnabled", lambda node : __primVarTweaksSelectionModeEnabled( node ), "layout:activator:idListExplicitVisible", lambda node : __primVarTweaksSelectionModeEnabled( node ) and node["selectionMode"].getValue() == GafferScene.PrimitiveVariableTweaks.SelectionMode.IdList, @@ -76,13 +77,13 @@ def __primVarTweaksSelectionModeEnabled( node ): "interpolation" : { "description" : - """ + _(""" The interpolation of the target primitive variables. Using "Any" allows you to operate on any primitive variable, but if you know your target, using a more specific interpolation offers benefits: you can specify an idList to operate on specific elements, and you can use "Create" mode to create new primitive variables. - """, + """), "preset:Any" : IECoreScene.PrimitiveVariable.Interpolation.Invalid, "preset:Constant" : IECoreScene.PrimitiveVariable.Interpolation.Constant, @@ -98,7 +99,7 @@ def __primVarTweaksSelectionModeEnabled( node ): "selectionMode" : { "description" : - """ + _(""" Chooses how to select which elements are affected. Only takes effect if you choose an interpolation other than "Any" or "Constant". "Id List" shows a list plug to manually select ids. "Id List Primitive Variable" takes @@ -106,7 +107,7 @@ def __primVarTweaksSelectionModeEnabled( node ): "Mask Primitive Variable" takes the name of a primvar that must match the selected interpolation - the tweak will apply to all elements where the primitive variable is non-zero. - """, + """), "preset:All" : GafferScene.PrimitiveVariableTweaks.SelectionMode.All, "preset:Id List" : GafferScene.PrimitiveVariableTweaks.SelectionMode.IdList, @@ -122,12 +123,12 @@ def __primVarTweaksSelectionModeEnabled( node ): "idList" : { "description" : - """ + _(""" A list of ids for the elements to affect, corresponding to the current interpolation. For example, if you choose "Vertex" interpolation, these will be vertex ids. By default, ids are based on the index, but if you specify an id primitive variable below, the ids in this list will match the id primitive variable. - """, + """), "layout:visibilityActivator" : "idListExplicitVisible", @@ -136,12 +137,12 @@ def __primVarTweaksSelectionModeEnabled( node ): "idListVariable" : { "description" : - """ + _(""" The name of a constant primitive variable containing a list of ids for the elements to affect, corresponding to the current interpolation. For example, if you choose "Vertex" interpolation, these will be vertex ids. By default, ids are based on the index, but if you specify an id primitive variable below, the ids in this list will match the id primitive variable. - """, + """), "layout:visibilityActivator" : "idListVarVisible", @@ -150,9 +151,9 @@ def __primVarTweaksSelectionModeEnabled( node ): "id" : { "description" : - """ + _(""" The name of the primitive variable to use as ids. Affects which elements are selected by the idList. - """, + """), "layout:visibilityActivator" : "idListVisible", @@ -161,10 +162,10 @@ def __primVarTweaksSelectionModeEnabled( node ): "maskVariable" : { "description" : - """ + _(""" The name of a primitive variable containing a mask. The variable must match the specified interpolation. Any elements where the mask variable is non-zero will be tweaked. - """, + """), "layout:visibilityActivator" : "maskVarVisible", @@ -173,9 +174,9 @@ def __primVarTweaksSelectionModeEnabled( node ): "invertSelection" : { "description" : - """ + _(""" Swaps which elements are tweaked/not tweaked. - """, + """), "layout:visibilityActivator" : "selectionNotAll", @@ -184,20 +185,20 @@ def __primVarTweaksSelectionModeEnabled( node ): "ignoreMissing" : { "description" : - """ + _(""" Ignores tweaks targeting missing primitive variables. When off, missing primitive variables cause the node to error. - """, + """), }, "tweaks" : { "description" : - """ + _(""" The tweaks to be made to the primitive variables. Arbitrary numbers of user defined tweaks may be added as children of this plug. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", "layout:customWidget:footer:widgetType" : "GafferSceneUI.PrimitiveVariableTweaksUI._TweaksFooter", @@ -216,10 +217,10 @@ def __primVarTweaksSelectionModeEnabled( node ): "tweaks.*.value" : { "description" : - """ + _(""" For a constant primitive variable, this is just the value of the primitive variable. For non-constant primitive variables, this is the value for each element. - """, + """), } } ) diff --git a/python/GafferSceneUI/PrimitiveVariablesUI.py b/python/GafferSceneUI/PrimitiveVariablesUI.py index 6787fadec8c..01a16f0d504 100644 --- a/python/GafferSceneUI/PrimitiveVariablesUI.py +++ b/python/GafferSceneUI/PrimitiveVariablesUI.py @@ -38,29 +38,30 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.PrimitiveVariables, "description", - """ + _(""" Adds arbitrary primitive variables to objects. Currently only primitive variables with constant interpolation are supported - see the OSLObject node for a means of creating variables with vertex interpolation. - """, + """), plugs = { "primitiveVariables" : { "description" : - """ + _(""" The primitive variables to be applied - arbitrary numbers of user defined primitive variables may be added as children of this plug via the user interface, or using the CompoundDataPlug API via python. - """, + """), } diff --git a/python/GafferSceneUI/PruneUI.py b/python/GafferSceneUI/PruneUI.py index 344f122557a..febd939c43b 100644 --- a/python/GafferSceneUI/PruneUI.py +++ b/python/GafferSceneUI/PruneUI.py @@ -36,37 +36,38 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Prune, "description", - """ + _(""" A node for removing whole branches from the scene hierarchy. - """, + """), plugs = { "filter" : { "description" : - """ + _(""" Filter to specify the branches to prune. The specified locations and all locations below them will be removed from the scene. - """, + """), }, "adjustBounds" : { "description" : - """ + _(""" Computes new tightened bounding boxes taking into account the removed locations. This can be an expensive operation - turn on with care. - """, + """), }, diff --git a/python/GafferSceneUI/RenameUI.py b/python/GafferSceneUI/RenameUI.py index 47517851dcc..3c5ce3acab5 100644 --- a/python/GafferSceneUI/RenameUI.py +++ b/python/GafferSceneUI/RenameUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Rename, "description", - """ + _(""" Renames locations in the scene. - """, + """), "layout:activator:nameIsSetToDefault", lambda node : node["name"].isSetToDefault(), @@ -53,7 +54,7 @@ "name" : { "description" : - """ + _(""" The new name for the location. If this name is non-empty then it takes precedence, and all other renaming operations are ignored. @@ -61,7 +62,7 @@ > location's original name, and can be used in a Spreadsheet's > `selector` to allow each row to define the new name for a > particular location. - """, + """), "layout:divider" : True, @@ -72,11 +73,11 @@ "deletePrefix" : { "description" : - """ + _(""" A prefix to remove from the start of the original name. Prefixes are removed before the suffixes and before the find and replace operation is performed. - """, + """), "layout:activator" : "nameIsSetToDefault", @@ -85,10 +86,10 @@ "deleteSuffix" : { "description" : - """ + _(""" A suffix to remove from the start of the original name. Suffixes are removed before the find and replace operation is performed. - """, + """), "layout:activator" : "nameIsSetToDefault", "layout:divider" : True, @@ -98,7 +99,7 @@ "find" : { "description" : - """ + _(""" A string to search for within the original name. All occurrences of this string will be replaced with the value of `replace`. When `useRegularExpressions` is on, the search string is treated as a regular expression, with the @@ -133,7 +134,7 @@ - `()` : Captures the subgroup of the pattern within the brackets, allowing it to be referenced by `{}` in the `replace` string. - """, + """), "layout:activator" : "nameIsSetToDefault", @@ -142,7 +143,7 @@ "replace" : { "description" : - """ + _(""" The replacement for strings matched by the `find` plug. When `useRegularExpressions` is on, this can refer to captured patterns using Python's standard string formatting @@ -152,7 +153,7 @@ - `{1}` : The 1st subgroup captured within `()` brackets by the `find` string. - `{N}` : The Nth subgroup captured within `()` brackets by the `find` string. - `{1:0>4}` : The 1st subgroup, aligned to the right and padded to width 4. - """, + """), "layout:activator" : "nameIsSetToDefault", @@ -161,11 +162,11 @@ "useRegularExpressions" : { "description" : - """ + _(""" When on, the `find` string is treated as a regular expression, allowing it to perform complex pattern matching and to capture sections of the match to be referenced by the `replace` string. - """, + """), "layout:activator" : "nameIsSetToDefault", "layout:divider" : True, @@ -175,11 +176,11 @@ "addPrefix" : { "description" : - """ + _(""" A string to add at the start of the name. Prefixes are added last, after the find and replace operation has been performed. - """, + """), "layout:activator" : "nameIsSetToDefault", @@ -188,11 +189,11 @@ "addSuffix" : { "description" : - """ + _(""" A string to add at the end of the name. Suffixes are added last, after the find and replace operation has been performed. - """, + """), "layout:activator" : "nameIsSetToDefault", diff --git a/python/GafferSceneUI/RenderPassEditor.py b/python/GafferSceneUI/RenderPassEditor.py index 106cf47d57b..ee24cc30a53 100644 --- a/python/GafferSceneUI/RenderPassEditor.py +++ b/python/GafferSceneUI/RenderPassEditor.py @@ -45,8 +45,10 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferImage import GafferScene +from GafferSceneUI._InspectorColumn import _isInspectorColumn import GafferSceneUI from GafferUI.PlugValueWidget import sole @@ -200,7 +202,7 @@ def __optionColumnCreator( cls, optionName, section, columnName = None ) : return lambda scene, editScope : GafferSceneUI.Private.InspectorColumn( GafferSceneUI.Private.OptionInspector( scene, editScope, optionName ), - columnName, + _(columnName), toolTip ) @@ -460,7 +462,7 @@ def __orderedColumns( columnsAndIndices ) : def __favouriteColumn( self, column, favourite ) : - if not isinstance( column, GafferSceneUI.Private.InspectorColumn ) : + if not _isInspectorColumn( column ) : return inspector = column.inspector( self.__pathListing.getPath() ) @@ -530,13 +532,14 @@ def __headerContextMenuRequested( self, pos ) : m = IECore.MenuDefinition() userEditableSection = self.__currentSectionEditable() - if isinstance( column, GafferSceneUI.Private.InspectorColumn ) : + if _isInspectorColumn( column ) : if userEditableSection : m.append( "/Remove", { "command" : functools.partial( Gaffer.WeakMethod( self.__favouriteColumn ), column, False ), + "label" : _("Remove"), } ) else : @@ -545,6 +548,7 @@ def __headerContextMenuRequested( self, pos ) : { "command" : functools.partial( Gaffer.WeakMethod( self.__favouriteColumn ), column ), "checkBox" : "option:{}".format( column.inspector( self.__pathListing.getPath() ).name() ) in self.settings()["favouriteColumns"].getValue(), + "label" : _("Favourite"), } ) @@ -554,6 +558,7 @@ def __headerContextMenuRequested( self, pos ) : "/Remove All", { "command" : Gaffer.WeakMethod( self.__resetFavourites ), + "label" : _("Remove All"), } ) @@ -564,6 +569,7 @@ def __headerContextMenuRequested( self, pos ) : "/Reset to Default", { "command" : functools.partial( Gaffer.WeakMethod( self.__resetFavourites ), True ), + "label" : _("Reset to Default"), } ) @@ -573,6 +579,7 @@ def __headerContextMenuRequested( self, pos ) : "/Save as Default", { "command" : Gaffer.WeakMethod( self.__saveFavourites ), + "label" : _("Save as Default"), } ) @@ -726,7 +733,7 @@ def __setActiveRenderPass( self, pathListing ) : script = self.scriptNode() if Gaffer.MetadataAlgo.readOnly( script ) : - GafferUI.PopupWindow.showWarning( "The script is read-only.", parent = self ) + GafferUI.PopupWindow.showWarning( _("The script is read-only."), parent = self ) return with Gaffer.UndoScope( script ) : @@ -753,7 +760,8 @@ def __columnContextMenuSignal( self, column, pathListing, menuDefinition ) : "Rename Selected Render Pass...", { "command" : Gaffer.WeakMethod( self.__renameSelectedRenderPass ), - "active" : self.__canEditRenderPasses() and len( self.__selectedRenderPasses() ) == 1 + "active" : self.__canEditRenderPasses() and len( self.__selectedRenderPasses() ) == 1, + "label" : _("Rename Selected Render Pass..."), } ) @@ -763,7 +771,8 @@ def __columnContextMenuSignal( self, column, pathListing, menuDefinition ) : "Delete Selected Render Passes", { "command" : Gaffer.WeakMethod( self.__deleteSelectedRenderPasses ), - "active" : self.__canEditRenderPasses() + "active" : self.__canEditRenderPasses(), + "label" : _("Delete Selected Render Passes"), } ) @@ -837,17 +846,17 @@ def __renameSelectedRenderPass( self ) : renderPassesProcessor = editScope.acquireProcessor( "RenderPasses", createIfNecessary = False ) if renderPassesProcessor is None or selectedRenderPasses[0] not in renderPassesProcessor["names"].getValue() : - self.__warningPopup( "Unable to rename", "Pass was not created in {}.".format( editScope.relativeName( self.scriptNode() ) ) ) + self.__warningPopup( _("Unable to rename"), _("Pass was not created in {}.").format( editScope.relativeName( self.scriptNode() ) ) ) return dialogue = _RenderPassCreationDialogue( existingNames = [ x for x in self.__renderPassNames( self.settings()["in"] ) if x != selectedRenderPasses[0] ], editScope = editScope, - title = "Rename Render Pass", - confirmLabel = "Rename", - actionDescription = "Rename render pass in", + title = _("Rename Render Pass"), + confirmLabel = _("Rename"), + actionDescription = _("Rename render pass in"), defaultName = selectedRenderPasses[0], - message = "

Renaming will only affect the current edit scope.

\nReferences elsewhere in the node graph may need to be updated manually." + message = _("

Renaming will only affect the current edit scope.

\nReferences elsewhere in the node graph may need to be updated manually.") ) renderPassName = dialogue.waitForRenderPassName( parentWindow = self.ancestor( GafferUI.Window ) ) @@ -855,7 +864,7 @@ def __renameSelectedRenderPass( self ) : nonEditableReason = GafferScene.EditScopeAlgo.renameRenderPassNonEditableReason( editScope, renderPassName ) if nonEditableReason is not None : - self.__warningPopup( "Unable to rename", nonEditableReason ) + self.__warningPopup( _("Unable to rename"), nonEditableReason ) return with Gaffer.UndoScope( editScope.ancestor( Gaffer.ScriptNode ) ) : @@ -916,15 +925,15 @@ def __deleteSelectedRenderPasses( self ) : if upstreamCount > 0 : dialogue = GafferUI.ConfirmationDialogue( - "Unable to Delete Upstream Render Passes", - "{count} render pass{suffix} created upstream of {editScopeName}.

We recommend deleting {target} in the upstream Edit Scope, or disabling {target} in {editScopeName}.".format( + _("Unable to Delete Upstream Render Passes"), + _("{count} render pass{suffix} created upstream of {editScopeName}.

We recommend deleting {target} in the upstream Edit Scope, or disabling {target} in {editScopeName}.").format( count = upstreamCount, suffix = "es were" if upstreamCount != 1 else " was", editScopeName = editScope.relativeName( self.scriptNode() ), target = "them" if upstreamCount != 1 else "it" ), details = "\n".join( sorted( upstreamSelection ) ), - confirmLabel = "Disable Render Pass{}".format( "es" if upstreamCount != 1 else "" ), + confirmLabel = _("Disable Render Pass{}").format( "es" if upstreamCount != 1 else "" ), ) if dialogue.waitForConfirmation( parentWindow = self.ancestor( GafferUI.Window ) ) : self.__disableRenderPasses( upstreamSelection, editScope ) @@ -938,15 +947,15 @@ def __deleteSelectedRenderPasses( self ) : if downstreamCount > 0 : dialogue = GafferUI.ConfirmationDialogue( - "Unable to Delete Downstream Render Passes", - "{count} render pass{suffix} created downstream of {editScopeName}.

We recommend deleting {target} in the downstream Edit Scope.".format( + _("Unable to Delete Downstream Render Passes"), + _("{count} render pass{suffix} created downstream of {editScopeName}.

We recommend deleting {target} in the downstream Edit Scope.").format( count = downstreamCount, suffix = "es were" if downstreamCount != 1 else " was", editScopeName = editScope.relativeName( self.scriptNode() ), target = "them" if downstreamCount != 1 else "it" ), details = "\n".join( sorted( downstreamSelection ) ), - confirmLabel = "Close", + confirmLabel = _("Close"), cancelLabel = None ) dialogue.waitForConfirmation( parentWindow = self.ancestor( GafferUI.Window ) ) @@ -1008,15 +1017,15 @@ def __updateButtonStatus( self, *unused ) : self.__removeButton.setEnabled( editable and selection ) if not editable : - removeToolTip = "To delete render passes, first choose an editable Edit Scope." + removeToolTip = _("To delete render passes, first choose an editable Edit Scope.") elif not selection : - removeToolTip = "To delete render passes, select them from the Name column." + removeToolTip = _("To delete render passes, select them from the Name column.") else : - removeToolTip = "Click to delete selected render passes." + removeToolTip = _("Click to delete selected render passes.") self.__removeButton.setToolTip( removeToolTip ) self.__addButton.setEnabled( editable ) - self.__addButton.setToolTip( "Click to add render pass." if editable else "To add a render pass, first choose an editable Edit Scope." ) + self.__addButton.setToolTip( _("Click to add render pass.") if editable else _("To add a render pass, first choose an editable Edit Scope.") ) GafferUI.Editor.registerType( "RenderPassEditor", RenderPassEditor ) @@ -1028,11 +1037,11 @@ def __init__( self, *args ) : def cellData( self, path, canceller ) : - return GafferUI.PathColumn.CellData( value = "", toolTip = "Click on the header to add columns." ) + return GafferUI.PathColumn.CellData( value = "", toolTip = _("Click on the header to add columns.") ) def headerData( self, canceller ) : - return GafferUI.PathColumn.CellData( value = "", icon = IECore.CompoundData( { "state:normal" : "plus.png", "state:highlighted" : "plusHighlighted.png" } ), toolTip = "Click to add columns." ) + return GafferUI.PathColumn.CellData( value = "", icon = IECore.CompoundData( { "state:normal" : "plus.png", "state:highlighted" : "plusHighlighted.png" } ), toolTip = _("Click to add columns.") ) ########################################################################## # Metadata controlling the settings UI @@ -1080,9 +1089,9 @@ def headerData( self, canceller ) : "displayGrouped" : { "description" : - """ + _(""" Click to toggle between list and grouped display of render passes. - """, + """), "layout:section" : "Filter", "layout:divider" : True, @@ -1095,9 +1104,9 @@ def headerData( self, canceller ) : "filter" : { "description" : - """ + _(""" Filters the displayed render passes. Accepts standard wildcards such as `*` and `?`. - """, + """), "plugValueWidget:type" : "GafferUI.TogglePlugValueWidget", "togglePlugValueWidget:imagePrefix" : "search", @@ -1110,9 +1119,9 @@ def headerData( self, canceller ) : "hideDisabled" : { "description" : - """ + _(""" Hides render passes that are disabled for rendering. - """, + """), "boolPlugValueWidget:labelVisible" : True, "layout:section" : "Filter", @@ -1209,7 +1218,7 @@ def __init__( self, plug, **kw ) : def _updateFromValues( self, values, exception ) : for i in range( 0, self._qtWidget().count() ) : - if self._qtWidget().tabText( i ) == values[0] : + if self._qtWidget().tabData( i ) == values[0] : try : self.__ignoreCurrentChanged = True self._qtWidget().setCurrentIndex( i ) @@ -1223,9 +1232,9 @@ def __currentChanged( self, index ) : return index = self._qtWidget().currentIndex() - text = self._qtWidget().tabText( index ) + originalName = self._qtWidget().tabData( index ) with self._blockedUpdateFromValues() : - self.getPlug().setValue( text ) + self.getPlug().setValue( originalName if originalName else "" ) def __updateTabs( self ) : @@ -1243,9 +1252,11 @@ def __updateTabs( self ) : # Deduplicate sections while preserving order in case the same # section has been registered to multiple matching groupKeys. for name in list( dict.fromkeys( tabNames ) ) : - self._qtWidget().addTab( name ) + idx = self._qtWidget().addTab( _(name) ) + self._qtWidget().setTabData( idx, name ) - self._qtWidget().addTab( "Favourites" ) + idx = self._qtWidget().addTab( _("Favourites") ) + self._qtWidget().setTabData( idx, "Favourites" ) finally : self.__ignoreCurrentChanged = False @@ -1270,7 +1281,7 @@ def __init__( self, settingsNode, **kw ) : class _RenderPassCreationDialogue( GafferUI.Dialogue ) : - def __init__( self, existingNames = [], editScope = None, title = "Add Render Pass", cancelLabel = "Cancel", confirmLabel = "Add", actionDescription = "Add render pass to", defaultName = "", message = "", **kw ) : + def __init__( self, existingNames = [], editScope = None, title = _("Add Render Pass"), cancelLabel = _("Cancel"), confirmLabel = _("Add"), actionDescription = _("Add render pass to"), defaultName = "", message = "", **kw ) : GafferUI.Dialogue.__init__( self, title, sizeMode=GafferUI.Window.SizeMode.Fixed, **kw ) @@ -1341,7 +1352,7 @@ def __updateButtonState( self, *unused ) : self.__confirmButton.setEnabled( unique and name != "" ) self.__confirmButton.setImage( None if unique else "warningSmall.png" ) - self.__confirmButton.setToolTip( "" if unique else "A render pass named '{}' already exists.".format( name ) ) + self.__confirmButton.setToolTip( "" if unique else _("A render pass named '{}' already exists.").format( name ) ) class RenderPassChooserWidget( GafferUI.Widget ) : @@ -1419,7 +1430,7 @@ def __init__( self, plug, showLabel = False, **kw ) : with self.__listContainer : if showLabel : - GafferUI.Label( "Render Pass" ) + GafferUI.Label( _("Render Pass") ) self.__busyWidget = GafferUI.BusyWidget( size = 18 ) self.__busyWidget.setVisible( False ) searchable = Gaffer.Metadata.value( plug, "renderPassPlugValueWidget:searchable" ) @@ -1447,12 +1458,12 @@ def __del__( self ) : def getToolTip( self ) : if self.__currentRenderPass == "" : - return "No render pass is active." + return _("No render pass is active.") if self.__currentRenderPass not in self.__renderPasses : - return "{} is not available.".format( self.__currentRenderPass ) + return _("{} is not available.").format( self.__currentRenderPass ) else : - return "{} is the current render pass.".format( self.__currentRenderPass ) + return _("{} is the current render pass.").format( self.__currentRenderPass ) def _auxiliaryPlugs( self, plug ) : @@ -1539,7 +1550,7 @@ def __menuDefinition( self ) : result = IECore.MenuDefinition() - result.append( "/__RenderPassesDivider__", { "divider" : True, "label" : "Render Passes" } ) + result.append( "/__RenderPassesDivider__", { "divider" : True, "label" : _("Render Passes") } ) if self.__getHideDisabled() : renderPasses = [ name for name, status in self.__renderPasses.items() if status.adaptedEnabled ] @@ -1547,12 +1558,12 @@ def __menuDefinition( self ) : renderPasses = self.__renderPasses.keys() if self.__updatePending : - result.append( "/Refresh", { "command" : Gaffer.WeakMethod( self.__refreshMenu ), "searchable" : False } ) + result.append( "/" + _("Refresh"), { "command" : Gaffer.WeakMethod( self.__refreshMenu ), "searchable" : False } ) elif len( renderPasses ) == 0 : if not self.__renderPasses : - result.append( "/No Render Passes Available", { "active" : False, "searchable" : False } ) + result.append( "/" + _("No Render Passes Available"), { "active" : False, "searchable" : False, "label" : _("No Render Passes Available") } ) else : - result.append( "/All Render Passes Disabled", { "active" : False, "searchable" : False } ) + result.append( "/" + _("All Render Passes Disabled"), { "active" : False, "searchable" : False, "label" : _("All Render Passes Disabled") } ) else : groupingFn = GafferSceneUI.RenderPassEditor.pathGroupingFunction() prefixes = IECore.PathMatcher() @@ -1588,15 +1599,16 @@ def __menuDefinition( self ) : } ) - result.append( "/__OptionsDivider__", { "divider" : True, "label" : "Options" } ) + result.append( "/__OptionsDivider__", { "divider" : True, "label" : _("Options") } ) result.append( "/Display Grouped", { "checkBox" : self.__getDisplayGrouped(), "command" : functools.partial( Gaffer.WeakMethod( self.__setDisplayGrouped ) ), - "description" : "Toggle grouped display of render passes.", - "searchable" : False + "description" : _("Toggle grouped display of render passes."), + "searchable" : False, + "label" : _("Display Grouped"), } ) @@ -1605,8 +1617,9 @@ def __menuDefinition( self ) : { "checkBox" : self.__getHideDisabled(), "command" : functools.partial( Gaffer.WeakMethod( self.__setHideDisabled ) ), - "description" : "Hide render passes disabled for rendering.", - "searchable" : False + "description" : _("Hide render passes disabled for rendering."), + "searchable" : False, + "label" : _("Hide Disabled"), } ) @@ -1631,11 +1644,11 @@ def __renderPassDescription( self, renderPass ) : case ( True, True ) : return "" case ( True, False ) : - return f"{renderPass} has been automatically disabled by a render adaptor." + return _("{} has been automatically disabled by a render adaptor.").format( renderPass ) case ( False, False ) : - return f"{renderPass} has been disabled." + return _("{} has been disabled.").format( renderPass ) case ( False, True ) : - return f"{renderPass} has been automatically enabled by a render adaptor." + return _("{} has been automatically enabled by a render adaptor.").format( renderPass ) return "" @@ -1675,7 +1688,7 @@ def __renderPassIcon( self, renderPass, activeIndicator = False ) : def __updateMenuButton( self ) : - self.__menuButton.setText( self.__currentRenderPass or "None" ) + self.__menuButton.setText( self.__currentRenderPass or _("None") ) self.__menuButton.setImage( self.__renderPassIcon( self.__currentRenderPass ) ) def __updateSettingsInput( self ) : diff --git a/python/GafferSceneUI/RenderPassShaderUI.py b/python/GafferSceneUI/RenderPassShaderUI.py index ba2243fd973..95bf214a62d 100644 --- a/python/GafferSceneUI/RenderPassShaderUI.py +++ b/python/GafferSceneUI/RenderPassShaderUI.py @@ -40,6 +40,7 @@ import GafferSceneUI import IECore +from GafferUI.i18n import _ def __rendererNames( plug ) : @@ -78,20 +79,20 @@ def __rendererPresetValues( plug ) : GafferScene.RenderPassShader, "description", - """ + _(""" Sets up a global shader in the options to replace a shader used by a render pass type. - """, + """), plugs = { "renderer" : { "description" : - """ + _(""" The renderer the shader should affect. Shaders assigned to a specific renderer will take precedence over shaders assigned to "All" when rendering with that renderer. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", @@ -103,9 +104,9 @@ def __rendererPresetValues( plug ) : "usage" : { "description" : - """ + _(""" How the shader is to be used. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", diff --git a/python/GafferSceneUI/RenderPassTypeAdaptorUI.py b/python/GafferSceneUI/RenderPassTypeAdaptorUI.py index 00d2e388a30..6f31a3300c6 100644 --- a/python/GafferSceneUI/RenderPassTypeAdaptorUI.py +++ b/python/GafferSceneUI/RenderPassTypeAdaptorUI.py @@ -38,6 +38,7 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ def __renderPassTypes() : @@ -61,29 +62,29 @@ def renderPassTypePresetValues() : GafferScene.RenderPassTypeAdaptor, "description", - """ + _(""" Adapts render pass types to a client and renderer. The behaviour of how each render pass type is adapted is defined by one or more type processors registered to this node. - """, + """), plugs = { "client" : { "description" : - """ + _(""" The client to adapt render pass types to. - """, + """), }, "renderer" : { "description" : - """ + _(""" The renderer to adapt render pass types to. - """, + """), }, diff --git a/python/GafferSceneUI/RenderPassWedgeUI.py b/python/GafferSceneUI/RenderPassWedgeUI.py index aecc78c7b01..2cfed9f4c28 100644 --- a/python/GafferSceneUI/RenderPassWedgeUI.py +++ b/python/GafferSceneUI/RenderPassWedgeUI.py @@ -37,13 +37,14 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.RenderPassWedge, "description", - """ + _(""" Causes upstream nodes to be dispatched multiple times in a range of contexts, each time with a different value for the `renderPass` context variable. Each value of `renderPass` is the name of a @@ -73,16 +74,16 @@ Adaptors should be registered using a client value of "RenderPassWedge" - for example : `GafferScene.SceneAlgo.registerRenderAdaptor( "MyConditionalPassAdaptor", adaptorCreationFunction, client = "RenderPassWedge" )` - """, + """), plugs = { "in" : { "description" : - """ + _(""" The input scene containing the render passes to wedge. - """, + """), "nodule:type" : "GafferUI::StandardNodule", }, @@ -90,14 +91,14 @@ "names" : { "description" : - """ + _(""" The names of the render passes to be wedged. > Note : Render pass names are queried at the > script's start frame to ensure they do not vary > over time and to prevent scenes with expensive > globals from slowing task dispatch. - """, + """), "plugValueWidget:type" : "GafferSceneUI.RenderPassWedgeUI._PassNamesWidget", }, @@ -105,9 +106,9 @@ "out" : { "description" : - """ + _(""" A direct pass-through of the input scene. - """, + """), }, diff --git a/python/GafferSceneUI/RenderPassesUI.py b/python/GafferSceneUI/RenderPassesUI.py index 246fd1bbede..432082aaafe 100644 --- a/python/GafferSceneUI/RenderPassesUI.py +++ b/python/GafferSceneUI/RenderPassesUI.py @@ -42,13 +42,14 @@ import GafferSceneUI from Qt import QtGui +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.RenderPasses, "description", - """ + _(""" Appends render passes to the scene globals. Render passes can be used to define named variations of a scene. @@ -65,20 +66,20 @@ > Tip : The list of render passes is stored in the `renderPass:names` > option in the scene globals. - """, + """), plugs = { "names" : { "description" : - """ + _(""" The names of render passes to be created. > Tip : If any of the specified names already exist, they > will be removed from their existing position in the list > and appended to the end. - """, + """), "plugValueWidget:type" : "GafferSceneUI.RenderPassesUI._RenderPassVectorDataPlugValueWidget", diff --git a/python/GafferSceneUI/RenderUI.py b/python/GafferSceneUI/RenderUI.py index f3dde53f77b..0963d46ab02 100644 --- a/python/GafferSceneUI/RenderUI.py +++ b/python/GafferSceneUI/RenderUI.py @@ -41,6 +41,7 @@ import GafferScene from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ ## \deprecated ## \todo Remove in next major version. @@ -58,12 +59,12 @@ def rendererPresetNames( plug = None ) : GafferScene.Render, "description", - """ + _(""" Performs offline batch rendering using any of the available renderer backends, or optionally writes scene descriptions to disk for later rendering via a SystemCommand node. - """, + """), "layout:activator:modeIsSceneDescription", lambda node : node["mode"].getValue() == node.Mode.SceneDescriptionMode, @@ -72,9 +73,9 @@ def rendererPresetNames( plug = None ) : "in" : { "description" : - """ + _(""" The scene to be rendered. - """, + """), "nodule:type" : "GafferUI::StandardNodule", @@ -83,11 +84,11 @@ def rendererPresetNames( plug = None ) : "renderer" : { "description" : - """ + _(""" The renderer to use. Default mode uses the `render:defaultRenderer` option from the input scene globals to choose the renderer. This can be authored using the StandardOptions node. - """, + """), "plugValueWidget:type" : "GafferSceneUI.RenderUI.RendererPlugValueWidget", @@ -102,9 +103,9 @@ def rendererPresetNames( plug = None ) : "mode" : { "description" : - """ + _(""" The type of render to perform. - """, + """), "preset:Render" : GafferScene.Render.Mode.RenderMode, "preset:Scene Description" : GafferScene.Render.Mode.SceneDescriptionMode, @@ -116,9 +117,9 @@ def rendererPresetNames( plug = None ) : "fileName" : { "description" : - """ + _(""" The name of the file to be generated when in scene description mode. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -130,19 +131,19 @@ def rendererPresetNames( plug = None ) : "out" : { "description" : - """ + _(""" A direct pass-through of the input scene. - """, + """), }, "resolvedRenderer" : { "description" : - """ + _(""" The renderer that will be used, accounting for the value of the `render:defaultRenderer` option if `renderer` is set to "Default". - """, + """), "layout:section" : "Advanced", diff --git a/python/GafferSceneUI/ResamplePrimitiveVariablesUI.py b/python/GafferSceneUI/ResamplePrimitiveVariablesUI.py index 5fcd75db060..126e8ced7bf 100644 --- a/python/GafferSceneUI/ResamplePrimitiveVariablesUI.py +++ b/python/GafferSceneUI/ResamplePrimitiveVariablesUI.py @@ -41,13 +41,14 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ResamplePrimitiveVariables, "description", - """ + _("""

Resamples the list of primitive variables in Names for either mesh, curves or point primitives.

The reampling algorithm either expands or reduces each primitive variable's data based on the primitive type, primitive variable source interpolation and target interpolation as detailed in the tables below

@@ -163,16 +164,16 @@

copy : expand source values to target based on topology

average : calculate the mean of the primitive variable (either for the whole primitive, for face / curve or vertex)

- """, + """), plugs = { "interpolation" : { "description" : - """ + _(""" Target interpolation for the primitive variables - """, + """), "preset:Constant" : IECoreScene.PrimitiveVariable.Interpolation.Constant, "preset:Uniform" : IECoreScene.PrimitiveVariable.Interpolation.Uniform, diff --git a/python/GafferSceneUI/ReverseWindingUI.py b/python/GafferSceneUI/ReverseWindingUI.py index 06ab05f6bfc..3a950093615 100644 --- a/python/GafferSceneUI/ReverseWindingUI.py +++ b/python/GafferSceneUI/ReverseWindingUI.py @@ -36,17 +36,18 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ReverseWinding, "description", - """ + _(""" Reverses the winding order of each face of a mesh; this has the effect of flipping the geometric normal. In Gaffer, a face is considered to be front-facing if its vertices are wound in counter-clockwise order relative to the viewer. - """, + """), ) diff --git a/python/GafferSceneUI/RotateToolUI.py b/python/GafferSceneUI/RotateToolUI.py index 746abeb4369..e3c555dab43 100644 --- a/python/GafferSceneUI/RotateToolUI.py +++ b/python/GafferSceneUI/RotateToolUI.py @@ -38,15 +38,16 @@ import Gaffer import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferSceneUI.RotateTool, "description", - """ + _(""" Tool for editing object rotation. - """, + """), "nodeToolbar:bottom:type", "GafferUI.StandardNodeToolbar.bottom", @@ -60,12 +61,12 @@ "orientation" : { "description" : - """ + _(""" The space used to define the orientation of the XYZ rotation handles. Note that this is independent of the space setting on a Transform node - each setting can be mixed and matched freely. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", diff --git a/python/GafferSceneUI/ScaleToolUI.py b/python/GafferSceneUI/ScaleToolUI.py index c81ba920bc5..3e622af0ef7 100644 --- a/python/GafferSceneUI/ScaleToolUI.py +++ b/python/GafferSceneUI/ScaleToolUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferSceneUI.ScaleTool, "description", - """ + _(""" Tool for editing object scale. - """, + """), "viewer:shortCut", "R", "order", 3, diff --git a/python/GafferSceneUI/ScatterUI.py b/python/GafferSceneUI/ScatterUI.py index acdce143a2f..c423c5a4746 100644 --- a/python/GafferSceneUI/ScatterUI.py +++ b/python/GafferSceneUI/ScatterUI.py @@ -37,25 +37,26 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Scatter, "description", - """ + _(""" Scatters points evenly over the surface of meshes. This can be particularly useful in conjunction with the Instancer, which can then apply instances to each point. - """, + """), plugs = { "parent" : { "description" : - """ + _(""" The location of the mesh to scatter the points over. The generated points will be parented under this location. This is @@ -63,39 +64,39 @@ which case the filter may specify multiple locations containing meshes to scatter points over. - """, + """), }, "name" : { "description" : - """ + _(""" The name given to the object generated - this will be placed under the parent in the scene hierarchy. - """, + """), }, "density" : { "description" : - """ + _(""" The number of points per unit area of the mesh, measured in object space. - """, + """), }, "densityPrimitiveVariable" : { "description" : - """ + _(""" A float primitive variable used to specify a varying point density across the surface of the mesh. Multiplied with the density setting above. - """, + """), "divider" : True, }, @@ -103,25 +104,25 @@ "referencePosition" : { "description" : - """ + _(""" If you want to preserve the uv positions of the points while the mesh animates, you can set up an alternate reference position primitive variable ( usually the same as P, but not animated ). This primitive variable will be used to compute the areas of the faces, and therefore how many points each face receives. - """, + """), }, "uv" : { "description" : - """ + _(""" The UV set used to distribute points. The size of faces in 3D space is used to determine the number of points on each face, so the UV set should not affect the overall look of the distribution for a particular seed, but using the UVs provides continuity when adjusting density. If polygons that are large in 3D space are small and narrow in UV space for the given UV set, you may encounter performance problems. - """, + """), "divider" : True, }, @@ -129,22 +130,22 @@ "primitiveVariables" : { "description" : - """ + _(""" Primitive variables to sample from the source mesh and output on the generated points. Supports a Gaffer match pattern, with multiple space seperated variable names, optionally using `*` as a wildcard. - """, + """), }, "pointType" : { "description" : - """ + _(""" The render type of the points. This defaults to "gl:point" so that the points are rendered in a lightweight manner in the viewport. - """, + """), "preset:GL Point" : "gl:point", "preset:Particle" : "particle", @@ -160,7 +161,7 @@ "destination" : { "description" : - """ + _(""" The location where the points primitives will be placed in the output scene. When the destination is evaluated, the `${scene:path}` variable holds the location of the source mesh, so the default value parents the points @@ -168,7 +169,7 @@ > Tip : `${scene:path}/..` may be used to place the points alongside the > source mesh. - """, + """), }, diff --git a/python/GafferSceneUI/SceneEditor.py b/python/GafferSceneUI/SceneEditor.py index a34b9c7a9d2..b8dd1093fec 100644 --- a/python/GafferSceneUI/SceneEditor.py +++ b/python/GafferSceneUI/SceneEditor.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -201,7 +202,7 @@ def __childAddedOrRemoved( self, node, child ) : "filter" : { "description" : - """ + _(""" Filters the input scene to isolate locations with matching names. The filter may contain any of Gaffer's standard wildcards, and may either be used to match individual location names or entire paths. @@ -213,7 +214,7 @@ def __childAddedOrRemoved( self, node, child ) : text `building` anywhere in its name. - `/cityA/.../building*` : Matches only locations within `cityA` whose name starts with `building`. - """, + """), "plugValueWidget:type" : "GafferUI.TogglePlugValueWidget", "togglePlugValueWidget:image:on" : "searchOn.png", @@ -231,10 +232,10 @@ def __childAddedOrRemoved( self, node, child ) : "setFilter" : { "description" : - """ + _(""" Filters the input scene to isolate locations belonging to specific sets. - """, + """), "label" : "", "plugValueWidget:type" : "GafferSceneUI.SceneEditor._SetFilterPlugValueWidget", @@ -346,7 +347,7 @@ def __init__( self, plug, **kw ) : image = "setFilterOff.png", menu = GafferUI.Menu( Gaffer.WeakMethod( self.__setsMenuDefinition ), - title = "Set Filter" + title = _("Set Filter") ), hasFrame = False, ) diff --git a/python/GafferSceneUI/SceneElementProcessorUI.py b/python/GafferSceneUI/SceneElementProcessorUI.py index 3c83d7b1a26..6fd1e785c35 100644 --- a/python/GafferSceneUI/SceneElementProcessorUI.py +++ b/python/GafferSceneUI/SceneElementProcessorUI.py @@ -36,16 +36,17 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.SceneElementProcessor, "description", - """ + _(""" Base class for nodes which modify individual scene locations, but do not alter the hierarchy in any way. - """, + """), ) diff --git a/python/GafferSceneUI/SceneHistoryUI.py b/python/GafferSceneUI/SceneHistoryUI.py index 8ecbc99612c..697c6c61dfd 100644 --- a/python/GafferSceneUI/SceneHistoryUI.py +++ b/python/GafferSceneUI/SceneHistoryUI.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -52,6 +53,7 @@ def appendViewContextMenuItems( viewer, view, menuDefinition ) : menuDefinition.append( "/History", { + "label" : _("History"), "subMenu" : functools.partial( __historySubMenu, context = view.context(), @@ -84,6 +86,7 @@ def __historySubMenu( menu, context, scene, selectedPath ) : "active" : selectedPath is not None, "command" : functools.partial( __editSourceNode, context, scene, selectedPath ), "shortCut" : "Alt+E", + "label" : _("Edit Source..."), } ) @@ -93,6 +96,7 @@ def __historySubMenu( menu, context, scene, selectedPath ) : "active" : selectedPath is not None, "command" : functools.partial( __editTweaksNode, context, scene, selectedPath ), "shortCut" : "Alt+Shift+E", + "label" : _("Edit Tweaks..."), } ) diff --git a/python/GafferSceneUI/SceneInspector.py b/python/GafferSceneUI/SceneInspector.py index e14be9a67e1..09811fe02ca 100644 --- a/python/GafferSceneUI/SceneInspector.py +++ b/python/GafferSceneUI/SceneInspector.py @@ -45,14 +45,37 @@ import Gaffer import GafferScene import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n import GafferSceneUI from GafferUI.PlugValueWidget import sole from . import _GafferSceneUI +from GafferSceneUI._InspectorColumn import _isInspectorColumn from Qt import QtWidgets +class _TranslatedNameColumn( GafferUI.PathColumn ) : + """A PathColumn that delegates to StandardPathColumn but translates + the displayed name values using the i18n word-by-word system.""" + + def __init__( self, header, propertyName ) : + + GafferUI.PathColumn.__init__( self ) + self.__inner = GafferUI.StandardPathColumn( header, propertyName ) + + def cellData( self, path, canceller = None ) : + + data = self.__inner.cellData( path, canceller ) + if data.value is not None and isinstance( data.value, str ) : + data.value = _i18n.translateLabel( data.value ) + return data + + def headerData( self, canceller = None ) : + + return self.__inner.headerData( canceller ) + class SceneInspector( GafferSceneUI.SceneEditor ) : class Settings( GafferSceneUI.SceneEditor.Settings ) : @@ -143,10 +166,10 @@ def __init__( self, scriptNode, **kw ) : self.settings()["compare"]["scene"]["value"].setInput( self.settings()["in"] ) - nameColumn = GafferUI.StandardPathColumn( "Name", "name" ) + nameColumn = _TranslatedNameColumn( _("Name"), "name" ) self.__standardColumns = [ nameColumn, - GafferSceneUI.Private.InspectorColumn( "inspector:inspector", headerData = GafferUI.PathColumn.CellData( value = "Value" ) ), + GafferSceneUI.Private.InspectorColumn( "inspector:inspector", headerData = GafferUI.PathColumn.CellData( value = _("Value") ) ), ] self.__diffColumns = [ @@ -171,7 +194,7 @@ def __init__( self, scriptNode, **kw ) : with GafferUI.TabbedContainer() : - with GafferUI.ListContainer( spacing = 4, borderWidth = 4, parenting = { "label" : "Location" } ) : + with GafferUI.ListContainer( spacing = 4, borderWidth = 4, parenting = { "label" : _("Location") } ) : GafferUI.PlugLayout( self.settings(), orientation = GafferUI.ListContainer.Orientation.Horizontal, @@ -194,7 +217,7 @@ def __init__( self, scriptNode, **kw ) : ) GafferSceneUI.Private.InspectorColumn.connectToDragBeginSignal( self.__locationPathListing ) - with GafferUI.ListContainer( spacing = 4, borderWidth = 4, parenting = { "label" : "Globals" } ) : + with GafferUI.ListContainer( spacing = 4, borderWidth = 4, parenting = { "label" : _("Globals") } ) : GafferUI.PlugLayout( self.settings(), orientation = GafferUI.ListContainer.Orientation.Horizontal, @@ -255,7 +278,7 @@ def __draggedInspections( dragDropEvent, inspectorType ) : columnSelection = { column : selection for column, selection in zip( pathListing.getColumns(), pathListing.getSelection() ) - if isinstance( column, GafferSceneUI.Private.InspectorColumn ) + if _isInspectorColumn( column ) } firstInspectorColumn = next( iter( columnSelection ), None ) if firstInspectorColumn is None : @@ -437,10 +460,10 @@ def __updateFilter( self, tree, plug ) : "location" : { "description" : - """ + _(""" The scene location to inspect. Defaults to the currently selected location. Use the HierarchyView or Viewer to select a location. - """, + """), "plugValueWidget:type" : "GafferSceneUI.SceneInspector._LocationPlugValueWidget", "layout:section" : "TopRow", @@ -480,7 +503,7 @@ def __updateFilter( self, tree, plug ) : "locationFilter" : { "description" : - """ + _(""" Filters the displayed properties. The filter may contain any of Gaffer's standard wildcards, and may either be used to match individual property names or entire paths. @@ -494,7 +517,7 @@ def __updateFilter( self, tree, plug ) : - `/Attributes/Standard` : Shows standard attributes. - `/Attributes/*/*surface/*/*color*` : Shows surface shader parameters whose name contains `color`. - """, + """), "plugValueWidget:type" : "GafferUI.TogglePlugValueWidget", "togglePlugValueWidget:image:on" : "searchOn.png", @@ -512,11 +535,11 @@ def __updateFilter( self, tree, plug ) : "isolateLocationDifferences" : { "description" : - """ + _(""" Hides all rows where the A and B columns both have the same value. - """, + """), - "label" : "Isolate Differences", + "label" : _("Isolate Differences"), "layout:section" : "LocationFilterRow", "boolPlugValueWidget:labelVisible" : True, "layout:visibilityActivator" : lambda plug : any( p.getValue() for p in plug.node()._locationComparisonEnablers() ), @@ -526,7 +549,7 @@ def __updateFilter( self, tree, plug ) : "globalsFilter" : { "description" : - """ + _(""" Filters the displayed properties. The filter may contain any of Gaffer's standard wildcards, and may either be used to match individual property names or entire paths. @@ -538,7 +561,7 @@ def __updateFilter( self, tree, plug ) : in their name, be they options, outputs or anything else. - `/Options/Standard` : Shows standard options. - `/Outputs/.../Data` : Shows the Data field for all outputs. - """, + """), "plugValueWidget:type" : "GafferUI.TogglePlugValueWidget", "togglePlugValueWidget:image:on" : "searchOn.png", @@ -552,11 +575,11 @@ def __updateFilter( self, tree, plug ) : "isolateGlobalsDifferences" : { "description" : - """ + _(""" Hides all rows where the A and B columns both have the same value. - """, + """), - "label" : "Isolate Differences", + "label" : _("Isolate Differences"), "layout:section" : "GlobalsFilterRow", "boolPlugValueWidget:labelVisible" : True, "layout:visibilityActivator" : lambda plug : any( p.getValue() for p in plug.node()._globalsComparisonEnablers() ), @@ -575,7 +598,7 @@ def __init__( self, node, **kw ) : GafferUI.PlugValueWidget.__init__( self, self.__button, node["compare"], **kw ) self.__button.setMenu( - GafferUI.Menu( title = "Compare", definition = Gaffer.WeakMethod( self.__menuDefinition ) ) + GafferUI.Menu( title = _("Compare"), definition = Gaffer.WeakMethod( self.__menuDefinition ) ) ) self.setToolTip( "Click to configure A/B comparisons." ) @@ -707,7 +730,7 @@ def __updatePlaceholderText( self ) : selectedPath = GafferSceneUI.ScriptNodeAlgo.getLastSelectedPath( self.scriptNode() ) self.__pathPlugValueWidget.pathWidget().setPlaceholderText( - selectedPath or "Select a location to inspect" + selectedPath or _("Select a location to inspect") ) SceneInspector._LocationPlugValueWidget = _LocationPlugValueWidget @@ -820,28 +843,28 @@ def __showFocusMenu( self, *unused ) : else : selectionLabel = "Pin {}".format( selection[0].getName() ) - menuDefinition.append( "/Pin", { + menuDefinition.append( "/" + _("Pin"), { "command" : functools.partial( Gaffer.WeakMethod( self.setNodeSet ), nodeSet = Gaffer.StandardSet( selection[:] ) ) , "label" : selectionLabel, } ) # Add following items - menuDefinition.append( "/Follow Divider", { "divider" : True, "label" : "Follow" } ) + menuDefinition.append( "/Follow Divider", { "divider" : True, "label" : _("Follow") } ) - menuDefinition.append( "/Focus Node", { + menuDefinition.append( "/" + _("Focus Node"), { "command" : functools.partial( Gaffer.WeakMethod( self.setNodeSet ), nodeSet = self.scriptNode().focusSet() ), "checkBox" : self.__nodeSet.isSame( self.scriptNode().focusSet() ), } ) - menuDefinition.append( "/Node Selection", { + menuDefinition.append( "/" + _("Node Selection"), { "command" : functools.partial( Gaffer.WeakMethod( self.setNodeSet ), nodeSet = selection ), "checkBox" : self.__nodeSet.isSame( selection ), } ) # Add bookmarks - menuDefinition.append( "/NumericBookmarkDivider", { "divider" : True, "label" : "Follow Numeric Bookmark" } ) + menuDefinition.append( "/NumericBookmarkDivider", { "divider" : True, "label" : _("Follow Numeric Bookmark") } ) for bookmark in range( 1, 10 ) : title = f"{bookmark}" @@ -859,7 +882,7 @@ def __showFocusMenu( self, *unused ) : # Show menu - self.__menu = GafferUI.Menu( menuDefinition, title = "Focus" ) + self.__menu = GafferUI.Menu( menuDefinition, title = _("Focus") ) bound = self.bound() self.__menu.popup( @@ -1028,15 +1051,15 @@ def createLabel( text ) : self.__aGrid = GafferUI.GridContainer( spacing = 4 ) with self.__aGrid.nextRow() : - createLabel( "Location" ) + createLabel( _("Location") ) _LocationPlugValueWidget( plug.parent()["location"] ) with self.__aGrid.nextRow() : - createLabel( "Node" ) + createLabel( _("Node") ) self.__inputLabelWidget = _InputLabelWidget() with self.__aGrid.nextRow() : - createLabel( "Render Pass" ) + createLabel( _("Render Pass") ) _CurrentRenderPassWidget( plug["renderPass"]["value"] ) aFrame._qtWidget().setProperty( "gafferDiff", "A" ) @@ -1045,15 +1068,15 @@ def createLabel( text ) : self.__bGrid = GafferUI.GridContainer( spacing = 4 ) with self.__bGrid.nextRow() : - createLabel( "Location" ) + createLabel( _("Location") ) _LocationPlugValueWidget( plug["location"]["value"] ) with self.__bGrid.nextRow() : - createLabel( "Node" ) + createLabel( _("Node") ) _CompareScenePlugValueWidget( plug["scene"]["value"] ) with self.__bGrid.nextRow() : - createLabel( "Render Pass" ) + createLabel( _("Render Pass") ) GafferSceneUI.RenderPassEditor._RenderPassPlugValueWidget( plug["renderPass"]["value"] ) bFrame._qtWidget().setProperty( "gafferDiff", "B" ) @@ -1106,7 +1129,7 @@ def __contextMenu( column, pathListing, menuDefinition ) : newColumnSelection = IECore.PathMatcher() if not columnSelection.isEmpty() : selectionCount += columnSelection.size() - if not isinstance( column, GafferSceneUI.Private.InspectorColumn ) : + if not _isInspectorColumn( column ) : return for selection in columnSelection.paths() : path.setFromString( selection ) @@ -1134,7 +1157,7 @@ def __contextMenu( column, pathListing, menuDefinition ) : def __inspectorColumnCreated( column ) : - if isinstance( column, GafferSceneUI.Private.InspectorColumn ) : + if _isInspectorColumn( column ) : column.contextMenuSignal().connect( __contextMenu ) GafferSceneUI.Private.InspectorColumn.instanceCreatedSignal().connect( __inspectorColumnCreated ) diff --git a/python/GafferSceneUI/SceneNodeUI.py b/python/GafferSceneUI/SceneNodeUI.py index 7ab44110a0b..fdf15c1e34a 100644 --- a/python/GafferSceneUI/SceneNodeUI.py +++ b/python/GafferSceneUI/SceneNodeUI.py @@ -39,16 +39,17 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.SceneNode, "description", - """ + _(""" The base type for all nodes which are capable of generating a hierarchical scene. - """, + """), plugs = { @@ -61,9 +62,9 @@ "out" : { "description" : - """ + _(""" The output scene. - """, + """), }, @@ -71,10 +72,10 @@ "enabled" : { "description" : - """ + _(""" The on/off state of the node. When it is off, the node outputs an empty scene. - """, + """), }, diff --git a/python/GafferSceneUI/SceneProcessorUI.py b/python/GafferSceneUI/SceneProcessorUI.py index 64b48db15e5..3fb836fdf2b 100644 --- a/python/GafferSceneUI/SceneProcessorUI.py +++ b/python/GafferSceneUI/SceneProcessorUI.py @@ -39,15 +39,16 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.SceneProcessor, "description", - """ + _(""" The base type for all nodes which take an input scene and process it in some way. - """, + """), plugs = { @@ -63,18 +64,18 @@ "out" : { "description" : - """ + _(""" The processed output scene. - """, + """), }, "enabled" : { "description" : - """ + _(""" The on/off state of the node. When it is off, the node outputs the input scene unchanged. - """, + """), }, diff --git a/python/GafferSceneUI/SceneReaderUI.py b/python/GafferSceneUI/SceneReaderUI.py index e43ac08861c..c0e0d80670a 100644 --- a/python/GafferSceneUI/SceneReaderUI.py +++ b/python/GafferSceneUI/SceneReaderUI.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -51,22 +52,22 @@ GafferScene.SceneReader, "description", - """ + _(""" The primary means of loading external assets (models, animation and cameras etc) from caches into Gaffer. Gaffer's native file format is the .scc (SceneCache) format provided by Cortex, but Alembic and USD files are also supported. Other formats may be added by registering a new implementation of Cortex's abstract SceneInterface. - """, + """), plugs = { "fileName" : { "description" : - """ + _(""" The name of the file to be loaded. The file can be in any of the formats supported by Cortex's SceneInterfaces. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -80,11 +81,11 @@ "refreshCount" : { "description" : - """ + _(""" May be incremented to force a reload if the file has changed on disk - otherwise old contents may still be loaded via Gaffer's cache. - """, + """), "plugValueWidget:type" : "GafferUI.RefreshPlugValueWidget", "layout:label" : "", @@ -95,20 +96,20 @@ "tags" : { "description" : - """ + _(""" Limits the parts of the scene loaded to only those with a specific set of tags. - """, + """), }, "transform" : { "description" : - """ + _(""" The transform used to position the cache. This is applied to all children of the cache root. - """, + """), "layout:section" : "Transform", diff --git a/python/GafferSceneUI/SceneViewUI.py b/python/GafferSceneUI/SceneViewUI.py index 7ceaa1ce3a2..cf72604a6c4 100644 --- a/python/GafferSceneUI/SceneViewUI.py +++ b/python/GafferSceneUI/SceneViewUI.py @@ -46,6 +46,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI import GafferImage @@ -161,9 +162,9 @@ def __condensedEditScopeSpacerActivator( node ) : "drawingMode" : { "description" : - """ + _(""" Defines how the scene is drawn in the viewport. - """, + """), "plugValueWidget:type" : "GafferSceneUI.SceneViewUI._DrawingModePlugValueWidget", }, @@ -171,9 +172,9 @@ def __condensedEditScopeSpacerActivator( node ) : "shadingMode" : { "description" : - """ + _(""" Defines how the scene is shaded in the viewport. - """, + """), "toolbarLayout:divider" : True, "plugValueWidget:type" : "GafferSceneUI.SceneViewUI._ShadingModePlugValueWidget", @@ -188,9 +189,9 @@ def __condensedEditScopeSpacerActivator( node ) : "selectionMask" : { "description" : - """ + _(""" Defines what types of objects are selectable in the viewport. - """, + """), "plugValueWidget:type" : "GafferSceneUI.SceneViewUI._SelectionMaskPlugValueWidget", "toolbarLayout:divider" : True, @@ -200,9 +201,9 @@ def __condensedEditScopeSpacerActivator( node ) : "camera" : { "description" : - """ + _(""" Defines the camera used to view the scene. - """, + """), "plugValueWidget:type" : "GafferSceneUI.SceneViewUI._CameraPlugValueWidget", "toolbarLayout:divider" : True, @@ -219,9 +220,9 @@ def __condensedEditScopeSpacerActivator( node ) : "camera.freeCamera" : { "description" : - """ + _(""" Chooses the default camera to be used when `camera.lookThroughEnabled` is off. - """, + """), "layout:visibilityActivator" : "hidden" @@ -230,9 +231,9 @@ def __condensedEditScopeSpacerActivator( node ) : "camera.fieldOfView" : { "description" : - """ + _(""" The field of view for the viewport's default perspective camera. - """, + """), "layout:section" : "Free Camera", "layout:activator" : "cameraIsFreePerspective", @@ -242,9 +243,9 @@ def __condensedEditScopeSpacerActivator( node ) : "camera.clippingPlanes" : { "description" : - """ + _(""" The near and far clipping planes for the viewport's default perspective camera. - """, + """), "layout:section" : "Free Camera", "layout:activator" : "lookThroughDisabled", @@ -254,36 +255,36 @@ def __condensedEditScopeSpacerActivator( node ) : "camera.lightLookThroughDefaultDistantAperture" : { "layout:section" : "Light Look Through", "layout:activator" : "lookThroughEnabled", - "label" : "Default Distant Aperture", + "label" : _("Default Distant Aperture"), "description" : - """ + _(""" The orthographic aperture used when converting distant lights ( which are theoretically infinite in extent ). May be overridden by the visualisation setting on the light. - """, + """), }, "camera.lightLookThroughDefaultClippingPlanes" : { "layout:section" : "Light Look Through", "layout:activator" : "lookThroughEnabled", - "label" : "Default Clipping Planes", + "label" : _("Default Clipping Planes"), "description" : - """ + _(""" Clipping planes for cameras implied by lights. When creating a perspective camera, a near clip <= 0 is invalid, and will be replaced with 0.01. Also, certain lights only start casting light at some distance - if near clip is less than this, it will be increased. May be overridden by the visualisation setting on the light. - """, + """), }, "camera.lookThroughEnabled" : { "description" : - """ + _(""" When enabled, locks the view to look through a specific camera in the scene. By default, the current render camera is used, but this can be changed using the camera.lookThroughCamera setting. - """, + """), "layout:visibilityActivator" : "hidden" @@ -292,11 +293,11 @@ def __condensedEditScopeSpacerActivator( node ) : "camera.lookThroughCamera" : { "description" : - """ + _(""" Specifies the camera to look through when lookThrough.enabled is on. The default value means that the current render camera will be used - the paths to other cameras may be specified to choose another camera." - """, + """), "layout:visibilityActivator" : "hidden" @@ -378,7 +379,7 @@ class _DrawingModePlugValueWidget( GafferUI.PlugValueWidget ) : def __init__( self, plug, **kw ) : - menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title="Drawing" ) + menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title=_("Drawing") ) menuButton = GafferUI.MenuButton( menu=menu, image = "drawingStyles.png", hasFrame=False ) GafferUI.PlugValueWidget.__init__( self, menuButton, plug, **kw ) @@ -413,7 +414,7 @@ def __menuDefinition( self ) : } ) - m.append( "/Lights/OptionsDivider", { "divider" : True } ) + m.append( "/" + _("Lights") + "/OptionsDivider", { "divider" : True } ) self.__appendValuePresetMenu( m, self.getPlug()["light"]["frustumScale"], @@ -504,8 +505,8 @@ def __init__( self, plug, title="", **kw ) : self.__plugWidget = GafferUI.PlugValueWidget.create( plug ) self._setWidget( self.__plugWidget ) - self.__cancelButton = self._addButton( "Cancel" ) - self.__confirmButton = self._addButton( "OK" ) + self.__cancelButton = self._addButton( _("Cancel") ) + self.__confirmButton = self._addButton( _("OK") ) def waitForClose( self, **kw ) : @@ -526,7 +527,7 @@ def __init__( self, plug, **kw ) : self.__menuButton = GafferUI.MenuButton( image = "shading.png", - menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title="Shading" ), + menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title=_("Shading") ), hasFrame = False, ) @@ -548,8 +549,8 @@ def getToolTip( self ) : if self.__shadingModeToggle is not None : if result : result += "\n\n" - result += "## Actions\n\n" - result += "- Ctrl + click to toggle shading to `{}`\n".format( self.__shadingModeToggle if self.getPlug().isSetToDefault() else "Default" ) + result += _("## Actions") + "\n\n" + result += "- Ctrl + " + _("click to toggle shading to") + " `{}`\n".format( self.__shadingModeToggle if self.getPlug().isSetToDefault() else _("Default") ) return result @@ -614,7 +615,7 @@ class _ExpansionPlugValueWidget( GafferUI.PlugValueWidget ) : def __init__( self, plug, **kw ) : - menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title="Visibility" ) + menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title=_("Visibility") ) menuButton = GafferUI.MenuButton( menu=menu, image = "expansion.png", hasFrame=False ) GafferUI.PlugValueWidget.__init__( self, menuButton, plug, **kw ) @@ -635,8 +636,8 @@ def menuSignal( cls ) : def getToolTip( self ) : - result = "# Visibility" - result += "\n\nDefines what is visible in the viewport." + result = _("# Visibility") + result += "\n\n" + _("Defines what is visible in the viewport.") return result @@ -645,14 +646,14 @@ def __menuDefinition( self ) : expandAll = bool( self.getPlug().getValue() ) m = IECore.MenuDefinition() - m.append( "/Expansion", { "divider" : True, "label" : "Expansion" } ) - m.append( "/Expand Selection", { "command" : self.getPlug().node().expandSelection, "active" : not expandAll, "shortCut" : "Down" } ) - m.append( "/Expand Selection Fully", { "command" : functools.partial( self.getPlug().node().expandSelection, depth = 999 ), "active" : not expandAll, "shortCut" : "Shift+Down" } ) - m.append( "/Collapse Selection", { "command" : self.getPlug().node().collapseSelection, "active" : not expandAll, "shortCut" : "Up" } ) + m.append( "/" + _("Expansion"), { "divider" : True, "label" : _("Expansion") } ) + m.append( "/" + _("Expand Selection"), { "command" : self.getPlug().node().expandSelection, "active" : not expandAll, "shortCut" : "Down" } ) + m.append( "/" + _("Expand Selection Fully"), { "command" : functools.partial( self.getPlug().node().expandSelection, depth = 999 ), "active" : not expandAll, "shortCut" : "Shift+Down" } ) + m.append( "/" + _("Collapse Selection"), { "command" : self.getPlug().node().collapseSelection, "active" : not expandAll, "shortCut" : "Up" } ) m.append( "/Expand All Divider", { "divider" : True } ) - m.append( "/Expand All", { "checkBox" : expandAll, "command" : Gaffer.WeakMethod( self.__toggleMinimumExpansionDepth ) } ) + m.append( "/" + _("Expand All"), { "checkBox" : expandAll, "command" : Gaffer.WeakMethod( self.__toggleMinimumExpansionDepth ) } ) - m.append( "/PurposesDivider", { "divider" : True, "label" : "Purpose" } ) + m.append( "/PurposesDivider", { "divider" : True, "label" : _("Purpose") } ) # \todo Move the `includedPurposes` plug out of `drawingMode` and put it on a new plug that holds (and replaces) # `minimumExpansionDepth`. @@ -693,7 +694,7 @@ def __menuDefinition( self ) : { "checkBox" : not includedPurposesEnabled, "command" : functools.partial( Gaffer.WeakMethod( self.__purposeMenuCommand ), drawingModePlug, IECore.StringVectorData( [] ), False ), - "description" : "Shows objects with USD purposes that match the global `option:render:includedPurposes` variable which can be set from a StandardOptions node." + "description" : _("Shows objects with USD purposes that match the global `option:render:includedPurposes` variable which can be set from a StandardOptions node.") } ) @@ -723,7 +724,7 @@ def __menuDefinition( self ) : includedPurposes != previewWithGuidesElements ) m.append( "/CustomDivider", { "divider" : True } ) - m.append( "/Custom", { "subMenu" : subMenu, "icon" : "menuBreadCrumb.png" if showBreadCrumb else None } ) + m.append( "/" + _("Custom"), { "subMenu" : subMenu, "icon" : "menuBreadCrumb.png" if showBreadCrumb else None } ) self.menuSignal()( m, self ) @@ -766,7 +767,7 @@ class _SelectionMaskPlugValueWidget( GafferUI.PlugValueWidget ) : def __init__( self, plug, **kw ) : - menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title="Selection Mask" ) + menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title=_("Selection Mask") ) self.__menuButton = GafferUI.MenuButton( menu=menu, image = "selectionMaskOff.png", hasFrame=False ) GafferUI.PlugValueWidget.__init__( self, self.__menuButton, plug, **kw ) @@ -867,7 +868,7 @@ class _CameraPlugValueWidget( GafferUI.PlugValueWidget ) : def __init__( self, plug, **kw ) : self.__menuButton = GafferUI.MenuButton( - menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title="Camera" ), + menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title=_("Camera") ), hasFrame = False, ) @@ -1000,7 +1001,7 @@ def __showSettings( self, menu ) : if self.__settingsWindow is None : - self.__settingsWindow = GafferUI.Window( title = "Camera Settings" ) + self.__settingsWindow = GafferUI.Window( title = _("Camera Settings") ) with self.__settingsWindow : with GafferUI.ListContainer() : with GafferUI.Frame( borderStyle = GafferUI.Frame.BorderStyle.None_, borderWidth = 4 ) : @@ -1040,7 +1041,7 @@ def __pathFilter() : # user a "Show Lights" toggle. camerasPathFilter = GafferScene.SceneFilterPathFilter( validFilter["__camerasFilter"] ) - camerasPathFilter.userData()["UI"] = { "label" : "Show Lights", "invertEnabled" : True } + camerasPathFilter.userData()["UI"] = { "label" : _("Show Lights"), "invertEnabled" : True } return Gaffer.CompoundPathFilter( [ validPathFilter, camerasPathFilter ] ) @@ -1130,7 +1131,7 @@ class _GridPlugValueWidget( GafferUI.PlugValueWidget ) : def __init__( self, plug, **kw ) : - menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title="Gadgets" ) + menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title=_("Gadgets") ) menuButton = GafferUI.MenuButton( menu=menu, image = "grid.png", hasFrame=False ) GafferUI.PlugValueWidget.__init__( self, menuButton, plug, **kw ) @@ -1230,9 +1231,9 @@ def __snapshotDescription( view ) : sceneGadget = view.viewportGadget().getPrimaryChild() if sceneGadget.getRenderer() == "OpenGL" : - return "Viewport snapshots are only available for rendered (non-OpenGL) previews." + return _("Viewport snapshots are only available for rendered (non-OpenGL) previews.") - return "Snapshot viewport and send to catalogue." + return _("Snapshot viewport and send to catalogue.") def __snapshotToCatalogue( catalogue, view ) : @@ -1471,4 +1472,4 @@ def __update( self ) : paused = self.__sceneGadget.getPaused() self.__button.setImage( "viewPause.png" if not paused else "viewPaused.png" ) self.__busyWidget.setBusy( self.__sceneGadget.state() == self.__sceneGadget.State.Running ) - self.__button.setToolTip( "Viewer updates suspended, click to resume" if paused else "Click to suspend viewer updates [esc]" ) + self.__button.setToolTip( _("Viewer updates suspended, click to resume") if paused else _("Click to suspend viewer updates [esc]") ) diff --git a/python/GafferSceneUI/SceneWriterUI.py b/python/GafferSceneUI/SceneWriterUI.py index 619291b5577..41d26f6952f 100644 --- a/python/GafferSceneUI/SceneWriterUI.py +++ b/python/GafferSceneUI/SceneWriterUI.py @@ -40,29 +40,30 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.SceneWriter, "description", - """ + _(""" Writes scenes to cache files on disk. Gaffer's native file format is the .scc (SceneCache) format provided by Cortex, but other formats may be supported by registering a new implementation of Cortex's abstract SceneInterface. - """, + """), plugs = { "fileName" : { "description" : - """ + _(""" The name of the file to be written. Note that unlike image sequences, many scene formats write animation into a single file, so using # characters to specify a frame number is generally not necessary. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:leaf" : True, @@ -75,9 +76,9 @@ "in" : { "description" : - """ + _(""" The scene to be written. - """, + """), "nodule:type" : "GafferUI::StandardNodule", @@ -86,9 +87,9 @@ "out" : { "description" : - """ + _(""" A direct pass-through of the input scene. - """, + """), }, diff --git a/python/GafferSceneUI/SelectionToolUI.py b/python/GafferSceneUI/SelectionToolUI.py index be61c97253b..8f983c2d023 100644 --- a/python/GafferSceneUI/SelectionToolUI.py +++ b/python/GafferSceneUI/SelectionToolUI.py @@ -42,13 +42,14 @@ import Gaffer import GafferUI import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferSceneUI.SelectionTool, "description", - """ + _(""" Tool for selecting objects. - Click or drag to set selection @@ -56,7 +57,7 @@ - Drag and drop selected objects - Drag to Python Editor to get their names - Drag to PathFilter or Set node to add/remove their paths - """, + """), "nodeToolbar:bottom:type", "GafferUI.StandardNodeToolbar.bottom", @@ -78,14 +79,14 @@ "selectMode" : { "description" : - """ + _(""" Determines the scene location that is ultimately selected or deselected, which may differ from what is originally selected. - """, + """), "plugValueWidget:type" : "GafferSceneUI.SelectionToolUI.SelectModePlugValueWidget", - "label" : "Select", + "label" : _("Select"), "toolbarLayout:section" : "Bottom", "toolbarLayout:width" : 150, @@ -127,7 +128,7 @@ def _updateFromValues( self, values, exception ) : if values[0] in modes : self.__menuButton.setText( values[0].partition( "/" )[-1] ) else : - self.__menuButton.setText( "Invalid" ) + self.__menuButton.setText( _("Invalid") ) self.__menuButton.setErrored( exception is not None ) diff --git a/python/GafferSceneUI/SetEditor.py b/python/GafferSceneUI/SetEditor.py index 469ea5ec854..5b4f369cc05 100644 --- a/python/GafferSceneUI/SetEditor.py +++ b/python/GafferSceneUI/SetEditor.py @@ -42,10 +42,51 @@ import Gaffer import GafferScene import GafferUI +from GafferUI.i18n import _ import GafferSceneUI from . import _GafferSceneUI +class _TranslatedColumn( GafferUI.PathColumn ) : + + def __init__( self, column, header ) : + + GafferUI.PathColumn.__init__( self ) + self._inner = column + self._header = header + self._inner.changedSignal().connect( Gaffer.WeakMethod( self.__innerChanged ) ) + + def cellData( self, path, canceller = None ) : + + return self._inner.cellData( path, canceller ) + + def headerData( self, canceller = None ) : + + d = self._inner.headerData( canceller ) + return GafferUI.PathColumn.CellData( value = _( self._header ), icon = d.icon, toolTip = d.toolTip ) + + def inspect( self, path ) : + + if hasattr( self._inner, "inspect" ) : + return self._inner.inspect( path ) + return None + + def inspector( self, path ) : + + if hasattr( self._inner, "inspector" ) : + return self._inner.inspector( path ) + return None + + def inspectorContext( self, path ) : + + if hasattr( self._inner, "inspectorContext" ) : + return self._inner.inspectorContext( path ) + return None + + def __innerChanged( self, column ) : + + self.changedSignal()( self ) + class SetEditor( GafferSceneUI.SceneEditor ) : class Settings( GafferSceneUI.SceneEditor.Settings ) : @@ -78,8 +119,9 @@ def __init__( self, scriptNode, **kw ) : GafferUI.PlugLayout( self.settings(), orientation = GafferUI.ListContainer.Orientation.Horizontal, rootSection = "Filter" ) - self.__setMembersColumn = _GafferSceneUI._SetEditor.SetMembersColumn() - self.__selectedSetMembersColumn = _GafferSceneUI._SetEditor.SetSelectionColumn( scriptNode ) + self.__setNameColumn = _TranslatedColumn( _GafferSceneUI._SetEditor.SetNameColumn(), "Name" ) + self.__setMembersColumn = _TranslatedColumn( _GafferSceneUI._SetEditor.SetMembersColumn(), "Members" ) + self.__selectedSetMembersColumn = _TranslatedColumn( _GafferSceneUI._SetEditor.SetSelectionColumn( scriptNode ), "Selected" ) self.__includedSetMembersColumn = _GafferSceneUI._SetEditor.VisibleSetInclusionsColumn( scriptNode ) self.__excludedSetMembersColumn = _GafferSceneUI._SetEditor.VisibleSetExclusionsColumn( scriptNode ) self.__pathListing = GafferUI.PathListingWidget( @@ -88,7 +130,7 @@ def __init__( self, scriptNode, **kw ) : filter = Gaffer.CompoundPathFilter( [ self.__searchFilter, self.__emptySetFilter, self.__emptySelectionFilter ] ), ), columns = [ - _GafferSceneUI._SetEditor.SetNameColumn(), + self.__setNameColumn, self.__setMembersColumn, self.__selectedSetMembersColumn, self.__includedSetMembersColumn, @@ -158,7 +200,7 @@ def __dragBegin( self, widget, event ) : return IECore.StringVectorData() column = self.__pathListing.columnAt( imath.V2f( event.line.p0.x, event.line.p0.y ) ) - if isinstance( column, _GafferSceneUI._SetEditor.SetNameColumn ) : + if isinstance( getattr( column, '_inner', column ), _GafferSceneUI._SetEditor.SetNameColumn ) : GafferUI.Pointer.setCurrent( "sets" ) else : GafferUI.Pointer.setCurrent( "paths" ) @@ -204,7 +246,8 @@ def __columnContextMenuSignal( self, column, pathListingWidget, menuDefinition ) { "command" : Gaffer.WeakMethod( self.__copySetMembers ), "active" : len( selectedSetNames ) > 0, - "shortCut" : "Ctrl+Shift+C" + "shortCut" : "Ctrl+Shift+C", + "label" : _("Copy Set Members"), } ) @@ -213,6 +256,7 @@ def __columnContextMenuSignal( self, column, pathListingWidget, menuDefinition ) { "command" : Gaffer.WeakMethod( self.__selectSetMembers ), "active" : len( selectedSetNames ) > 0, + "label" : _("Select Set Members"), } ) @@ -271,9 +315,9 @@ def __copySetMembers( self, *unused ) : "filter" : { "description" : - """ + _(""" Filters the displayed sets by name. Accepts standard wildcards such as `*` and `?`. - """, + """), "plugValueWidget:type" : "GafferUI.TogglePlugValueWidget", "togglePlugValueWidget:image:on" : "searchOn.png", @@ -286,7 +330,7 @@ def __copySetMembers( self, *unused ) : "hideEmptySets" : { - "description" : "Hides sets with no members.", + "description" : _("Hides sets with no members."), "boolPlugValueWidget:labelVisible" : True, "layout:section" : "Filter", @@ -294,7 +338,7 @@ def __copySetMembers( self, *unused ) : "hideEmptySelection" : { - "description" : "Hides sets with no selected members or descendants.", + "description" : _("Hides sets with no selected members or descendants."), "boolPlugValueWidget:labelVisible" : True, "layout:section" : "Filter", @@ -345,7 +389,7 @@ def __setLookup( self, paths ) : def __getSetNamesFromPaths( self, paths ) : - dialogue = GafferUI.BackgroundTaskDialogue( "Querying Set Names" ) + dialogue = GafferUI.BackgroundTaskDialogue( _("Querying Set Names") ) with self.context() : result = dialogue.waitForBackgroundTask( diff --git a/python/GafferSceneUI/SetFilterUI.py b/python/GafferSceneUI/SetFilterUI.py index 0cbcecd2c13..467f2a89cfc 100644 --- a/python/GafferSceneUI/SetFilterUI.py +++ b/python/GafferSceneUI/SetFilterUI.py @@ -43,6 +43,7 @@ import GafferSceneUI import IECore +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -53,16 +54,16 @@ GafferScene.SetFilter, "description", - """ + _(""" A filter which uses sets to define which locations are matched. - """, + """), plugs = { "setExpression" : { "description" : - """ + _(""" A set expression that computes a set that defines the locations to be matched. @@ -90,7 +91,7 @@ The context menu of the set expression text field provides entries that help construct set expressions. - """, + """), "ui:scene:acceptsSetExpression" : True, "plugValueWidget:type" : "GafferSceneUI.SetExpressionPlugValueWidget", diff --git a/python/GafferSceneUI/SetQueryUI.py b/python/GafferSceneUI/SetQueryUI.py index 3b805c1e474..29950670470 100644 --- a/python/GafferSceneUI/SetQueryUI.py +++ b/python/GafferSceneUI/SetQueryUI.py @@ -37,34 +37,35 @@ from re import M import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.SetQuery, "description", - """ + _(""" Queries the set memberships of a location, and outputs a list of the sets that it belongs to. - """, + """), plugs = { "scene" : { "description" : - """ + _(""" The scene to query. - """, + """), }, "location" : { "description" : - """ + _(""" The location to query the set memberships for. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -75,9 +76,9 @@ "sets" : { "description" : - """ + _(""" The sets to query. - """, + """), "nodule:type" : "", @@ -86,10 +87,10 @@ "inherit" : { "description" : - """ + _(""" When on, locations are treated as being in a set if an ancestor location is in that set. - """, + """), "nodule:type" : "", @@ -98,10 +99,10 @@ "matches" : { "description" : - """ + _(""" The list of sets that the `location` is a member of. Returned in the order they are listed in the `sets` plug. - """, + """), "layout:section" : "Settings.Outputs", @@ -110,11 +111,11 @@ "firstMatch" : { "description" : - """ + _(""" The first set from the `matches` output, or `""` if there were no matches. This is particularly convenient for use in a Spreadsheet's selector, to select rows based on the set membership of a location. - """, + """), "layout:section" : "Settings.Outputs", diff --git a/python/GafferSceneUI/SetUI.py b/python/GafferSceneUI/SetUI.py index 346299bed29..94c6db6b18c 100644 --- a/python/GafferSceneUI/SetUI.py +++ b/python/GafferSceneUI/SetUI.py @@ -43,6 +43,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ## Menu Presentation # ----------------- @@ -77,12 +78,12 @@ def getMenuPathFunction() : GafferScene.Set, "description", - """ + _(""" Creates and edits sets of objects. Each set contains a list of paths to locations within the scene. After creation, sets can be used by the SetFilter to limit scene operations to only the members of a particular set. - """, + """), "layout:activator:pathsInUse", lambda node : node["paths"].getInput() is not None or len( node["paths"].getValue() ), @@ -91,7 +92,7 @@ def getMenuPathFunction() : "mode" : { "description" : - """ + _(""" Create mode creates a new set containing only the specified paths. If a set with the same name already exists, it is replaced. @@ -103,7 +104,7 @@ def getMenuPathFunction() : Remove mode removes the specified paths from an existing set. If the set does not exist yet, nothing is done. - """, + """), "preset:Create" : GafferScene.Set.Mode.Create, "preset:Add" : GafferScene.Set.Mode.Add, @@ -116,12 +117,12 @@ def getMenuPathFunction() : "name" : { "description" : - """ + _(""" The name of the set that will be created or edited. Multiple sets may be created or modified by entering their names separated by spaces. Wildcards may also be used to match multiple input sets to be modified. - """, + """), "ui:scene:acceptsSetName" : True, @@ -130,25 +131,25 @@ def getMenuPathFunction() : "setVariable" : { "description" : - """ + _(""" A context variable created to pass the name of the set being processed to the nodes connected to the `filter` plug. This can be used to vary the filter for each set. - """, + """), }, "paths" : { "description" : - """ + _(""" The paths to be added to or removed from the set. > Caution : This plug is deprecated and will be removed in a future release. No validity checks are performed on these paths, so it is possible to accidentally generate invalid sets. - """, + """), "vectorDataPlugValueWidget:dragPointer" : "objects", "layout:visibilityActivator" : "pathsInUse", @@ -158,9 +159,9 @@ def getMenuPathFunction() : "filter" : { "description" : - """ + _(""" Defines the locations to be added to or removed from the set. - """, + """), }, diff --git a/python/GafferSceneUI/SetVisualiserUI.py b/python/GafferSceneUI/SetVisualiserUI.py index faad5d44bcf..1982f91ebaa 100644 --- a/python/GafferSceneUI/SetVisualiserUI.py +++ b/python/GafferSceneUI/SetVisualiserUI.py @@ -41,17 +41,18 @@ import IECore import imath +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.SetVisualiser, "description", - """ + _(""" Visualises Set membership values by applying a custom shader and coloring based on which sets each object belongs to. Membership of more than one set is visualised by a stripe pattern. - """, + """), "layout:customWidget:legend:widgetType", "GafferSceneUI.SetVisualiserUI._OutSetsPlugValueWidget", "layout:customWidget:legend:section", "Settings.Legend", @@ -62,12 +63,12 @@ "sets" : { "description" : - """ + _(""" A space separated list of sets to consider membership of. This supports wild cards, eg: asset:* to allow membership display to focus on a specific group of sets. Right-click to insert the name of any sets in the input scene. - """, + """), "ui:scene:acceptsSetNames" : True }, @@ -75,32 +76,32 @@ "includeInherited" : { "description" : - """ + _(""" When enabled, objects that inherit Set membership from their parents will also be coloured. Disabling this will only color objects that are exactly matched by any given Set. - """ + """) }, "stripeWidth" : { "description" : - """ + _(""" The thickness (in pixels) of the stripes used to indicate an object is in more than one set. - """ + """) }, "colorOverrides" : { "description" : - """ + _(""" Allows the randomly generated set colors to be overridden by specific colors to use for Sets matching the supplied filter. This can be a name, or a match string. - """, + """), "layout:section" : "Settings.Color Overrides", @@ -114,11 +115,11 @@ "colorOverrides.*.name" : { "description" : - """ + _(""" Specifies which set or sets to apply the override to. This can be a name, or a match string. Right-click to insert the name of any set in the input scene. - """, + """), "ui:scene:acceptsSetName" : True @@ -260,11 +261,11 @@ def __selectMembers( self ) : def __addMenuDefinition( self ) : result = IECore.MenuDefinition() - result.append( "Add Color Override", { + result.append( _("Add Color Override"), { "command" : Gaffer.WeakMethod( self.__addOverride ), "active" : not self.__hasExistingOverrideFor( self.__label.getText() ) } ) - result.append( "Select Members", { + result.append( _("Select Members"), { "command" : Gaffer.WeakMethod( self.__selectMembers ) } ) return result diff --git a/python/GafferSceneUI/ShaderAssignmentUI.py b/python/GafferSceneUI/ShaderAssignmentUI.py index 18654751fd7..6c9ac850e74 100644 --- a/python/GafferSceneUI/ShaderAssignmentUI.py +++ b/python/GafferSceneUI/ShaderAssignmentUI.py @@ -39,15 +39,16 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ShaderAssignment, "description", - """ + _(""" Assigns shaders to objects. - """, + """), "layout:activator:labelOverride", lambda node : not node["label"].isSetToDefault(), @@ -56,9 +57,9 @@ "shader" : { "description" : - """ + _(""" The shader to be assigned. - """, + """), "noduleLayout:section" : "left", "nodule:type" : "GafferUI::StandardNodule", @@ -68,10 +69,10 @@ "label" : { "description" : - """ + _(""" A label for the shader to be assigned. If this is empty, the node connected to the `shader` plug will be used instead. - """, + """), "nodule:type" : "", "layout:visibilityActivator" : "labelOverride", diff --git a/python/GafferSceneUI/ShaderBallUI.py b/python/GafferSceneUI/ShaderBallUI.py index 27d14ca0369..e2ddae0b20d 100644 --- a/python/GafferSceneUI/ShaderBallUI.py +++ b/python/GafferSceneUI/ShaderBallUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ShaderBall, "description", - """ + _(""" Generates scenes suitable for rendering shader balls. - """, + """), "childNodesAreReadOnly", True, @@ -53,9 +54,9 @@ "shader" : { "description" : - """ + _(""" The shader to be rendered. - """, + """), "noduleLayout:section" : "left", "nodule:type" : "GafferUI::StandardNodule", @@ -65,10 +66,10 @@ "resolution" : { "description" : - """ + _(""" The resolution of the shader ball image, which is always a square. - """, + """), }, diff --git a/python/GafferSceneUI/ShaderQueryUI.py b/python/GafferSceneUI/ShaderQueryUI.py index ecf7fa0a923..daf80f95a9e 100644 --- a/python/GafferSceneUI/ShaderQueryUI.py +++ b/python/GafferSceneUI/ShaderQueryUI.py @@ -44,6 +44,7 @@ import GafferUI import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Internal utilities @@ -159,30 +160,30 @@ def childPlugValueWidget( self, childPlug ) : GafferScene.ShaderQuery, "description", - """ + _(""" Queries shader parameters from a scene location, creating outputs for each parameter. - """, + """), plugs = { "scene" : { "description" : - """ + _(""" The scene to query the shader for. - """, + """), }, "location" : { "description" : - """ + _(""" The location within the scene to query the shader at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -193,11 +194,11 @@ def childPlugValueWidget( self, childPlug ) : "shader" : { "description" : - """ + _(""" The name of the shader to query. > Note : If the shader does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "presetsPlugValueWidget:allowCustom" : True, @@ -210,10 +211,10 @@ def childPlugValueWidget( self, childPlug ) : "inherit" : { "description" : - """ + _(""" Queries inherited shader assignments if the location has no local assignment of its own. - """, + """), "nodule:type" : "", @@ -222,7 +223,7 @@ def childPlugValueWidget( self, childPlug ) : "queries" : { "description" : - """ + _(""" The shader parameters to be queried - arbitrary numbers of shader parameters may be added as children of this plug via the user interface, or via python. Each child is a `NameValuePlug` whose `name` plug is @@ -236,7 +237,7 @@ def childPlugValueWidget( self, childPlug ) : > Note : If either the shader or parameter does not exist then the > query will not be performed and all outputs will be set to their > default values. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -250,37 +251,37 @@ def childPlugValueWidget( self, childPlug ) : "queries.*" : { "description" : - """ + _(""" A pair of parameter name to query and default value. - """, + """), }, "queries.*.name" : { "description" : - """ + _(""" The name of the parameter to query. - """, + """), }, "queries.*.value" : { "description" : - """ + _(""" The value to output if the parameter does not exist. - """, + """), }, "out" : { "description" : - """ + _(""" The parent plug of the query outputs. The order of outputs corresponds to the order of children of `queries`. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -296,9 +297,9 @@ def childPlugValueWidget( self, childPlug ) : "out.*" : { "description" : - """ + _(""" The result of the query. - """, + """), "label" : functools.partial( __getLabel, parentPlug = ""), @@ -312,10 +313,10 @@ def childPlugValueWidget( self, childPlug ) : "out.*.exists" : { "description" : - """ + _(""" Outputs true if the shader, location and parameter exist, otherwise false. - """, + """), "noduleLayout:label" : functools.partial( __getLabel, parentPlug = "exists" ), @@ -326,10 +327,10 @@ def childPlugValueWidget( self, childPlug ) : "out.*.value" : { "description" : - """ + _(""" Outputs the value of the specified parameter, or the default value if the parameter does not exist. - """, + """), "noduleLayout:section" : "right", "noduleLayout:spacing" : 0.2, @@ -624,7 +625,7 @@ def __plugPopupMenu( menuDefinition, plugValueWidget ) : if len( menuDefinition.items() ) : menuDefinition.append( "/DeleteDivider", { "divider" : True } ) - menuDefinition.append( "/Delete", { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) + menuDefinition.append( "/" + _("Delete"), { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) def __deletePlug( plug ) : diff --git a/python/GafferSceneUI/ShaderTweakProxyUI.py b/python/GafferSceneUI/ShaderTweakProxyUI.py index 70e5b4ad3da..6760a790e73 100644 --- a/python/GafferSceneUI/ShaderTweakProxyUI.py +++ b/python/GafferSceneUI/ShaderTweakProxyUI.py @@ -44,16 +44,17 @@ import functools import imath +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ShaderTweakProxy, "description", - """ + _(""" Represents a shader in the shader network that a ShaderTweaks node is modifying. Allows forming connections from existing shaders to shaders that are being inserted. - """, + """), "icon", "shaderTweakProxy.png", @@ -61,14 +62,14 @@ "name" : { - "description" : "Hardcoded for ShaderTweakProxy nodes.", + "description" : _("Hardcoded for ShaderTweakProxy nodes."), "plugValueWidget:type" : "", }, "type" : { - "description" : "Hardcoded for ShaderTweakProxy nodes.", + "description" : _("Hardcoded for ShaderTweakProxy nodes."), "plugValueWidget:type" : "", }, @@ -82,10 +83,10 @@ "parameters.targetShader" : { "description" : - """ + _(""" The handle of the upstream shader being fetched by this proxy - or Auto, indicating that the original input of the parameter being ShaderTweaked will be used. - """, + """), "readOnly" : True, "nodule:type" : "", "stringPlugValueWidget:placeholderText" : "Auto", @@ -102,9 +103,9 @@ "out.*" : { "description" : - """ + _(""" The name of the output on the shader we are fetching, or "auto" for an auto proxy. - """, + """), }, @@ -304,7 +305,7 @@ def isParameterOrTweak( plug ) : # any connected as outputs either. return - menuDefinition.append( "/Create ShaderTweakProxy", + menuDefinition.append( "/" + _("Create ShaderTweakProxy"), { "subMenu" : functools.partial( _plugContextMenu, plug, None ) } ) diff --git a/python/GafferSceneUI/ShaderTweaksUI.py b/python/GafferSceneUI/ShaderTweaksUI.py index b4cca1fbddc..5f2d8430729 100644 --- a/python/GafferSceneUI/ShaderTweaksUI.py +++ b/python/GafferSceneUI/ShaderTweaksUI.py @@ -46,13 +46,14 @@ import GafferSceneUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ShaderTweaks, "description", - """ + _(""" Makes modifications to shader parameter values. Shader parameters are identified by name, and can optionally be filtered by the name and type of the shader they belong to. Examples : @@ -64,7 +65,7 @@ - `diffuseTexture*{shaderType=image}.mipmap_bias` : Chooses all parameters called `mipmap_bias` on shaders whose type is `image` and whose name matches `diffuseTexture*`. > Tip : Parameters can be dragged from the SceneInspector and dropped into the text field to fill the name automatically. - """, + """), "layout:section:Settings.Tweaks:collapsed", False, @@ -73,10 +74,10 @@ "shader" : { "description" : - """ + _(""" The type of shader to modify. This is actually the name of an attribute which contains the shader network. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "presetsPlugValueWidget:allowCustom" : True, @@ -90,12 +91,12 @@ "localise" : { "description" : - """ + _(""" Turn on to allow location-specific tweaks to be made to inherited shaders. Shaders will be localised to locations matching the node's filter prior to tweaking. The original inherited shader will remain untouched. - """, + """), "layout:index" : 1 }, @@ -103,10 +104,10 @@ "ignoreMissing" : { "description" : - """ + _(""" Ignores tweaks targeting missing parameters. When off, missing parameters cause the node to error. - """, + """), "layout:index" : 2 @@ -115,12 +116,12 @@ "tweaks" : { "description" : - """ + _(""" The tweaks to be made to the parameters of the shader. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or using the ShaderTweaks API via python. - """, + """), "layout:section" : "Settings.Tweaks", "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -318,7 +319,7 @@ def __parametersDropHandler( widget, dragDropEvent ) : parameters = __filteredParameters( widget, dragDropEvent ) if not parameters : - GafferUI.PopupWindow.showWarning( "Parameters added already", parent = widget ) + GafferUI.PopupWindow.showWarning( _("Parameters added already"), parent = widget ) toCreate = {} for name, value in parameters.items() : @@ -327,7 +328,7 @@ def __parametersDropHandler( widget, dragDropEvent ) : except : # If we can't handle a parameter, then warn and exit without handling any # others. It's confusing if we show a warning but still make some tweaks. - GafferUI.PopupWindow.showWarning( "Unsupported data type", parent = widget ) + GafferUI.PopupWindow.showWarning( _("Unsupported data type"), parent = widget ) return with Gaffer.UndoScope( widget.plugParent().ancestor( Gaffer.ScriptNode ) ) : @@ -361,8 +362,8 @@ def __init__( self, plugs ): self.__proxyButton = GafferUI.MenuButton( image="shaderTweakProxyIcon.png", hasFrame=False, - menu=GafferUI.Menu( Gaffer.WeakMethod( self.__createProxyMenuDefinition ), title = "Create Proxy" ), - toolTip = "Proxies allow making connections from the outputs of nodes in the input network." + menu=GafferUI.Menu( Gaffer.WeakMethod( self.__createProxyMenuDefinition ), title = _("Create Proxy") ), + toolTip = _("Proxies allow making connections from the outputs of nodes in the input network.") ) self.__updateButtonVisibility() diff --git a/python/GafferSceneUI/ShaderUI.py b/python/GafferSceneUI/ShaderUI.py index 8f0947f61f0..36121859201 100644 --- a/python/GafferSceneUI/ShaderUI.py +++ b/python/GafferSceneUI/ShaderUI.py @@ -52,6 +52,7 @@ import GafferSceneUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -105,13 +106,13 @@ def __parameterComponentNoduleLabel( plug ) : "name" : { "description" : - """ + _(""" The name of the shader being represented. This should be considered read-only. Use the `Shader.loadShader()` method to load a shader. - """, + """), - "label" : "Shader", + "label" : _("Shader"), "readOnly" : True, "layout:section" : "", "nodule:type" : "", @@ -122,11 +123,11 @@ def __parameterComponentNoduleLabel( plug ) : "type" : { "description" : - """ + _(""" The type of the shader being represented. This should be considered read-only. Use the `Shader.loadShader()` method to load a shader. - """, + """), "readOnly" : True, "layout:section" : "", @@ -138,9 +139,9 @@ def __parameterComponentNoduleLabel( plug ) : "parameters" : { "description" : - """ + _(""" Where the parameters for the shader are represented. - """, + """), "nodule:type" : "GafferUI::CompoundNodule", "noduleLayout:section" : "left", @@ -191,9 +192,9 @@ def __parameterComponentNoduleLabel( plug ) : "out" : { "description" : - """ + _(""" The output from the shader. - """, + """), "noduleLayout:section" : "right", "plugValueWidget:type" : "", @@ -212,9 +213,9 @@ def __parameterComponentNoduleLabel( plug ) : "attributeSuffix" : { "description" : - """ + _(""" Suffix for the attribute used for shader assignment. - """, + """), "nodule:type" : "", "plugValueWidget:type" : "", @@ -241,7 +242,7 @@ def __init__( self, plugs, **kw ) : with row : self.__stringPlugValueWidget = GafferUI.StringPlugValueWidget( plugs ) - self.__reloadButton = GafferUI.Button( image = "refresh.png", hasFrame = False, toolTip = "Click to reload shader" ) + self.__reloadButton = GafferUI.Button( image = "refresh.png", hasFrame = False, toolTip = _("Click to reload shader") ) self.__reloadButton.clickedSignal().connect( Gaffer.WeakMethod( self.__reloadButtonClicked ) ) def setPlugs( self, plugs ) : @@ -307,7 +308,7 @@ def __loadFromFile( menu, extensions, nodeCreator ) : path = Gaffer.FileSystemPath( bookmarks.getDefault( menu ) ) path.setFilter( Gaffer.FileSystemPath.createStandardFilter( extensions ) ) - dialogue = GafferUI.PathChooserDialogue( path, title="Load Shader", confirmLabel = "Load", valid=True, leaf=True, bookmarks = bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title=_("Load Shader"), confirmLabel = _("Load"), valid=True, leaf=True, bookmarks = bookmarks ) path = dialogue.waitForPath( parentWindow = menu.ancestor( GafferUI.ScriptWindow ) ) if not path : @@ -369,7 +370,7 @@ def __shaderSubMenu( searchPaths, extensions, nodeCreator, matchExpression, sear ) result.append( "/LoadDivider", { "divider" : True } ) - result.append( "/Load...", { "command" : GafferUI.NodeMenu.nodeCreatorWrapper( lambda menu : __loadFromFile( menu, extensions, nodeCreator ) ) } ) + result.append( "/" + _("Load..."), { "command" : GafferUI.NodeMenu.nodeCreatorWrapper( lambda menu : __loadFromFile( menu, extensions, nodeCreator ) ) } ) return result @@ -439,10 +440,10 @@ def cellData( self, path, canceller = None ) : if "shader:instances" in path.propertyNames() and path.property( "shader:instances" ) > 1 : data.icon = "duplicate.png" - data.toolTip = "Shader occurs in multiple networks." + data.toolTip = _("Shader occurs in multiple networks.") elif len( path.property( "shader:parameterValues" ) ) > 1 : data.icon = "duplicate.png" - data.toolTip = "Parameter occurs in multiple shaders." + data.toolTip = _("Parameter occurs in multiple shaders.") return data @@ -472,12 +473,12 @@ def cellData( self, path, canceller = None ) : if len( inputs ) > 1 : data.value = "---" - data.toolTip = "Select parameter inputs and scroll to first.\n\nInputs :\n" + data.toolTip = _("Select parameter inputs and scroll to first.\n\nInputs :\n") for i in inputs : data.toolTip += "- {}\n".format( i ) else : data.value = next( iter( inputs ) ) - data.toolTip = "Select and scroll to parameter input." + data.toolTip = _("Select and scroll to parameter input.") return data @@ -768,7 +769,7 @@ def __init__( self, shaderNetworks, title, selectParameters, **kw ) : self.__filter.setEnabled( False ) self.__filter.userData()["UI"] = { "editable" : True, - "label" : "Filter", + "label" : _("Filter"), "propertyFilters" : { "name": "Name", "shader:type": "Type" } } @@ -891,7 +892,7 @@ class _ShaderParameterDialogue( _ShaderDialogueBase ) : def __init__( self, shaderNetworks, title = None, **kw ) : if title is None : - title = "Select Shader Parameters" + title = _("Select Shader Parameters") _ShaderDialogueBase.__init__( self, shaderNetworks, title, True, **kw ) @@ -912,7 +913,7 @@ class _ShaderDialogue( _ShaderDialogueBase ) : def __init__( self, shaderNetworks, title = None, **kw ) : if title is None : - title = "Select Shader" + title = _("Select Shader") _ShaderDialogueBase.__init__( self, shaderNetworks, title, False, **kw ) diff --git a/python/GafferSceneUI/ShaderViewUI.py b/python/GafferSceneUI/ShaderViewUI.py index 399b4008d21..337eeaa3e39 100644 --- a/python/GafferSceneUI/ShaderViewUI.py +++ b/python/GafferSceneUI/ShaderViewUI.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( @@ -52,9 +53,9 @@ "scene" : { "description" : - """ + _(""" Defines the scene used for the shader preview. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ShaderViewUI._ScenePlugValueWidget", }, @@ -74,7 +75,7 @@ class _ScenePlugValueWidget( GafferUI.PlugValueWidget ) : def __init__( self, plug, **kw ) : - menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title = "Shader Preview Scene" ) + menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), title = _("Shader Preview Scene") ) menuButton = GafferUI.MenuButton( menu=menu, image = "scene.png", hasFrame=False ) GafferUI.PlugValueWidget.__init__( self, menuButton, plug, **kw ) @@ -102,7 +103,7 @@ def __menuDefinition( self ) : m.append( "/SettingsDivider", { "divider" : True } ) - m.append( "/Settings...", { "command" : Gaffer.WeakMethod( self.__showSettings ) } ) + m.append( "/" + _("Settings..."), { "command" : Gaffer.WeakMethod( self.__showSettings ) } ) return m @@ -122,7 +123,7 @@ class _SettingsWindow( GafferUI.Window ) : def __init__( self, shaderView ) : - GafferUI.Window.__init__( self, "ShaderView Settings" ) + GafferUI.Window.__init__( self, _("ShaderView Settings") ) with self : with GafferUI.ListContainer() : diff --git a/python/GafferSceneUI/ShuffleAttributesUI.py b/python/GafferSceneUI/ShuffleAttributesUI.py index 2c07dc063fb..65dddca83df 100644 --- a/python/GafferSceneUI/ShuffleAttributesUI.py +++ b/python/GafferSceneUI/ShuffleAttributesUI.py @@ -38,13 +38,14 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ShuffleAttributes, "description", - """ + _(""" ShuffleAttributes is used to copy or rename arbitrary numbers of attributes at the filtered locations. The deleteSource plugs may be used to remove the original source attribute(s) after the shuffling has been completed. The replaceDestination @@ -54,19 +55,19 @@ An additional context variable `${source}` can be used on the destination plugs to insert the name of each source attribute. For example, to prefix all attributes with `user:` set the source to `*` and the destination to `user:${source}`. - """, + """), plugs = { "shuffles" : { "description" : - """ + _(""" The attributes to be shuffled - arbitrary numbers of attributes may be shuffled via the source/destination plugs. The deleteSource plug may be used to remove the original attribute(s). The replaceDestination plug may be used to specify whether each shuffle should replace already written destination data with the same name. - """, + """), }, diff --git a/python/GafferSceneUI/ShuffleOptionsUI.py b/python/GafferSceneUI/ShuffleOptionsUI.py index e46c42b2d03..5a0f621966d 100644 --- a/python/GafferSceneUI/ShuffleOptionsUI.py +++ b/python/GafferSceneUI/ShuffleOptionsUI.py @@ -36,25 +36,26 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ShuffleOptions, "description", - """ + _(""" Shuffles options in the scene globals by copying and/or renaming them. - """, + """), plugs = { "shuffles" : { "description" : - """ + _(""" Defines the shuffling to be performed. Add shuffles by pressing `+` in the UI, or adding `ShufflePlug` children using the API. - """, + """), }, diff --git a/python/GafferSceneUI/ShufflePrimitiveVariablesUI.py b/python/GafferSceneUI/ShufflePrimitiveVariablesUI.py index 428c27dee6a..38867fce721 100644 --- a/python/GafferSceneUI/ShufflePrimitiveVariablesUI.py +++ b/python/GafferSceneUI/ShufflePrimitiveVariablesUI.py @@ -36,13 +36,14 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ShufflePrimitiveVariables, "description", - """ + _(""" ShufflePrimitiveVariables is used to copy or rename arbitrary numbers of primitive variables at the filtered locations. The deleteSource plugs may be used to remove the original source primitive variable(s) after the shuffling has been completed. @@ -52,20 +53,20 @@ An additional context variable `${source}` can be used on the destination plugs to insert the name of each source primitive variable. For example, to append `ref` to all primitive variables set the source to `*` and the destination to `${source}ref`. - """, + """), plugs = { "shuffles" : { "description" : - """ + _(""" The primitive variables to be shuffled - arbitrary numbers of primitive variables may be shuffled via the source/destination plugs. The deleteSource plug may be used to remove the original primitive variable(s). The replaceDestination plug may be used to specify whether each shuffle should replace already written destination data with the same name. - """, + """), "divider" : True, diff --git a/python/GafferSceneUI/ShuffleRenderPassesUI.py b/python/GafferSceneUI/ShuffleRenderPassesUI.py index 54d60764171..2f391cc6c6b 100644 --- a/python/GafferSceneUI/ShuffleRenderPassesUI.py +++ b/python/GafferSceneUI/ShuffleRenderPassesUI.py @@ -36,48 +36,49 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.ShuffleRenderPasses, "description", - """ + _(""" Shuffles render passes, allowing them to be copied and/or renamed. An additional context variable `${source}` can be used on the destination plugs to insert the name of each source render pass. For example, to prefix all render passes with `test_` set the source to `*` and the destination to `test_${source}`. - """, + """), plugs = { "in" : { "description" : - """ + _(""" The input scene. - """, + """), }, "out" : { "description" : - """ + _(""" The processed output scene. - """, + """), }, "shuffles" : { "description" : - """ + _(""" The definition of the shuffling to be performed - an arbitrary number of render pass edits can be made by adding ShufflePlugs as children of this plug. - """, + """), }, diff --git a/python/GafferSceneUI/SphereUI.py b/python/GafferSceneUI/SphereUI.py index 9fddc99a308..ad046a22761 100644 --- a/python/GafferSceneUI/SphereUI.py +++ b/python/GafferSceneUI/SphereUI.py @@ -37,6 +37,7 @@ import Gaffer import GafferScene import GafferUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -47,9 +48,9 @@ GafferScene.Sphere, "description", - """ + _(""" Produces scenes containing a sphere. - """, + """), "layout:activator:typeIsMesh", lambda node : node["type"].getValue() == GafferScene.Sphere.Type.Mesh, @@ -58,9 +59,9 @@ "type" : { "description" : - """ + _(""" The type of object to produce. May be a SpherePrimitive or a Mesh. - """, + """), "preset:Primitive" : GafferScene.Sphere.Type.Primitive, "preset:Mesh" : GafferScene.Sphere.Type.Mesh, @@ -72,50 +73,50 @@ "radius" : { "description" : - """ + _(""" Radius of the sphere. - """, + """), }, "zMin" : { "description" : - """ + _(""" Limits the extent of the sphere along the lower pole. Valid values are in the range [-1,1] and should always be less than zMax. - """, + """), }, "zMax" : { "description" : - """ + _(""" Limits the extent of the sphere along the upper pole. Valid values are in the range [-1,1] and should always be greater than zMin. - """, + """), }, "thetaMax" : { "description" : - """ + _(""" Limits the extent of the sphere around the pole axis. Valid values are in the range [0,360]. - """, + """), }, "divisions" : { "description" : - """ + _(""" Controls tesselation of the sphere when type is Mesh. - """, + """), "layout:activator" : "typeIsMesh", diff --git a/python/GafferSceneUI/StandardAttributesUI.py b/python/GafferSceneUI/StandardAttributesUI.py index 255410532a4..3566a97928c 100644 --- a/python/GafferSceneUI/StandardAttributesUI.py +++ b/python/GafferSceneUI/StandardAttributesUI.py @@ -37,16 +37,17 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ def __attributesSummary( plug ) : info = [] if plug["scene:visible"]["enabled"].getValue() : - info.append( "Visible" if plug["scene:visible"]["value"].getValue() else "Invisible" ) + info.append( _("Visible") if plug["scene:visible"]["value"].getValue() else _("Invisible") ) if plug["doubleSided"]["enabled"].getValue() : - info.append( "Double Sided" if plug["doubleSided"]["value"].getValue() else "Single Sided" ) + info.append( _("Double Sided") if plug["doubleSided"]["value"].getValue() else _("Single Sided") ) if plug["render:displayColor"]["enabled"].getValue() : - info.append( "Display Color" ) + info.append( _("Display Color") ) return ", ".join( info ) @@ -54,7 +55,7 @@ def __instancingSummary( plug ) : info = [] if plug["gaffer:automaticInstancing"]["enabled"].getValue() : - info.append( "Automatic Instancing " + ( "On" if plug["gaffer:automaticInstancing"]["value"].getValue() else "Off" ) ) + info.append( _("Automatic Instancing") + " " + ( _("On") if plug["gaffer:automaticInstancing"]["value"].getValue() else _("Off") ) ) return ", ".join( info ) @@ -67,9 +68,9 @@ def __motionBlurSummary( plug ) : if onOffEnabled or segmentsEnabled : items = [] if onOffEnabled : - items.append( "On" if plug["gaffer:"+motionType+"Blur"]["value"].getValue() else "Off" ) + items.append( _("On") if plug["gaffer:"+motionType+"Blur"]["value"].getValue() else _("Off") ) if segmentsEnabled : - items.append( "%d Segments" % plug["gaffer:"+motionType+"BlurSegments"]["value"].getValue() ) + items.append( _("%d Segments") % plug["gaffer:"+motionType+"BlurSegments"]["value"].getValue() ) info.append( motionType.capitalize() + " : " + "/".join( items ) ) return ", ".join( info ) @@ -79,10 +80,10 @@ def __motionBlurSummary( plug ) : GafferScene.StandardAttributes, "description", - """ + _(""" Modifies the standard attributes on objects - these should be respected by all renderers. - """, + """), plugs = { diff --git a/python/GafferSceneUI/StandardOptionsUI.py b/python/GafferSceneUI/StandardOptionsUI.py index 2e21f83608c..848411fb051 100644 --- a/python/GafferSceneUI/StandardOptionsUI.py +++ b/python/GafferSceneUI/StandardOptionsUI.py @@ -45,6 +45,7 @@ import GafferSceneUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -56,7 +57,7 @@ def __cameraSummary( plug ) : if plug["render:camera"]["enabled"].getValue() : info.append( plug["render:camera"]["value"].getValue() ) if plug["render:filmFit"]["enabled"].getValue() : - info.append( "Fit Mode %s" % + info.append( _("Fit Mode %s") % IECoreScene.Camera.FilmFit.values[ plug["render:filmFit"]["value"].getValue() ].name ) if plug["render:resolution"]["enabled"].getValue() : @@ -64,17 +65,17 @@ def __cameraSummary( plug ) : info.append( "%dx%d" % ( resolution[0], resolution[1] ) ) if plug["render:pixelAspectRatio"]["enabled"].getValue() : pixelAspectRatio = plug["render:pixelAspectRatio"]["value"].getValue() - info.append( "Aspect %s" % GafferUI.NumericWidget.valueToString( pixelAspectRatio ) ) + info.append( _("Aspect %s") % GafferUI.NumericWidget.valueToString( pixelAspectRatio ) ) if plug["render:resolutionMultiplier"]["enabled"].getValue() : resolutionMultiplier = plug["render:resolutionMultiplier"]["value"].getValue() - info.append( "Mult %s" % GafferUI.NumericWidget.valueToString( resolutionMultiplier ) ) + info.append( _("Mult %s") % GafferUI.NumericWidget.valueToString( resolutionMultiplier ) ) if plug["render:cropWindow"]["enabled"].getValue() : crop = plug["render:cropWindow"]["value"].getValue() - info.append( "Crop %s,%s-%s,%s" % tuple( GafferUI.NumericWidget.valueToString( x ) for x in ( crop.min().x, crop.min().y, crop.max().x, crop.max().y ) ) ) + info.append( _("Crop %s,%s-%s,%s") % tuple( GafferUI.NumericWidget.valueToString( x ) for x in ( crop.min().x, crop.min().y, crop.max().x, crop.max().y ) ) ) if plug["render:overscan"]["enabled"].getValue() : - info.append( "Overscan %s" % ( "On" if plug["render:overscan"]["value"].getValue() else "Off" ) ) + info.append( _("Overscan %s") % ( _("On") if plug["render:overscan"]["value"].getValue() else _("Off") ) ) if plug["render:depthOfField"]["enabled"].getValue() : - info.append( "DOF " + ( "On" if plug["render:depthOfField"]["value"].getValue() else "Off" ) ) + info.append( _("DOF") + " " + ( _("On") if plug["render:depthOfField"]["value"].getValue() else _("Off") ) ) return ", ".join( info ) @@ -92,13 +93,13 @@ def __renderSetSummary( plug ) : info = [] if plug["render:includedPurposes"]["enabled"].getValue() : purposes = plug["render:includedPurposes"]["value"].getValue() - info.append( "Purposes {}".format( " / ".join( [ p.capitalize() for p in purposes ] ) if purposes else "None" ) ) + info.append( _("Purposes {}").format( " / ".join( [ p.capitalize() for p in purposes ] ) if purposes else _("None") ) ) if plug["render:inclusions"]["enabled"].getValue() : - info.append( "Inclusions {}".format( plug["render:inclusions"]["value"].getValue() ) ) + info.append( _("Inclusions {}").format( plug["render:inclusions"]["value"].getValue() ) ) if plug["render:exclusions"]["enabled"].getValue() : - info.append( "Exclusions {}".format( plug["render:exclusions"]["value"].getValue() ) ) + info.append( _("Exclusions {}").format( plug["render:exclusions"]["value"].getValue() ) ) if plug["render:additionalLights"]["enabled"].getValue() : - info.append( "Lights {}".format( plug["render:additionalLights"]["value"].getValue() ) ) + info.append( _("Lights {}").format( plug["render:additionalLights"]["value"].getValue() ) ) return ", ".join( info ) @@ -106,11 +107,11 @@ def __motionBlurSummary( plug ) : info = [] if plug["render:transformBlur"]["enabled"].getValue() : - info.append( "Transform " + ( "On" if plug["render:transformBlur"]["value"].getValue() else "Off" ) ) + info.append( _("Transform") + " " + ( _("On") if plug["render:transformBlur"]["value"].getValue() else _("Off") ) ) if plug["render:deformationBlur"]["enabled"].getValue() : - info.append( "Deformation " + ( "On" if plug["render:deformationBlur"]["value"].getValue() else "Off" ) ) + info.append( _("Deformation") + " " + ( _("On") if plug["render:deformationBlur"]["value"].getValue() else _("Off") ) ) if plug["render:shutter"]["enabled"].getValue() : - info.append( "Shutter " + str( plug["render:shutter"]["value"].getValue() ) ) + info.append( _("Shutter") + " " + str( plug["render:shutter"]["value"].getValue() ) ) return ", ".join( info ) @@ -118,7 +119,7 @@ def __statisticsSummary( plug ) : info = [] if plug["render:performanceMonitor"]["enabled"].getValue() : - info.append( "Performance Monitor " + ( "On" if plug["render:performanceMonitor"]["value"].getValue() else "Off" ) ) + info.append( _("Performance Monitor") + " " + ( _("On") if plug["render:performanceMonitor"]["value"].getValue() else _("Off") ) ) return ", ".join( info ) @@ -127,10 +128,10 @@ def __statisticsSummary( plug ) : GafferScene.StandardOptions, "description", - """ + _(""" Specifies the standard options (global settings) for the scene. These should be respected by all renderers. - """, + """), plugs = { diff --git a/python/GafferSceneUI/SubTreeUI.py b/python/GafferSceneUI/SubTreeUI.py index 3599af3cdc1..e6c52e5449a 100644 --- a/python/GafferSceneUI/SubTreeUI.py +++ b/python/GafferSceneUI/SubTreeUI.py @@ -39,6 +39,7 @@ import GafferScene import GafferSceneUI +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -49,18 +50,18 @@ GafferScene.SubTree, "description", - """A node for extracting a specific branch from a scene.""", + _("""A node for extracting a specific branch from a scene."""), plugs = { "root" : { "description" : - """ + _(""" The location to become the new root for the output scene. All locations below this will be kept, and all others will be discarded. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", @@ -69,45 +70,45 @@ "includeRoot" : { "description" : - """ + _(""" Causes the root location to also be kept in the output scene, in addition to its children. For instance, if the scene contains only `/city/street/house` and the root is set to `/city/street`, then the new scene will by default contain only `/house` - but the `includeRoot` setting will cause it to contain `/street/house` instead. - """, + """), }, "inheritTransform" : { "description" : - """ + _(""" Maintains the subtree's world-space position by applying the `root` location's full transform to the subtree's children. - """ + """) }, "inheritAttributes" : { "description" : - """ + _(""" Maintains the subtree's attributes (including shader assignments) by applying the `root` location's full attributes to the subtree's children. - """ + """) }, "inheritSetMembership" : { "description" : - """ + _(""" Maintains the subtree's membership in sets by transferring the `root` location's memberships to the subtree's children. - """ + """) }, diff --git a/python/GafferSceneUI/TextUI.py b/python/GafferSceneUI/TextUI.py index f9f73d9ab77..b3bb0b7f220 100644 --- a/python/GafferSceneUI/TextUI.py +++ b/python/GafferSceneUI/TextUI.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -49,31 +50,31 @@ GafferScene.Text, "description", - """ + _(""" Creates an object containing a polygon representation of an arbitrary string of text. - """, + """), plugs = { "text" : { "description" : - """ + _(""" The text to output. This is triangulated into a mesh representation using the specified font. - """, + """), }, "font" : { "description" : - """ + _(""" The font to use - this should be a .ttf font file which is located on the paths specified by the IECORE_FONT_PATHS environment variable. - """, + """), "plugValueWidget:type" : "GafferUI.FileSystemPathPlugValueWidget", "path:bookmarks" : "font", diff --git a/python/GafferSceneUI/TransformQueryUI.py b/python/GafferSceneUI/TransformQueryUI.py index 04a20b48b04..06858f62f1a 100644 --- a/python/GafferSceneUI/TransformQueryUI.py +++ b/python/GafferSceneUI/TransformQueryUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.TransformQuery, "description", - """ + _(""" Queries a particular location in a scene and outputs the transform. - """, + """), "layout:activator:spaceIsRelative", lambda node : node["space"].getValue() == GafferScene.TransformQuery.Space.Relative, @@ -53,21 +54,21 @@ "scene" : { "description" : - """ + _(""" The scene to query the transform for. - """ + """) }, "location" : { "description" : - """ + _(""" The location within the scene to query the transform at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -78,9 +79,9 @@ "space" : { "description" : - """ + _(""" The space to query the transform. - """, + """), "preset:Local" : GafferScene.TransformQuery.Space.Local, "preset:World" : GafferScene.TransformQuery.Space.World, @@ -93,12 +94,12 @@ "relativeLocation" : { "description" : - """ + _(""" The location within the scene to query the transform for relative space mode. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values. - """, + """), "plugValueWidget:type" : "GafferSceneUI.ScenePathPlugValueWidget", "scenePathPlugValueWidget:scene" : "scene", @@ -110,9 +111,9 @@ "invert" : { "description" : - """ + _(""" Invert the result transform. - """, + """), "nodule:type" : "" }, @@ -120,9 +121,9 @@ "matrix" : { "description" : - """ + _(""" 4x4 matrix of the requested transform. - """, + """), "layout:section" : "Settings.Outputs" @@ -130,27 +131,27 @@ "translate" : { "description" : - """ + _(""" Translation component of requested transform. - """, + """), "layout:section" : "Settings.Outputs" }, "rotate" : { "description" : - """ + _(""" Rotation component of requested transform (degrees). - """, + """), "layout:section" : "Settings.Outputs" }, "scale" : { "description" : - """ + _(""" Scaling component of requested transform. - """, + """), "layout:section" : "Settings.Outputs" }, diff --git a/python/GafferSceneUI/TransformToolUI.py b/python/GafferSceneUI/TransformToolUI.py index b18ade5b0dc..d7b2f951634 100644 --- a/python/GafferSceneUI/TransformToolUI.py +++ b/python/GafferSceneUI/TransformToolUI.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -50,9 +51,9 @@ GafferSceneUI.TransformTool, "description", - """ + _(""" Base class for tools that edit object transforms. - """, + """), "nodeToolbar:bottom:type", "GafferUI.StandardNodeToolbar.bottom", @@ -106,7 +107,7 @@ def __init__( self, tool, **kw ) : def __plugSet( self, *unused ) : label = Gaffer.Metadata.value( self.__tool, "ui:transformTool:toolTip" ) or "" - self.__tipLabel.setText( label ) + self.__tipLabel.setText( "\n".join( _( line ) for line in label.split( "\n" ) ) if label else "" ) if not label : self.__innerFrame.setVisible( False ) @@ -157,7 +158,7 @@ def getToolTip( self ) : for s in toolSelection : if result : result += "\n" - result += "- Transforming {0} using {1}".format( s.path(), s.editTarget().relativeName( script ) ) + result += "- " + _("Transforming {0} using {1}").format( s.path(), s.editTarget().relativeName( script ) ) return result @@ -179,7 +180,7 @@ def __update( self, *unused ) : editTargets = { s.editTarget() for s in toolSelection if s.editable() } warnings = { s.warning() for s in toolSelection if s.warning() } if not warnings and not self.__tool.selectionEditable() : - warnings = { "Selection not editable" } + warnings = { _("Selection not editable") } # Update info row to show what we're editing @@ -187,7 +188,7 @@ def __update( self, *unused ) : self.__infoRow.setVisible( False ) elif len( editTargets ) == 1 : self.__infoRow.setVisible( True ) - self.__infoLabel.setText( "Editing " ) + self.__infoLabel.setText( _("Editing ") ) editTarget = Gaffer.MetadataAlgo.firstViewableNode( next( iter( editTargets ) ) ) numComponents = _distance( editTarget.commonAncestor( toolSelection[0].scene() ), @@ -199,7 +200,7 @@ def __update( self, *unused ) : self.__nameLabel.setGraphComponent( editTarget ) else : self.__infoRow.setVisible( True ) - self.__infoLabel.setText( "Editing {0} transforms".format( len( editTargets ) ) ) + self.__infoLabel.setText( _("Editing {0} transforms").format( len( editTargets ) ) ) self.__nameLabel.setGraphComponent( None ) # Update warning row @@ -209,7 +210,7 @@ def __update( self, *unused ) : self.__warningLabel.setText( next( iter( warnings ) ) ) self.__warningLabel.setToolTip( "" ) else : - self.__warningLabel.setText( "{} warnings".format( len( warnings ) ) ) + self.__warningLabel.setText( _("{} warnings").format( len( warnings ) ) ) self.__warningLabel.setToolTip( "\n".join( "- " + w for w in warnings ) ) self.__warningRow.setVisible( True ) else : @@ -219,7 +220,7 @@ def __update( self, *unused ) : self.__infoRow.setVisible( True ) self.__warningRow.setVisible( False ) - self.__infoLabel.setText( "Select something to transform" ) + self.__infoLabel.setText( _("Select something to transform") ) self.__nameLabel.setGraphComponent( None ) def __buttonDoubleClick( self, widget, event ) : diff --git a/python/GafferSceneUI/TransformUI.py b/python/GafferSceneUI/TransformUI.py index d90f172f906..51d31c16652 100644 --- a/python/GafferSceneUI/TransformUI.py +++ b/python/GafferSceneUI/TransformUI.py @@ -38,23 +38,24 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Transform, "description", - """ + _(""" Applies a transformation to the local matrix of all locations matched by the filter. - """, + """), plugs = { "space" : { "description" : - """ + _(""" The space in which the transformation is specified. Note that no matter which space is chosen, only the local matrices of the filtered locations are ever modified. @@ -82,7 +83,7 @@ : The transformation is specified as an absolute matrix in world space. Each of the filtered locations will be moved to this absolute position. - """, + """), "preset:Local" : GafferScene.Transform.Space.Local, "preset:Parent" : GafferScene.Transform.Space.Parent, @@ -98,9 +99,9 @@ "transform" : { "description" : - """ + _(""" The transform to be applied. - """, + """), } diff --git a/python/GafferSceneUI/TranslateToolUI.py b/python/GafferSceneUI/TranslateToolUI.py index 94442921b24..4c8e0c11b5d 100644 --- a/python/GafferSceneUI/TranslateToolUI.py +++ b/python/GafferSceneUI/TranslateToolUI.py @@ -38,15 +38,16 @@ import Gaffer import GafferSceneUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferSceneUI.TranslateTool, "description", - """ + _(""" Tool for editing object translation. - """, + """), "nodeToolbar:bottom:type", "GafferUI.StandardNodeToolbar.bottom", @@ -60,12 +61,12 @@ "orientation" : { "description" : - """ + _(""" The space used to define the orientation of the XYZ translation handles. Note that this is independent of the space setting on a Transform node - each setting can be mixed and matched freely. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", diff --git a/python/GafferSceneUI/UDIMQueryUI.py b/python/GafferSceneUI/UDIMQueryUI.py index e4f6c2e06d2..c9b84a72fc8 100644 --- a/python/GafferSceneUI/UDIMQueryUI.py +++ b/python/GafferSceneUI/UDIMQueryUI.py @@ -39,13 +39,14 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.UDIMQuery, "description", - """ + _(""" Gathering information about what UDIMs are present in meshes matching the input scene and filter, and which meshes they belong to. @@ -68,26 +69,26 @@ }, } ``` - """, + """), plugs = { "in" : { "description" : - """ + _(""" The scene to query UDIMs from. - """, + """), }, "filter" : { "description" : - """ + _(""" The filter used to control which parts of the scene are processed. A Filter node should be connected here. - """, + """), "layout:section" : "Filter", "noduleLayout:section" : "right", @@ -100,10 +101,10 @@ "uvSet" : { "description" : - """ + _(""" The name of the primitive variable which drives the UVs to compute UDIMs from. Should be a Face-Varying or Vertex interpolated V2f. - """, + """), "nodule:type" : "", }, @@ -111,10 +112,10 @@ "attributes" : { "description" : - """ + _(""" A space separated list of attribute names ( may use wildcards ), to collect from meshes which have UDIMs, and return as part of the output. Inherited attributes are included. - """, + """), "nodule:type" : "", }, @@ -122,9 +123,9 @@ "out" : { "description" : - """ + _(""" A 3 level dictionary of results stored in a CompoundObject, as described in the node description. - """, + """), "nodule:type" : "GafferUI::StandardNodule", diff --git a/python/GafferSceneUI/UVInspector.py b/python/GafferSceneUI/UVInspector.py index 85376aba709..9e2ff5f13ee 100644 --- a/python/GafferSceneUI/UVInspector.py +++ b/python/GafferSceneUI/UVInspector.py @@ -39,6 +39,7 @@ import Gaffer import GafferImage import GafferUI +from GafferUI.i18n import _ import GafferSceneUI class UVInspector( GafferSceneUI.SceneEditor ) : @@ -175,6 +176,6 @@ def __update( self ) : paused = self.__uvView.getPaused() self.__button.setImage( "viewPause.png" if not paused else "viewPaused.png" ) self.__busyWidget.setBusy( self.__uvView.state() == self.__uvView.State.Running ) - self.__button.setToolTip( "Viewer updates suspended, click to resume" if paused else "Click to suspend viewer updates [esc]" ) + self.__button.setToolTip( _("Viewer updates suspended, click to resume") if paused else _("Click to suspend viewer updates [esc]") ) UVInspector._StateWidget = _StateWidget diff --git a/python/GafferSceneUI/UVSamplerUI.py b/python/GafferSceneUI/UVSamplerUI.py index 3b2dc90930a..4521d753157 100644 --- a/python/GafferSceneUI/UVSamplerUI.py +++ b/python/GafferSceneUI/UVSamplerUI.py @@ -36,27 +36,28 @@ import Gaffer import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.UVSampler, "description", - """ + _(""" Samples primitive variables from specified UV positions on the surface of a source primitive, and transfers the values onto new primitive variables on the sampling object. - """, + """), plugs = { "uv" : { "description" : - """ + _(""" The primitive variable that provides the UV positions to sample on the source primitive. - """, + """), "layout:section" : "Settings.Input", # Put the Input section before the Output section diff --git a/python/GafferSceneUI/UnencapsulateUI.py b/python/GafferSceneUI/UnencapsulateUI.py index 19aff1c7b5d..dbc217656fc 100644 --- a/python/GafferSceneUI/UnencapsulateUI.py +++ b/python/GafferSceneUI/UnencapsulateUI.py @@ -38,6 +38,7 @@ import GafferUI import GafferScene +from GafferUI.i18n import _ ########################################################################## # Metadata @@ -48,17 +49,17 @@ GafferScene.Unencapsulate, "description", - """ + _(""" Expands capsules created by Encapsulate back into regular scene hierarchy. This discards the performance advantages of working with capsules, but is useful for debugging, or when it is necessary to alter the internals of a capsule. - """, + """), plugs = { "parent" : { - "description" : "Deprecated. Use `filter` input instead.", + "description" : _("Deprecated. Use `filter` input instead."), }, diff --git a/python/GafferSceneUI/UnionFilterUI.py b/python/GafferSceneUI/UnionFilterUI.py index a683c5094a8..a8cdb27de8e 100644 --- a/python/GafferSceneUI/UnionFilterUI.py +++ b/python/GafferSceneUI/UnionFilterUI.py @@ -37,26 +37,27 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.UnionFilter, "description", - """ + _(""" Combines several input filters, matching the union of all the locations matched by them. - """, + """), plugs = { "in" : { "description" : - """ + _(""" The filters to be combined. Any number of inputs may be added here. - """, + """), "nodule:type" : "GafferUI::CompoundNodule", "plugValueWidget:type" : "", diff --git a/python/GafferSceneUI/VisualiserToolUI.py b/python/GafferSceneUI/VisualiserToolUI.py index bfd24ce8664..7e478b6d9a2 100644 --- a/python/GafferSceneUI/VisualiserToolUI.py +++ b/python/GafferSceneUI/VisualiserToolUI.py @@ -44,15 +44,16 @@ import GafferSceneUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferSceneUI.VisualiserTool, "description", - """ + _(""" Tool for displaying object data. - """, + """), "viewer:shortCut", "L", "viewer:shouldAutoActivate", False, @@ -67,7 +68,7 @@ "dataName" : { "description" : - """ + _(""" The name of the data to visualise. Primitive variable names must be prefixed by `primitiveVariable:`. For example, `primitiveVariable:uv` would display the `uv` primitive variable. Primitive variables of @@ -75,7 +76,7 @@ To visualise vertex indices instead of a primitive variable, use the value `vertex:index`. - """, + """), "toolbarLayout:section" : "Bottom", "toolbarLayout:width" : 150, @@ -86,9 +87,9 @@ "opacity" : { "description" : - """ + _(""" The amount the visualiser will occlude the scene locations being visualised. - """, + """), "toolbarLayout:section" : "Bottom", "toolbarLayout:width" : 45, @@ -97,14 +98,14 @@ "mode" : { "description" : - """ + _(""" The method for displaying the data. - Auto : Chooses the most appropriate mode based on the data and primitive type. - Color : Values are remapped from the range `[valueMin, valueMax]` to `[0, 1]`. - Color (Auto Range) : Float, integer, V2f and color data is displayed without modification. Vector data is remapped from `[-1, 1]` to `[0, 1]`. - """, + """), "preset:Auto" : GafferSceneUI.VisualiserTool.Mode.Auto, "preset:Color" : GafferSceneUI.VisualiserTool.Mode.Color, @@ -120,12 +121,12 @@ "valueMin" : { "description" : - """ + _(""" The minimum data channel value that will be mapped to 0. For float data only the first channel is used. For V2f data only the first and second channels are used. For V3f data all three channels are used. - """, + """), "toolbarLayout:section" : "Bottom", "toolbarLayout:width" : 175, @@ -136,12 +137,12 @@ "valueMax" : { "description" : - """ + _(""" The maximum data channel value that will be mapped to 1. For float data only the first channel is used. For V2f data only the first and second channels are used. For V3f data all three channels are used. - """, + """), "toolbarLayout:section" : "Bottom", "toolbarLayout:width" : 175, @@ -152,9 +153,9 @@ "size" : { "description" : - """ + _(""" Specifies the size of the displayed text. - """, + """), "plugValueWidget:type" : "" @@ -162,9 +163,9 @@ "vectorScale" : { "description" : - """ + _(""" The scale factor to apply to vectors. - """, + """), "toolbarLayout:section" : "Bottom", "toolbarLayout:width" : 45, @@ -176,9 +177,9 @@ "vectorColor" : { "description" : - """ + _(""" The colour to use for drawing vectors. - """, + """), "toolbarLayout:section" : "Bottom", "toolbarLayout:width" : 175, @@ -279,7 +280,7 @@ def __menuDefinition( self ) : primitiveVariables.add( v ) if len( primitiveVariables ) == 0 : - menuDefinition.append( "/None Available", { "active" : False } ) + menuDefinition.append( "/" + _("None Available"), { "active" : False } ) else : for v in reversed( sorted( primitiveVariables ) ) : @@ -291,9 +292,9 @@ def __menuDefinition( self ) : } ) - menuDefinition.prepend( "/PrimitiveVariableDivider", { "divider" : True, "label" : "Primitive Variables" } ) + menuDefinition.prepend( "/PrimitiveVariableDivider", { "divider" : True, "label" : _("Primitive Variables") } ) - menuDefinition.append( "/Other", { "divider" : True, "label" : "Other" } ) + menuDefinition.append( "/" + _("Other"), { "divider" : True, "label" : _("Other") } ) menuDefinition.append( "/Vertex Index", { diff --git a/python/GafferSceneUI/WireframeUI.py b/python/GafferSceneUI/WireframeUI.py index 9f6f413a620..2f8bc1b1020 100644 --- a/python/GafferSceneUI/WireframeUI.py +++ b/python/GafferSceneUI/WireframeUI.py @@ -37,39 +37,40 @@ import Gaffer import GafferUI import GafferScene +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferScene.Wireframe, "description", - """ + _(""" Creates a wireframe representation of a mesh. The wireframe is created as a CurvesPrimitive. - """, + """), plugs = { "position" : { "description" : - """ + _(""" The primitive variable containing the positions to use for the wireframe. This must have either Vertex or FaceVarying interpolation and contain either V3fVectorData or V2fVectorData. > Tip : Use "uv" to create a wireframe representation of the > UVs for a mesh. - """ + """) }, "width" : { "description" : - """ + _(""" The width of the curves used to represent the wireframe. - """ + """) }, diff --git a/python/GafferSceneUI/_HistoryWindow.py b/python/GafferSceneUI/_HistoryWindow.py index b8b9f4755dc..570ab80b1e1 100644 --- a/python/GafferSceneUI/_HistoryWindow.py +++ b/python/GafferSceneUI/_HistoryWindow.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -186,7 +187,7 @@ class _HistoryWindow( GafferUI.Window ) : def __init__( self, inspectorColumn, inspectionRootPath, inspectionPathString, title=None, **kw ) : if title is None : - title = "History" + title = _("History") GafferUI.Window.__init__( self, title, borderWidth = 4, **kw ) diff --git a/python/GafferSceneUI/_InspectorColumn.py b/python/GafferSceneUI/_InspectorColumn.py index 0de3285841f..2e8426930d5 100644 --- a/python/GafferSceneUI/_InspectorColumn.py +++ b/python/GafferSceneUI/_InspectorColumn.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferScene import GafferSceneUI @@ -54,6 +55,15 @@ # that is easier to implement in Python. This should all be considered as one # component. +def _isInspectorColumn( column ) : + + if isinstance( column, GafferSceneUI.Private.InspectorColumn ) : + return True + inner = getattr( column, "_inner", None ) + if inner is not None and isinstance( inner, GafferSceneUI.Private.InspectorColumn ) : + return True + return False + def __toggleBoolean( pathListing, inspections ) : # Make sure all the inspections contain and accept BoolData @@ -87,7 +97,7 @@ def __editSelectedCells( pathListing, quickBoolean = True, ensureEnabled = False inspections.append( inspection ) if len( inspections ) == 0 : - GafferUI.PopupWindow.showWarning( "The selected cells cannot be edited in the current Edit Scope", parent = pathListing ) + GafferUI.PopupWindow.showWarning( _("The selected cells cannot be edited in the current Edit Scope"), parent = pathListing ) return nonEditable = [ i for i in inspections if not i.editable() ] @@ -315,13 +325,13 @@ def __validateSelection( pathListing ) : if columnSelection.isEmpty() : continue - if not isinstance( column, GafferSceneUI.Private.InspectorColumn ) : + if not _isInspectorColumn( column ) : return False if firstSelectedColumn is None : firstSelectedColumn = column elif type( column ) != type( firstSelectedColumn ) : - GafferUI.PopupWindow.showWarning( "Cannot edit columns with mixed types", parent = pathListing ) + GafferUI.PopupWindow.showWarning( _("Cannot edit columns with mixed types"), parent = pathListing ) return False return True @@ -349,7 +359,7 @@ def __buttonDoubleClick( path, pathListing, event ) : def __contextMenu( column, pathListing, menuDefinition ) : - if not any( isinstance( c, GafferSceneUI.Private.InspectorColumn ) for c in pathListing.getColumns() ) : + if not any( _isInspectorColumn( c ) for c in pathListing.getColumns() ) : return pluralSuffix = "" if sum( [ x.size() for x in pathListing.getSelection() ] ) == 1 else "s" @@ -446,7 +456,7 @@ def __contextMenu( column, pathListing, menuDefinition ) : def __keyPress( column, pathListing, event ) : - if not any( isinstance( c, GafferSceneUI.Private.InspectorColumn ) for c in pathListing.getColumns() ) : + if not any( _isInspectorColumn( c ) for c in pathListing.getColumns() ) : return if event.key == "C" and event.modifiers == event.Modifiers.Control : @@ -594,7 +604,7 @@ def __drop( column, path, pathListing, event ) : return True if __dropMode( column, path, inspection, event ) == __DropMode.NotEditable : - GafferUI.PopupWindow.showWarning( "Cannot modify set expressions containing operators with drag and drop.", parent = pathListing ) + GafferUI.PopupWindow.showWarning( _("Cannot modify set expressions containing operators with drag and drop."), parent = pathListing ) return True data = __dropData( column, path, inspection, event ) @@ -666,7 +676,7 @@ def __init__( self, inspection, **kw ) : grid = GafferUI.GridContainer( spacing = 6 ) with grid.nextRow() : - GafferUI.Label( "Source", parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Top ) } ) + GafferUI.Label( _("Source"), parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Top ) } ) if inspection.fallbackDescription() : GafferUI.Label( inspection.fallbackDescription() ) @@ -681,7 +691,7 @@ def __init__( self, inspection, **kw ) : with grid.nextRow() : - GafferUI.Label( "Value", parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Top ) } ) + GafferUI.Label( _("Value"), parenting = { "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Top ) } ) value = inspection.value() valueLabel = None @@ -712,7 +722,7 @@ def __init__( self, inspection, **kw ) : valueLabel.dragBeginSignal().connect( Gaffer.WeakMethod( self.__valueDragBegin ) ) valueLabel.dragEndSignal().connect( Gaffer.WeakMethod( self.__valueDragEnd ) ) - button = GafferUI.Button( image = "duplicate.png", hasFrame = False, toolTip = "Copy Value", parenting = { "alignment" : ( GafferUI.HorizontalAlignment.None_, GafferUI.VerticalAlignment.Top ) } ) + button = GafferUI.Button( image = "duplicate.png", hasFrame = False, toolTip = _("Copy Value"), parenting = { "alignment" : ( GafferUI.HorizontalAlignment.None_, GafferUI.VerticalAlignment.Top ) } ) button.clickedSignal().connect( Gaffer.WeakMethod( self.__valueCopyClicked ) ) def __nameLabelDragEnd( self, widget, event ) : @@ -829,7 +839,7 @@ def _dataFromPathListingOrReason( pathListing ) : for columnIndex, column in enumerate( columns ) : - if isinstance( column, GafferSceneUI.Private.InspectorColumn ) : + if _isInspectorColumn( column ) : # Prefer the raw `Inspector.Result.value` over the potentially # reformatted `column.cellData()`. value = column.inspect( path ) @@ -983,11 +993,11 @@ def __orderedSelection( pathListing ) : def __inspectorColumnCreated( column ) : - if isinstance( column, ( GafferUI.StandardPathColumn, GafferSceneUI.Private.InspectorColumn ) ) : + if isinstance( column, GafferUI.StandardPathColumn ) or _isInspectorColumn( column ) : column.contextMenuSignal().connectFront( __contextMenu ) column.keyPressSignal().connectFront( __keyPress ) - if isinstance( column, GafferSceneUI.Private.InspectorColumn ) : + if _isInspectorColumn( column ) : ## \todo `buttonPressSignal` should provide the column for us. column.buttonPressSignal().connectFront( functools.partial( __buttonPress, column ) ) column.buttonDoubleClickSignal().connectFront( __buttonDoubleClick ) @@ -1036,8 +1046,8 @@ def __selectInvisibleAncestorsPopup( pathListing, ancestors ) : with GafferUI.PopupWindow() as pathListing.__inspectorColumnPopup : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) : GafferUI.Image( "warningSmall.png" ) - GafferUI.Label( "

Location(s) have been unhidden, but are still not visible because they have invisible ancestors.

" ) - button = GafferUI.Button( image = "selectInvisibleAncestors.png", hasFrame = False, toolTip = "Select invisible ancestors" ) + GafferUI.Label( "

" + _("Location(s) have been unhidden, but are still not visible because they have invisible ancestors.") + "

" ) + button = GafferUI.Button( image = "selectInvisibleAncestors.png", hasFrame = False, toolTip = _("Select invisible ancestors") ) button.clickedSignal().connect( functools.partial( __selectAncestorsClicked, pathListing = pathListing, ancestors = ancestors ) ) pathListing.__inspectorColumnPopup.popup( parent = pathListing ) @@ -1068,7 +1078,7 @@ def __toggleVisibility( pathListing ) : inspections.append( ( inspection, pathString ) ) if len( inspections ) == 0 : - GafferUI.PopupWindow.showWarning( "The selected cells cannot be edited in the current Edit Scope", parent = pathListing ) + GafferUI.PopupWindow.showWarning( _("The selected cells cannot be edited in the current Edit Scope"), parent = pathListing ) return editor = pathListing.ancestor( GafferUI.Editor ) diff --git a/python/GafferSceneUI/_SceneViewInspector.py b/python/GafferSceneUI/_SceneViewInspector.py index b35270efd74..80b3331372c 100644 --- a/python/GafferSceneUI/_SceneViewInspector.py +++ b/python/GafferSceneUI/_SceneViewInspector.py @@ -45,6 +45,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import GafferSceneUI from Qt import QtWidgets @@ -112,7 +113,7 @@ def __init__( self, sceneView ) : orientation = GafferUI.ListContainer.Orientation.Horizontal, spacing = 8 ) : - GafferUI.Label( "

Inspector

" ) + GafferUI.Label( "

{}

".format( _("Inspector") ) ) GafferUI.Spacer( imath.V2i( 1 ) ) self.__busyWidget = GafferUI.BusyWidget( size = 20, busy = False ) hideButton = GafferUI.Button( image="deleteSmall.png", hasFrame=False ) @@ -287,10 +288,9 @@ def update( self ) : self.setVisible( visible ) if visible : - self.__label.setText( "{} {}{}".format( + self.__label.setText( "{} {}".format( numValues, - self.__labelText, - "s" if numValues != 1 else "" + _( self.__labelText ) ) ) ## \todo Figure out how this relates to the DiffRow in the SceneInspector. @@ -309,6 +309,7 @@ def __init__( self, inspector ) : if "_" in name : name = IECore.CamelCase.fromSpaced( name.replace( "_", " " ) ) name = IECore.CamelCase.toSpaced( name ) + name = _( name ) label = GafferUI.Label( text = "
{}
".format( name ) ) label._qtWidget().setMaximumWidth( 140 ) diff --git a/python/GafferUI/AboutWindow.py b/python/GafferUI/AboutWindow.py index 44e97a8dacb..91959760cf1 100644 --- a/python/GafferUI/AboutWindow.py +++ b/python/GafferUI/AboutWindow.py @@ -42,12 +42,13 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class AboutWindow( GafferUI.Window ) : def __init__( self, about, **kw ) : - GafferUI.Window.__init__( self, title = "About " + about.name(), sizeMode=GafferUI.Window.SizeMode.Manual, borderWidth = 6, **kw ) + GafferUI.Window.__init__( self, title = _("About ") + about.name(), sizeMode=GafferUI.Window.SizeMode.Manual, borderWidth = 6, **kw ) with self : @@ -96,7 +97,7 @@ def __init__( self, about, **kw ) : GafferUI.ListContainer.Orientation.Vertical, spacing=10, borderWidth=10, - parenting = { "label" : "License" }, + parenting = { "label" : _("License") }, ) : license = "".join( open( os.path.expandvars( about.license() ), encoding = "utf-8" ).readlines() ) @@ -114,7 +115,7 @@ def __init__( self, about, **kw ) : GafferUI.ListContainer.Orientation.Vertical, spacing=10, borderWidth=10, - parenting = { "label" : "Dependencies" }, + parenting = { "label" : _("Dependencies") }, ) : with GafferUI.ScrolledContainer( diff --git a/python/GafferUI/AnimationEditor.py b/python/GafferUI/AnimationEditor.py index 32173aafb0e..d497b7e7f07 100644 --- a/python/GafferUI/AnimationEditor.py +++ b/python/GafferUI/AnimationEditor.py @@ -36,6 +36,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -338,7 +339,7 @@ def __animationGadgetContextMenu( self, *unused ) : # build context menu menuDefinition = IECore.MenuDefinition() - menuDefinition.append( "/KeysHeader", { "divider" : True, "label" : "Selected Keys" } ) + menuDefinition.append( "/" + _("KeysHeader"), { "divider" : True, "label" : _("Selected Keys") } ) for mode in sorted( Gaffer.Animation.Interpolation.values.values() ) : menuDefinition.append( @@ -368,7 +369,7 @@ def __animationGadgetContextMenu( self, *unused ) : } ) - menuDefinition.append( "/CurvesHeader", { "divider" : True, "label" : "Selected Curves" } ) + menuDefinition.append( "/" + _("CurvesHeader"), { "divider" : True, "label" : _("Selected Curves") } ) for direction in sorted( Gaffer.Animation.Direction.values.values() ) : extrapolation = None if emptyEditableCurves else self.__curveEditor.curveWidget().getExtrapolationForEditableCurves( direction ) @@ -429,8 +430,8 @@ def __init__( self, curveGadget ) : self.__curveWidget = _CurveWidget() # set tab ordering - self.append( self.__keyWidget, "Key" ) - self.append( self.__curveWidget, "Curve" ) + self.append( self.__keyWidget, _("Key") ) + self.append( self.__curveWidget, _("Curve") ) # set up signals self.__curveGadget.selectedKeys().memberAddedSignal().connect( @@ -508,12 +509,12 @@ def __init__( self ) : tieModeToolTip += "\n* %s%s" % ( mode.name, " : %s" % description if description is not None else "" ) # create labels - frameLabel = GafferUI.Label( text="Frame", toolTip=frameToolTip ) - valueLabel = GafferUI.Label( text="Value", toolTip=valueToolTip ) - interpolationLabel = GafferUI.Label( text="Interpolation", toolTip=interpolationToolTip ) - tieModeLabel = GafferUI.Label( text="Tie Mode", toolTip=tieModeToolTip ) - slopeLabel = GafferUI.Label( text="Slope", toolTip=( slopeToolTip % "" ) ) - scaleLabel = GafferUI.Label( text="Scale", toolTip=( scaleToolTip % "" ) ) + frameLabel = GafferUI.Label( text=_("Frame"), toolTip=frameToolTip ) + valueLabel = GafferUI.Label( text=_("Value"), toolTip=valueToolTip ) + interpolationLabel = GafferUI.Label( text=_("Interpolation"), toolTip=interpolationToolTip ) + tieModeLabel = GafferUI.Label( text=_("Tie Mode"), toolTip=tieModeToolTip ) + slopeLabel = GafferUI.Label( text=_("Slope"), toolTip=( slopeToolTip % "" ) ) + scaleLabel = GafferUI.Label( text=_("Scale"), toolTip=( scaleToolTip % "" ) ) # create editors # NOTE: initial value type (e.g. int or float) determines validated value type of widget @@ -931,7 +932,7 @@ def __init__( self ) : extrapolationToolTip += "\n* %s%s" % ( mode.name, " : %s" % description if description is not None else "" ) # create labels - extrapolationLabel = GafferUI.Label( text="Extrapolation", toolTip=( extrapolationToolTip % "" ) ) + extrapolationLabel = GafferUI.Label( text=_("Extrapolation"), toolTip=( extrapolationToolTip % "" ) ) # create editors self.__extrapolationEditor = ( diff --git a/python/GafferUI/AnimationUI.py b/python/GafferUI/AnimationUI.py index 1e79aa44b5b..4c64a1cc6fd 100644 --- a/python/GafferUI/AnimationUI.py +++ b/python/GafferUI/AnimationUI.py @@ -39,16 +39,17 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Animation, "description", - """ + _(""" Generates keyframed animation to be applied to plugs on other nodes. - """, + """), "nodeGadget:type", "GafferUI::AuxiliaryNodeGadget", "auxiliaryNodeGadget:label", "a", @@ -59,11 +60,11 @@ "curves" : { "description" : - """ + _(""" Stores animation curves. Rather than access these directly, prefer to use the Animation::acquire() method. - """, + """), }, @@ -71,22 +72,22 @@ ) -Gaffer.Metadata.registerValue( "Animation.Interpolation.Constant", "description", "Curve span has in key's value." ) -Gaffer.Metadata.registerValue( "Animation.Interpolation.ConstantNext", "description", "Curve span has out key's value." ) -Gaffer.Metadata.registerValue( "Animation.Interpolation.Linear", "description", "Curve span is linearly interpolated between values of in key and out key." ) -Gaffer.Metadata.registerValue( "Animation.Interpolation.Cubic", "description", "Curve span is smoothly interpolated between values of in key and out key using tangent slope." ) -Gaffer.Metadata.registerValue( "Animation.Interpolation.Bezier", "description", "Curve span is smoothly interpolated between values of in key and out key using tangent slope and scale." ) +Gaffer.Metadata.registerValue( "Animation.Interpolation.Constant", "description", _("Curve span has in key's value.") ) +Gaffer.Metadata.registerValue( "Animation.Interpolation.ConstantNext", "description", _("Curve span has out key's value.") ) +Gaffer.Metadata.registerValue( "Animation.Interpolation.Linear", "description", _("Curve span is linearly interpolated between values of in key and out key.") ) +Gaffer.Metadata.registerValue( "Animation.Interpolation.Cubic", "description", _("Curve span is smoothly interpolated between values of in key and out key using tangent slope.") ) +Gaffer.Metadata.registerValue( "Animation.Interpolation.Bezier", "description", _("Curve span is smoothly interpolated between values of in key and out key using tangent slope and scale.") ) -Gaffer.Metadata.registerValue( "Animation.Extrapolation.Constant", "description", "Curve is extended as a flat line." ) -Gaffer.Metadata.registerValue( "Animation.Extrapolation.Linear", "description", "Curve is extended as a line with slope matching tangent in direction of extrapolation." ) -Gaffer.Metadata.registerValue( "Animation.Extrapolation.Cycle", "description", "Curve is repeated indefinitely." ) -Gaffer.Metadata.registerValue( "Animation.Extrapolation.CycleOffset", "description", "Curve is repeated indefinitely with each repetition offset in value to preserve continuity." ) -Gaffer.Metadata.registerValue( "Animation.Extrapolation.CycleFlop", "description", "Curve is repeated indefinitely with each repetition mirrored in time." ) -Gaffer.Metadata.registerValue( "Animation.Extrapolation.CycleFlip", "description", "Curve is repeated indefinitely with each repetition inverted in value and offset to preserve continuity." ) +Gaffer.Metadata.registerValue( "Animation.Extrapolation.Constant", "description", _("Curve is extended as a flat line.") ) +Gaffer.Metadata.registerValue( "Animation.Extrapolation.Linear", "description", _("Curve is extended as a line with slope matching tangent in direction of extrapolation.") ) +Gaffer.Metadata.registerValue( "Animation.Extrapolation.Cycle", "description", _("Curve is repeated indefinitely.") ) +Gaffer.Metadata.registerValue( "Animation.Extrapolation.CycleOffset", "description", _("Curve is repeated indefinitely with each repetition offset in value to preserve continuity.") ) +Gaffer.Metadata.registerValue( "Animation.Extrapolation.CycleFlop", "description", _("Curve is repeated indefinitely with each repetition mirrored in time.") ) +Gaffer.Metadata.registerValue( "Animation.Extrapolation.CycleFlip", "description", _("Curve is repeated indefinitely with each repetition inverted in value and offset to preserve continuity.") ) -Gaffer.Metadata.registerValue( "Animation.TieMode.Manual", "description", "Tangent slope and scale can be independently adjusted." ) -Gaffer.Metadata.registerValue( "Animation.TieMode.Slope", "description", "Tangent slopes are kept equal." ) -Gaffer.Metadata.registerValue( "Animation.TieMode.Scale", "description", "Tangent slopes are kept equal and scales are kept proportional." ) +Gaffer.Metadata.registerValue( "Animation.TieMode.Manual", "description", _("Tangent slope and scale can be independently adjusted.") ) +Gaffer.Metadata.registerValue( "Animation.TieMode.Slope", "description", _("Tangent slopes are kept equal.") ) +Gaffer.Metadata.registerValue( "Animation.TieMode.Scale", "description", _("Tangent slopes are kept equal and scales are kept proportional.") ) # PlugValueWidget popup menu for setting keys ########################################################################## @@ -230,7 +231,7 @@ def __popupMenu( menuDefinition, plugValueWidget ) : if k is not None and math.fabs( context.getTime() - k.getTime() ) * context.getFramesPerSecond() < 0.5 ] menuDefinition.prepend( - "/Remove Key", + "/" + _("Remove Key"), { "command" : functools.partial( __removeKey, @@ -242,7 +243,7 @@ def __popupMenu( menuDefinition, plugValueWidget ) : ) menuDefinition.prepend( - "/Set Key", + "/" + _("Set Key"), { "command" : functools.partial( __setKey, diff --git a/python/GafferUI/AnnotationsUI.py b/python/GafferUI/AnnotationsUI.py index 8952104e4ca..5caf01ee34f 100644 --- a/python/GafferUI/AnnotationsUI.py +++ b/python/GafferUI/AnnotationsUI.py @@ -43,6 +43,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ def appendNodeContextMenuDefinitions( graphEditor, node, menuDefinition ) : @@ -58,15 +59,15 @@ def append( menuPath, name ) : names = Gaffer.MetadataAlgo.annotationTemplates( userOnly = True ) if not names : - append( "/Annotate...", "user" ) + append( "/" + _("Annotate..."), "user" ) else : for name in names : append( - "/Annotate/{}...".format( IECore.CamelCase.toSpaced( name ) ), + "/" + _("Annotate") + "/{}...".format( IECore.CamelCase.toSpaced( name ) ), name ) - menuDefinition.append( "/Annotate/Divider", { "divider" : True } ) - append( "/Annotate/User...", "user" ) + menuDefinition.append( "/" + _("Annotate") + "/Divider", { "divider" : True } ) + append( "/" + _("Annotate") + "/" + _("User..."), "user" ) def __annotate( node, name, menu ) : @@ -172,7 +173,7 @@ def __contextMenu( menuDefinition, annotation, persistent ) : node, name = annotation menuDefinition.append( - "/Copy", + "/" + _("Copy"), { "command" : functools.partial( __copyAnnotation, node, name ), "active" : persistent @@ -301,9 +302,9 @@ def __init__( self, node, name ) : self._setWidget( layout ) - self.__cancelButton = self._addButton( "Cancel" ) - self.__removeButton = self._addButton( "Remove" ) - self.__annotateButton = self._addButton( "Annotate" ) + self.__cancelButton = self._addButton( _("Cancel") ) + self.__removeButton = self._addButton( _("Remove") ) + self.__annotateButton = self._addButton( _("Annotate") ) self.__updateButtonStatus() @@ -367,7 +368,7 @@ def walkPlugs( graphComponent ) : if isinstance( graphComponent, Gaffer.ValuePlug ) and hasattr( graphComponent, "getValue" ) : relativeName = graphComponent.relativeName( self.__node ) menuDefinition.append( - "/Insert Plug Value/{}".format( "/".join( menuLabel( n ) for n in relativeName.split( "." ) ) ), + "/" + _("Insert Plug Value") + "/{}".format( "/".join( menuLabel( n ) for n in relativeName.split( "." ) ) ), { "command" : functools.partial( Gaffer.WeakMethod( self.__textWidget.insertText ), f"{{{relativeName}}}" ), } @@ -379,7 +380,7 @@ def walkPlugs( graphComponent ) : walkPlugs( self.__node ) if not menuDefinition.size() : - menuDefinition.append( "/Insert Plug Value/No plugs available", { "active" : False } ) + menuDefinition.append( "/" + _("Insert Plug Value") + "/" + _("No plugs available"), { "active" : False } ) self.__popupMenu = GafferUI.Menu( menuDefinition ) self.__popupMenu.popup( parent = self ) diff --git a/python/GafferUI/ApplicationMenu.py b/python/GafferUI/ApplicationMenu.py index 6667b45ab56..0bb7acc3f86 100644 --- a/python/GafferUI/ApplicationMenu.py +++ b/python/GafferUI/ApplicationMenu.py @@ -43,12 +43,14 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + def appendDefinitions( menuDefinition, prefix ) : - menuDefinition.append( prefix + "/About Gaffer...", { "command" : about } ) - menuDefinition.append( prefix + "/Preferences...", { "command" : preferences } ) - menuDefinition.append( prefix + "/Documentation...", { "command" : functools.partial( GafferUI.showURL, os.path.expandvars( "$GAFFER_ROOT/doc/gaffer/html/index.html" ) ) } ) - menuDefinition.append( prefix + "/Quit", { "command" : quit, "shortCut" : "Ctrl+Q" } ) + menuDefinition.append( prefix + "/About Gaffer...", { "command" : about, "label" : _( "About Gaffer..." ) } ) + menuDefinition.append( prefix + "/Preferences...", { "command" : preferences, "label" : _( "Preferences..." ) } ) + menuDefinition.append( prefix + "/Documentation...", { "command" : functools.partial( GafferUI.showURL, os.path.expandvars( "$GAFFER_ROOT/doc/gaffer/html/index.html" ) ), "label" : _( "Documentation..." ) } ) + menuDefinition.append( prefix + "/Quit", { "command" : quit, "shortCut" : "Ctrl+Q", "label" : _( "Quit" ) } ) def quit( menu ) : @@ -97,10 +99,10 @@ def preferences( menu ) : if window is not None and window() : window = window() else : - window = GafferUI.Dialogue( "Preferences" ) - closeButton = window._addButton( "Close" ) + window = GafferUI.Dialogue( _( "Preferences" ) ) + closeButton = window._addButton( _( "Close" ) ) closeButton.clickedSignal().connect( __closePreferences ) - saveButton = window._addButton( "Save" ) + saveButton = window._addButton( _( "Save" ) ) saveButton.clickedSignal().connect( __savePreferences ) window._setWidget( GafferUI.NodeUI.create( application["preferences"] ) ) __preferencesWindows[application] = weakref.ref( window ) diff --git a/python/GafferUI/BackdropUI.py b/python/GafferUI/BackdropUI.py index 580c5e5813d..46f83a0f770 100644 --- a/python/GafferUI/BackdropUI.py +++ b/python/GafferUI/BackdropUI.py @@ -34,12 +34,15 @@ # ########################################################################## +import unicodedata + import imath import IECore import Gaffer import GafferUI +from GafferUI.i18n import _, stripAccents ## A command suitable for use with NodeMenu.definition().append(), to add a menu # item for the creation of a backdrop for the current selection. We don't @@ -59,6 +62,10 @@ def nodeMenuCreateCommand( menu ) : backdrop = Gaffer.Backdrop() Gaffer.NodeAlgo.applyUserDefaults( backdrop ) + # Translate the default title and strip accents for IECoreGL + defaultTitle = _( "Title" ) + backdrop["title"].setValue( stripAccents( defaultTitle ) ) + graphGadget.getRoot().addChild( backdrop ) if script.selection() : @@ -83,22 +90,22 @@ def nodeMenuCreateCommand( menu ) : Gaffer.Backdrop, "description", - """ + _(""" A utility node which allows the positioning of other nodes on a coloured backdrop with optional text. Selecting a backdrop in the ui selects all the nodes positioned on it, and moving it moves them with it. - """, + """), plugs = { "title" : { "description" : - """ + _(""" The title for the backdrop - this will be displayed at the top of the backdrop. - """, + """), "stringPlugValueWidget:continuousUpdate" : True, @@ -107,19 +114,19 @@ def nodeMenuCreateCommand( menu ) : "scale" : { "description" : - """ + _(""" Controls the size of the backdrop text. - """, + """), }, "description" : { "description" : - """ + _(""" Text describing the contents of the backdrop - this will be displayed below the title. - """, + """), "plugValueWidget:type" : "GafferUI.MultiLineStringPlugValueWidget", "multiLineStringPlugValueWidget:continuousUpdate" : True, @@ -129,13 +136,13 @@ def nodeMenuCreateCommand( menu ) : "depth" : { "description" : - """ + _(""" Determines the drawing order of overlapping backdrops. > Note : Larger backdrops are _automatically_ drawn behind smaller ones, > so it is only necessary to manually assign a depth in rare cases where > this is not desirable. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "preset:Back" : -1, diff --git a/python/GafferUI/BackgroundTaskDialogue.py b/python/GafferUI/BackgroundTaskDialogue.py index f8616259b2c..646e472bfe7 100644 --- a/python/GafferUI/BackgroundTaskDialogue.py +++ b/python/GafferUI/BackgroundTaskDialogue.py @@ -44,6 +44,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore @@ -84,8 +85,8 @@ def __init__( self, title, **kw ) : self._setWidget( column ) - self.__continueButton = self._addButton( "Continue" ) - self.__cancelButton = self._addButton( "Cancel" ) + self.__continueButton = self._addButton( _("Continue") ) + self.__cancelButton = self._addButton( _("Cancel") ) # Make it impossible to accidentally cancel by hitting `Enter`. self.__cancelButton._qtWidget().setFocusPolicy( QtCore.Qt.NoFocus ) self.__cancelButton.clickedSignal().connect( Gaffer.WeakMethod( self.__cancelClicked ) ) @@ -106,7 +107,7 @@ def waitForBackgroundTask( self, function, parentWindow = None ) : self.__errorImage.setVisible( False ) self.__messageWidget.setVisible( False ) self.__continueButton.setVisible( False ) - self.__cancelButton.setText( "Cancel" ) + self.__cancelButton.setText( _("Cancel") ) self.__cancelButton.setVisible( True ) self.__cancelButton.setEnabled( True ) @@ -127,7 +128,7 @@ def waitForBackgroundTask( self, function, parentWindow = None ) : # Deal with cancellation. if isinstance( self.__backgroundResult, IECore.Cancelled ) : - if self.__cancelButton.getText() == "Cancelling..." : + if self.__cancelButton.getText() == _("Cancelling...") : return self.__backgroundResult else : # Unexpected cancellation. This means a bug somewhere. @@ -143,7 +144,7 @@ def waitForBackgroundTask( self, function, parentWindow = None ) : errors = self.__messageWidget.messageCount( IECore.Msg.Level.Error ) warnings = self.__messageWidget.messageCount( IECore.Msg.Level.Warning ) if warnings or errors : - self.__label.setText( "Error" if errors else "Warning" ) + self.__label.setText( "" + _("Error") + "" if errors else "" + _("Warning") + "" ) self.__busyWidget.setVisible( False ) self.__errorImage.setVisible( True ) self.__messageWidget.setVisible( True ) @@ -187,7 +188,7 @@ def __backgroundFunction( self, function ) : def __cancel( self ) : self.__backgroundTask.cancel() - self.__cancelButton.setText( "Cancelling..." ) + self.__cancelButton.setText( _("Cancelling...") ) self.__cancelButton.setEnabled( False ) def __cancelClicked( self, *unused ) : diff --git a/python/GafferUI/Backups.py b/python/GafferUI/Backups.py index 083567b9c7e..6bfc1194946 100644 --- a/python/GafferUI/Backups.py +++ b/python/GafferUI/Backups.py @@ -45,6 +45,7 @@ import re import stat import weakref +from GafferUI.i18n import _ class Backups( object ) : @@ -292,10 +293,10 @@ def __backupNumberEnabled( plug ) : "backups" : { "description" : - """ + _(""" Controls a mechanism used to create automatic backup copies of scripts. - """, + """), "layout:section" : "Backups", "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -308,18 +309,18 @@ def __backupNumberEnabled( plug ) : "backups.enabled" : { "description" : - """ + _(""" Turns the backup system on and off. - """, + """), }, "backups.frequency" : { "description" : - """ + _(""" How often backups are made, measured in minutes. - """, + """), "layout:activator" : "backupsEnabled", @@ -328,7 +329,7 @@ def __backupNumberEnabled( plug ) : "backups.fileName" : { "description" : - """ + _(""" The name of the backup file to be created. This may use any of the following variables : @@ -341,7 +342,7 @@ def __backupNumberEnabled( plug ) : - `${backup:number}` : the number of this backup, used to keep more than one backup per file. - `#` : the same as `${backup:number}`. - """, + """), "layout:activator" : "backupsEnabled", @@ -350,12 +351,12 @@ def __backupNumberEnabled( plug ) : "backups.files" : { "description" : - """ + _(""" The number of backups to keep for each script. Only used if the backup filename includes `${backup:number}`. When the backup limit is reached, the oldest backup will be overwritten. - """, + """), "layout:activator" : "backupNumberEnabled", diff --git a/python/GafferUI/BoolPlugValueWidget.py b/python/GafferUI/BoolPlugValueWidget.py index 2870bfd7c49..18e1ba31db7 100644 --- a/python/GafferUI/BoolPlugValueWidget.py +++ b/python/GafferUI/BoolPlugValueWidget.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -110,7 +111,7 @@ def _updateFromMetadata( self ) : firstPlug = next( iter( self.getPlugs() ) ) label = Gaffer.Metadata.value( firstPlug, "label" ) label = label if label else IECore.CamelCase.toSpaced( firstPlug.getName() ) - self.__boolWidget.setText( label ) + self.__boolWidget.setText( _( label ) ) else : self.__boolWidget.setText( "" ) diff --git a/python/GafferUI/BoxIOUI.py b/python/GafferUI/BoxIOUI.py index d197329f917..e696016d7ac 100644 --- a/python/GafferUI/BoxIOUI.py +++ b/python/GafferUI/BoxIOUI.py @@ -37,18 +37,19 @@ import IECore import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.BoxIO, "description", - """ + _(""" Convenience node for representing promoted plugs visually in the internal node graph of a Box. Don't create BoxIO nodes directly, instead use the BoxIn and BoxOut derived classes. - """, + """), "nodeGadget:minWidth", 0.0, "nodeGadget:shape", "oval", @@ -58,10 +59,10 @@ "name" : { "description" : - """ + _(""" The name given to the external plug that this node represents. - """, + """), "nodule:type" : "" diff --git a/python/GafferUI/BoxInUI.py b/python/GafferUI/BoxInUI.py index 42bbca67e26..fd4c7897339 100644 --- a/python/GafferUI/BoxInUI.py +++ b/python/GafferUI/BoxInUI.py @@ -35,16 +35,17 @@ ########################################################################## import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.BoxIn, "description", - """ + _(""" Convenience node for representing input plugs visually in the internal node graph of a Box. - """, + """), "icon", "boxInNode.png", diff --git a/python/GafferUI/BoxOutUI.py b/python/GafferUI/BoxOutUI.py index 2d4a1ba069d..9994dce833e 100644 --- a/python/GafferUI/BoxOutUI.py +++ b/python/GafferUI/BoxOutUI.py @@ -35,16 +35,17 @@ ########################################################################## import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.BoxOut, "description", - """ + _(""" Convenience node for representing output plugs visually in the internal node graph of a Box. - """, + """), "icon", "boxOutNode.png", @@ -53,7 +54,7 @@ "passThrough" : { "description" : - """ + _(""" May be connected to a BoxIn node to define an input that is passed through when the Box is disabled. Defining a pass-through also @@ -63,7 +64,7 @@ nodes are reconnected automatically. - The Box can be dragged onto an existing connection to insert it. - """, + """), "plugValueWidget:type" : "", @@ -72,10 +73,10 @@ "enabled" : { "description" : - """ + _(""" Automatically connected to the Box.enabled plugs to control the pass-through behaviour. - """, + """), "plugValueWidget:type" : "", "nodule:type" : "", diff --git a/python/GafferUI/BoxUI.py b/python/GafferUI/BoxUI.py index 08ea829dba9..fa8001d107c 100644 --- a/python/GafferUI/BoxUI.py +++ b/python/GafferUI/BoxUI.py @@ -42,13 +42,14 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Box, "description", - """ + _(""" A container for "subgraphs" - node networks which exist inside the Box and can be exposed by promoting selected internal plugs onto the outside of the Box. @@ -57,7 +58,7 @@ graphs by collapsing them into sections which perform distinct tasks. They are also used for authoring files to be used with the Reference node. - """, + """), "icon", "boxNode.png", @@ -129,7 +130,7 @@ def appendNodeContextMenuDefinitions( graphEditor, node, menuDefinition ) : return menuDefinition.append( "/BoxDivider", { "divider" : True } ) - menuDefinition.append( "/Show Contents...", { "command" : functools.partial( __showContents, graphEditor, node ) } ) + menuDefinition.append( "/" + _("Show Contents..."), { "command" : functools.partial( __showContents, graphEditor, node ) } ) ## A callback suitable for use with NodeEditor.toolMenuSignal() - it provides # menu options specific to Boxes. We don't actually register it automatically, @@ -144,19 +145,19 @@ def appendNodeEditorToolMenuDefinitions( nodeEditor, node, menuDefinition ) : menuDefinition.append( "/ResetDefaultsDivider", { "divider" : True } ) menuDefinition.append( - "/Reset Default Values", + "/" + _("Reset Default Values"), { "command" : functools.partial( __resetDefaultValues, plugs = nonDefaultPlugs ), "active" : len( nonDefaultPlugs ) and all( not Gaffer.MetadataAlgo.readOnly( p ) for p in nonDefaultPlugs ) } ) menuDefinition.append( "/BoxDivider", { "divider" : True } ) - menuDefinition.append( "/Export Reference...", { "command" : functools.partial( __exportForReferencing, node = node ) } ) - menuDefinition.append( "/Import Reference...", { "command" : functools.partial( __importReference, node = node ) } ) + menuDefinition.append( "/" + _("Export Reference..."), { "command" : functools.partial( __exportForReferencing, node = node ) } ) + menuDefinition.append( "/" + _("Import Reference..."), { "command" : functools.partial( __importReference, node = node ) } ) if Gaffer.BoxIO.canInsert( node ) : menuDefinition.append( "/UpgradeDivider", { "divider" : True } ) - menuDefinition.append( "/Upgrade to use BoxIO", { "command" : functools.partial( __upgradeToUseBoxIO, node = node ) } ) + menuDefinition.append( "/" + _("Upgrade to use BoxIO"), { "command" : functools.partial( __upgradeToUseBoxIO, node = node ) } ) def __showContents( graphEditor, box ) : @@ -219,7 +220,7 @@ def __exportForReferencing( menu, node ) : nonDefaultPlugs = __nonDefaultPlugs( node ) if len( nonDefaultPlugs ) : dialogue = GafferUI.ConfirmationDialogue( - title = "Export without current values?", + title = _("Export without current values?"), message = inspect.cleandoc( """ Not all plugs are at their default values, and non-default @@ -234,7 +235,7 @@ def __exportForReferencing( menu, node ) : using "Reset Default Value" in the plug context menu. """ ).replace( "\n", " " ), - confirmLabel = "Export" + confirmLabel = _("Export") ) if not dialogue.waitForConfirmation() : return @@ -244,7 +245,7 @@ def __exportForReferencing( menu, node ) : path = Gaffer.FileSystemPath( bookmarks.getDefault( menu ) ) path.setFilter( Gaffer.FileSystemPath.createStandardFilter( [ "grf" ] ) ) - dialogue = GafferUI.PathChooserDialogue( path, title="Export reference", confirmLabel="Export", leaf=True, bookmarks=bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title=_("Export reference"), confirmLabel="Export", leaf=True, bookmarks=bookmarks ) path = dialogue.waitForPath( parentWindow = menu.ancestor( GafferUI.Window ) ) if not path : @@ -264,7 +265,7 @@ def __importReference( menu, node ) : path.setFilter( Gaffer.FileSystemPath.createStandardFilter( [ "grf" ] ) ) window = menu.ancestor( GafferUI.Window ) - dialogue = GafferUI.PathChooserDialogue( path, title="Import reference", confirmLabel="Import", leaf=True, valid=True, bookmarks=bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title=_("Import reference"), confirmLabel=_("Import"), leaf=True, valid=True, bookmarks=bookmarks ) path = dialogue.waitForPath( parentWindow = window ) if not path : @@ -272,7 +273,7 @@ def __importReference( menu, node ) : scriptNode = node.ancestor( Gaffer.ScriptNode ) with GafferUI.ErrorDialogue.ErrorHandler( - title = "Error Importing Reference", + title = _("Error Importing Reference"), closeLabel = "Oy vey", parentWindow = window ) : @@ -332,13 +333,13 @@ def __appendPlugPromotionMenuItems( menuDefinition, plug ) : if len( menuDefinition.items() ) : menuDefinition.append( "/BoxDivider", { "divider" : True } ) - menuDefinition.append( "/Promote to %s" % box.getName(), { + menuDefinition.append( "/" + _("Promote to %s") % box.getName(), { "command" : functools.partial( __promote, plug ), "active" : not readOnly, } ) if ancestorLabel and Gaffer.PlugAlgo.canPromote( ancestor ) : - menuDefinition.append( "/Promote %s to %s" % ( ancestorLabel, box.getName() ), { + menuDefinition.append( "/" + _("Promote %s to %s") % ( ancestorLabel, box.getName() ), { "command" : functools.partial( __promote, ancestor ), "active" : not readOnly, } ) @@ -351,7 +352,7 @@ def __appendPlugPromotionMenuItems( menuDefinition, plug ) : menuDefinition.append( "/BoxDivider", { "divider" : True } ) if ancestorLabel and Gaffer.PlugAlgo.isPromoted( ancestor ) : - menuDefinition.append( "/Unpromote %s from %s" % ( ancestorLabel, box.getName() ), { + menuDefinition.append( "/" + _("Unpromote %s from %s") % ( ancestorLabel, box.getName() ), { "command" : functools.partial( __unpromote, ancestor ), "active" : not readOnly, } ) @@ -359,7 +360,7 @@ def __appendPlugPromotionMenuItems( menuDefinition, plug ) : # We dont want to allow unpromoting for individual children of promoted # parents because that would lead to ArrayPlugs and TransformPlugs with # the unexpected number of children, which would cause crashes. - menuDefinition.append( "/Unpromote from %s" % box.getName(), { + menuDefinition.append( "/" + _("Unpromote from %s") % box.getName(), { "command" : functools.partial( __unpromote, plug ), "active" : not readOnly, } ) @@ -375,7 +376,7 @@ def __appendPlugResetDefaultMenuItems( menuDefinition, plug ) : readOnly = Gaffer.MetadataAlgo.readOnly( plug ) menuDefinition.append( - "/Reset Default Value", + "/" + _("Reset Default Value"), { "command" : functools.partial( __resetDefaultValues, [ plug ] ), "active" : isinstance( plug, Gaffer.ValuePlug ) and not plug.isSetToDefault() and not readOnly, @@ -394,7 +395,7 @@ def __plugPopupMenu( menuDefinition, plugValueWidget ) : def __renamePlug( menu, plug ) : - d = GafferUI.TextInputDialogue( initialText = plug.getName(), title = "Enter name", confirmLabel = "Rename" ) + d = GafferUI.TextInputDialogue( initialText = plug.getName(), title = _("Enter name"), confirmLabel = "Rename" ) # Hack to borrow the input validation from NameWidget so we can prevent the # user entering an invalid name. diff --git a/python/GafferUI/BrowserEditor.py b/python/GafferUI/BrowserEditor.py index 3925ccd16ff..cae1208bd2b 100644 --- a/python/GafferUI/BrowserEditor.py +++ b/python/GafferUI/BrowserEditor.py @@ -43,6 +43,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class BrowserEditor( GafferUI.Editor ) : @@ -56,7 +57,7 @@ def __init__( self, scriptNode, **kw ) : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 6 ) : - GafferUI.Label( "Mode" ) + GafferUI.Label( _("Mode") ) modeMenu = GafferUI.MultiSelectionMenu( allowMultipleSelection = False, @@ -199,7 +200,7 @@ def __contextMenu( self, pathListing ) : menuDefinition = IECore.MenuDefinition() if self.__opMatcher == "__loading__" : - menuDefinition.append( "/Loading actions...", { "active" : False } ) + menuDefinition.append( "/" + _("Loading actions..."), { "active" : False } ) else : selectedPaths = pathListing.getSelectedPaths() if len( selectedPaths ) == 1 : @@ -207,7 +208,7 @@ def __contextMenu( self, pathListing ) : else : parameterValue = selectedPaths - menuDefinition.append( "/Actions", { "subMenu" : functools.partial( Gaffer.WeakMethod( self.__actionsSubMenu ), parameterValue ) } ) + menuDefinition.append( "/" + _("Actions"), { "subMenu" : functools.partial( Gaffer.WeakMethod( self.__actionsSubMenu ), parameterValue ) } ) self.__menu = GafferUI.Menu( menuDefinition ) if len( menuDefinition.items() ) : @@ -222,9 +223,9 @@ def __actionsSubMenu( self, parameterValue ) : ops = self.__opMatcher.matches( parameterValue ) if len( ops ) : for op, parameter in ops : - menuDefinition.append( "/%s (%s)" % ( op.typeName(), parameter.name ), { "command" : self.__opDialogueCommand( op ) } ) + menuDefinition.append( "/" + _("%s (%s)") % ( op.typeName(), parameter.name ), { "command" : self.__opDialogueCommand( op ) } ) else : - menuDefinition.append( "/None available", { "active" : False } ) + menuDefinition.append( "/" + _("None available"), { "active" : False } ) return menuDefinition diff --git a/python/GafferUI/ButtonPlugValueWidget.py b/python/GafferUI/ButtonPlugValueWidget.py index f165c63c22b..62b677b7ecc 100644 --- a/python/GafferUI/ButtonPlugValueWidget.py +++ b/python/GafferUI/ButtonPlugValueWidget.py @@ -38,6 +38,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ ## Supported metadata : # @@ -100,7 +101,7 @@ def __clicked( self, widget ) : "button" : self, } - with GafferUI.ErrorDialogue.ErrorHandler( title = "Button Error", parentWindow = self.ancestor( GafferUI.Window ) ) : + with GafferUI.ErrorDialogue.ErrorHandler( title = _("Button Error"), parentWindow = self.ancestor( GafferUI.Window ) ) : with Gaffer.UndoScope( self.getPlug().ancestor( Gaffer.ScriptNode ) ) : with self.context() : exec( code, executionDict, executionDict ) diff --git a/python/GafferUI/CollectUI.py b/python/GafferUI/CollectUI.py index bec57ba554a..5f8149f0158 100644 --- a/python/GafferUI/CollectUI.py +++ b/python/GafferUI/CollectUI.py @@ -46,16 +46,17 @@ from ._TableView import _TableView from Qt import QtCore +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Collect, "description", - """ + _(""" Collects arbitrary input values across a range of contexts, outputting arrays containing the values collected across that range. - """, + """), "layout:section:Settings.Inputs:collapsed", False, @@ -64,11 +65,11 @@ "contextVariable" : { "description" : - """ + _(""" The context variable used to vary the values of the inputs being collected. This should be used in the node network upstream of the inputs. - """, + """), "noduleLayout:visible" : False, @@ -77,10 +78,10 @@ "indexContextVariable" : { "description" : - """ + _(""" The context variable used to specify the index being collected. This may be used in the node network upstream of the inputs. - """, + """), "noduleLayout:visible" : False, @@ -89,10 +90,10 @@ "contextValues" : { "description" : - """ + _(""" The values of the context variable. Collection will be performed once for each context value. - """, + """), "nodule:type" : "", @@ -101,12 +102,12 @@ "enabled" : { "description" : - """ + _(""" Enables or disables collection. This may be varied based on the context variable, so that collection may be disabled in some contexts but not others. Only values for enabled contexts are included in the output arrays. - """, + """), "layout:section" : "Settings", "nodule:type" : "GafferUI::StandardNodule", @@ -116,11 +117,11 @@ "in" : { "description" : - """ + _(""" Container of inputs to be collected from. Inputs may be added by calling `collectNode.addInput( plug )` or using the UI. Each input provides a corresponding output parented under the `out` plug. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -148,9 +149,9 @@ "enabledValues" : { "description" : - """ + _(""" Outputs an array of the context values for which collection was enabled by the `enabled` plug. - """, + """), # We show the value for this plug in the `_OutputPlugValueWidget`. "plugValueWidget:type" : "", @@ -161,9 +162,9 @@ "out" : { "description" : - """ + _(""" Container of array outputs corresponding to the inputs provided by the `in` plug. - """, + """), "plugValueWidget:type" : "GafferUI.CollectUI._OutputPlugValueWidget", "layout:section" : "Results", @@ -390,7 +391,7 @@ def __plugPopupMenu( menuDefinition, plug ) : if len( menuDefinition.items() ) : menuDefinition.append( "/DeleteDivider", { "divider" : True } ) - menuDefinition.append( "/Delete", { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) + menuDefinition.append( "/" + _("Delete"), { "command" : functools.partial( __deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) def __deletePlug( plug ) : diff --git a/python/GafferUI/ColorChooser.py b/python/GafferUI/ColorChooser.py index fa2111aa2aa..aeb08920658 100644 --- a/python/GafferUI/ColorChooser.py +++ b/python/GafferUI/ColorChooser.py @@ -51,6 +51,7 @@ from Qt import QtCore from Qt import QtGui from Qt import QtWidgets +from GafferUI.i18n import _ __tmiToRGBMatrix = imath.M33f( -1.0 / 2.0, 0.0, 1.0 / 2.0, @@ -980,8 +981,13 @@ def __init__( self, color=imath.Color3f( 1 ), **kw ) : # the icons connect without gaps. self.__channelFrames[component]._qtWidget().setProperty( "gafferBorderStyle", GafferUI._Variant.toVariant( None ) ) + _channelLabelMap = { + "r" : "R", "g" : "V", "b" : "A", "a" : "\u03b1", + "h" : "T", "s" : "S", "v" : "V", + "t" : "T", "m" : "M", "i" : "I", + } self.__channelLabels[component] = GafferUI.Label( - component.capitalize(), + _channelLabelMap.get( component, component.capitalize() ), toolTip = self.__componentToolTip if component != "a" else "", parenting = { "index" : ( 1, row ), "alignment" : ( GafferUI.HorizontalAlignment.Center, GafferUI.VerticalAlignment.Center ) } ) @@ -1237,7 +1243,7 @@ def __optionsMenuDefinition( self ) : result = IECore.MenuDefinition() - result.append( "/__widgetsDivider__", { "divider": True, "label": "Visible Controls" } ) + result.append( "/__widgetsDivider__", { "divider": True, "label": _("Visible Controls") } ) for channels in [ "rgb", "hsv", "tmi" ] : result.append( @@ -1249,14 +1255,14 @@ def __optionsMenuDefinition( self ) : ) result.append( - "/Color Field", + "/" + _("Color Field") + "", { "command": functools.partial( Gaffer.WeakMethod( self.__toggleColorField ) ), "checkBox": self.__colorField.getVisible() } ) - result.append( "/__colorField__", { "divider": True, "label": "Color Field" } ) + result.append( "/__colorField__", { "divider": True, "label": _("Color Field") } ) weakSet = Gaffer.WeakMethod( self.setColorFieldStaticComponent ) for label, component in [ @@ -1280,7 +1286,7 @@ def __optionsMenuDefinition( self ) : } ) - result.append( "/__sliders__", { "divider": True, "label": "Sliders" } ) + result.append( "/__sliders__", { "divider": True, "label": _("Sliders") } ) result.append( "/Dynamic Backgrounds", @@ -1305,7 +1311,7 @@ def __channelLabelReleased( self, widget, event, component ) : yCandidates = { "r": "gb", "g": "rb", "b": "rg", "h": "sv", "s": "hv", "v": "hs", "t": "mi", "m": "ti", "i" : "tm" }[component] menuDefinition = IECore.MenuDefinition() - menuDefinition.append( "/__colorField__", { "divider" : True, "label": "Color Field" } ) + menuDefinition.append( "/__colorField__", { "divider" : True, "label": _("Color Field") } ) currentComponents = sorted( list( self.__colorField.xyAxes() ), key = lambda c : "rgbhsvtmi".index( c ) ) diff --git a/python/GafferUI/ColorChooserDialogue.py b/python/GafferUI/ColorChooserDialogue.py index d707c7056da..a0e76fe95e3 100644 --- a/python/GafferUI/ColorChooserDialogue.py +++ b/python/GafferUI/ColorChooserDialogue.py @@ -40,10 +40,11 @@ import IECore import GafferUI +from GafferUI.i18n import _ class ColorChooserDialogue( GafferUI.Dialogue ) : - def __init__( self, title="Select color", color=imath.Color3f( 1 ), cancelLabel="Cancel", confirmLabel="OK", **kw ) : + def __init__( self, title=_("Select color"), color=imath.Color3f( 1 ), cancelLabel=_("Cancel"), confirmLabel=_("OK"), **kw ) : GafferUI.Dialogue.__init__( self, title, **kw ) diff --git a/python/GafferUI/ColorChooserPlugValueWidget.py b/python/GafferUI/ColorChooserPlugValueWidget.py index 66b4f410f4b..72cf59f9ffe 100644 --- a/python/GafferUI/ColorChooserPlugValueWidget.py +++ b/python/GafferUI/ColorChooserPlugValueWidget.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ class ColorChooserPlugValueWidget( GafferUI.PlugValueWidget ) : @@ -170,10 +171,10 @@ def __dynamicSliderBackgroundsChanged( self, colorChooser ) : def __colorChooserOptionsMenu( self, colorChooser, menuDefinition ) : - menuDefinition.append( "/__saveDefaultOptions__", { "divider": True, "label": "Defaults" } ) + menuDefinition.append( "/__saveDefaultOptions__", { "divider": True, "label": _("Defaults") } ) menuDefinition.append( - "/Save Default Inline Layout", + "/" + _("Save Default Inline Layout"), { "command": functools.partial( saveDefaultOptions, diff --git a/python/GafferUI/ColorSwatchPlugValueWidget.py b/python/GafferUI/ColorSwatchPlugValueWidget.py index 10d0ea6de4a..2b5c8067604 100644 --- a/python/GafferUI/ColorSwatchPlugValueWidget.py +++ b/python/GafferUI/ColorSwatchPlugValueWidget.py @@ -45,6 +45,7 @@ import GafferUI from GafferUI.PlugValueWidget import sole from GafferUI.ColorChooserPlugValueWidget import saveDefaultOptions +from GafferUI.i18n import _ class ColorSwatchPlugValueWidget( GafferUI.PlugValueWidget ) : @@ -265,10 +266,10 @@ def __buttonClicked( self, button ) : def __colorChooserOptionsMenu( self, colorChooser, menuDefinition ) : - menuDefinition.append( "/__saveDefaultOptions__", { "divider": True, "label": "Defaults" } ) + menuDefinition.append( "/__saveDefaultOptions__", { "divider": True, "label": _("Defaults") } ) menuDefinition.append( - "/Save Default Dialogue Layout", + "/" + _("Save Default Dialogue Layout"), { "command": functools.partial( saveDefaultOptions, diff --git a/python/GafferUI/CompoundEditor.py b/python/GafferUI/CompoundEditor.py index ecf68caeb92..b9142a062d2 100644 --- a/python/GafferUI/CompoundEditor.py +++ b/python/GafferUI/CompoundEditor.py @@ -46,6 +46,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore from Qt import QtGui @@ -574,8 +575,8 @@ def __init__( self, cornerWidget=None, **kw ) : self.__pinningWidget = _PinningWidget() layoutButton = GafferUI.MenuButton( image="layoutButton.png", hasFrame=False ) - layoutButton.setMenu( GafferUI.Menu( Gaffer.WeakMethod( self.__layoutMenuDefinition ), title = "Layout" ) ) - layoutButton.setToolTip( "Click to modify the layout" ) + layoutButton.setMenu( GafferUI.Menu( Gaffer.WeakMethod( self.__layoutMenuDefinition ), title = _("Layout") ) ) + layoutButton.setToolTip( _("Click to modify the layout") ) layoutButton._qtWidget().setFixedHeight( 15 ) cornerWidget._qtWidget().setObjectName( "gafferCompoundEditorTools" ) @@ -694,11 +695,11 @@ def __layoutMenuDefinition( self ) : detatchItemAdded = False if currentTab is not None : - m.append( "/Detach " + self.getLabel( currentTab ), { "command" : Gaffer.WeakMethod( self.__detachTab ) } ) + m.append( "/" + _("Detach") + " " + self.getLabel( currentTab ), { "command" : Gaffer.WeakMethod( self.__detachTab ) } ) detatchItemAdded = True if isinstance( splitContainerParent, _SplitContainer ) : - m.append( "/Detach Panel", { "command" : Gaffer.WeakMethod( self.__detachPanel ) } ) + m.append( "/" + _("Detach Panel"), { "command" : Gaffer.WeakMethod( self.__detachPanel ) } ) detatchItemAdded = True if detatchItemAdded : @@ -707,11 +708,11 @@ def __layoutMenuDefinition( self ) : removeItemAdded = False if currentTab is not None : - m.append( "/Remove " + self.getLabel( currentTab ), { "command" : Gaffer.WeakMethod( self.__removeTab ) } ) + m.append( "/" + _("Remove") + " " + self.getLabel( currentTab ), { "command" : Gaffer.WeakMethod( self.__removeTab ) } ) removeItemAdded = True if isinstance( splitContainerParent, _SplitContainer ) : - m.append( "Remove Panel", { "command" : Gaffer.WeakMethod( self.__removePanel ) } ) + m.append( "/" + _("Remove Panel"), { "command" : Gaffer.WeakMethod( self.__removePanel ) } ) removeItemAdded = True if removeItemAdded : @@ -720,13 +721,13 @@ def __layoutMenuDefinition( self ) : tabsVisible = self.getTabsVisible() # Because the menu isn't visible most of the time, the Ctrl+T shortcut doesn't work - it's just there to let # users know it exists. It is actually implemented directly in __keyPress. - m.append( "/Hide Tabs" if tabsVisible else "/Show Tabs", { "command" : functools.partial( Gaffer.WeakMethod( self.setTabsVisible ), not tabsVisible ), "shortCut" : "Ctrl+T" } ) + m.append( "/" + _("Hide Tabs") if tabsVisible else "/" + _("Show Tabs"), { "command" : functools.partial( Gaffer.WeakMethod( self.setTabsVisible ), not tabsVisible ), "shortCut" : "Ctrl+T" } ) m.append( "/TabsDivider", { "divider" : True } ) - m.append( "/Split Left", { "command" : functools.partial( Gaffer.WeakMethod( splitContainer.split ), GafferUI.SplitContainer.Orientation.Horizontal, 0 ) } ) - m.append( "/Split Right", { "command" : functools.partial( Gaffer.WeakMethod( splitContainer.split ), GafferUI.SplitContainer.Orientation.Horizontal, 1 ) } ) - m.append( "/Split Bottom", { "command" : functools.partial( Gaffer.WeakMethod( splitContainer.split ), GafferUI.SplitContainer.Orientation.Vertical, 1 ) } ) - m.append( "/Split Top", { "command" : functools.partial( Gaffer.WeakMethod( splitContainer.split ), GafferUI.SplitContainer.Orientation.Vertical, 0 ) } ) + m.append( "/" + _("Split Left"), { "command" : functools.partial( Gaffer.WeakMethod( splitContainer.split ), GafferUI.SplitContainer.Orientation.Horizontal, 0 ) } ) + m.append( "/" + _("Split Right"), { "command" : functools.partial( Gaffer.WeakMethod( splitContainer.split ), GafferUI.SplitContainer.Orientation.Horizontal, 1 ) } ) + m.append( "/" + _("Split Bottom"), { "command" : functools.partial( Gaffer.WeakMethod( splitContainer.split ), GafferUI.SplitContainer.Orientation.Vertical, 1 ) } ) + m.append( "/" + _("Split Top"), { "command" : functools.partial( Gaffer.WeakMethod( splitContainer.split ), GafferUI.SplitContainer.Orientation.Vertical, 0 ) } ) return m @@ -768,10 +769,10 @@ def __tabContextMenu( self, pos ) : tabIndex = self._qtWidget().tabBar().tabAt( pos ) m = IECore.MenuDefinition() - m.append( '/Detach', { "command" : functools.partial( Gaffer.WeakMethod( self.__detachTab ), tabIndex ) } ) - m.append( '/Remove', { "command" : functools.partial( Gaffer.WeakMethod( self.__removeTab ), tabIndex ) } ) + m.append( '/' + _('Detach'), { "command" : functools.partial( Gaffer.WeakMethod( self.__detachTab ), tabIndex ) } ) + m.append( '/' + _('Remove'), { "command" : functools.partial( Gaffer.WeakMethod( self.__removeTab ), tabIndex ) } ) - self.__popupMenu = GafferUI.Menu( m, title = "Tab Actions" ) + self.__popupMenu = GafferUI.Menu( m, title = _("Tab Actions") ) self.__popupMenu.popup( parent = self ) def __dragEnter( self, tabbedContainer, event ) : @@ -1569,20 +1570,20 @@ def getToolTip( self ) : nodeSet = editor.getNodeSet() if nodeSet == editor.scriptNode().selection() : toolTipElements.append( "" ) - toolTipElements.append( "Following the node selection." ) + toolTipElements.append( _("Following the node selection.") ) if nodeSet == editor.scriptNode().focusSet() : toolTipElements.append( "" ) - toolTipElements.append( "Following the Focus Node." ) + toolTipElements.append( _("Following the Focus Node.") ) elif isinstance( nodeSet, Gaffer.NumericBookmarkSet ) : toolTipElements.append( "" ) - toolTipElements.append( "Following Numeric Bookmark %d." % nodeSet.getBookmark() ) + toolTipElements.append( _("Following Numeric Bookmark %d.") % nodeSet.getBookmark() ) elif isinstance( nodeSet, Gaffer.StandardSet ) : toolTipElements.append( "" ) n = len(nodeSet) if n == 0 : - s = "Pinned to nothing." + s = _("Pinned to nothing.") else : - s = "Pinned to %d node%s." % ( n, "" if n == 1 else "s" ) + s = _("Pinned to %d node(s).") % n toolTipElements.append( s ) return "\n".join( toolTipElements ) @@ -1620,7 +1621,7 @@ def __showEditorFocusMenu( self, *unused ) : self.__addStandardItems( e, m ) CompoundEditor.nodeSetMenuSignal()( e, m ) - self.__pinningMenu = GafferUI.Menu( m, title = "Editor Focus" ) + self.__pinningMenu = GafferUI.Menu( m, title = _("Editor Focus") ) buttonBound = self.__icon.bound() self.__pinningMenu.popup( @@ -1635,27 +1636,27 @@ def __addStandardItems( self, editor, m ) : selection = editor.scriptNode().selection() if len(selection) == 0 : - label = "Pin To Nothing" + label = _("Pin To Nothing") elif len(selection) == 1 : - label = "Pin %s" % selection[0].getName() + label = _("Pin %s") % selection[0].getName() else : - label = "Pin %d Selected Nodes" % len(selection) + label = _("Pin %d Selected Nodes") % len(selection) - m.append( "/Pin Node Selection", { + m.append( "/" + _("Pin Node Selection"), { "command" : functools.partial( self.__pinToNodeSelection, weakref.ref( editor ) ), "label" : label, "shortCut" : "p" } ) - m.append( "/Follow Divider", { "divider" : True, "label" : "Follow" } ) + m.append( "/Follow Divider", { "divider" : True, "label" : _("Follow") } ) - m.append( "/Focus Node", { + m.append( "/" + _("Focus Node"), { "command" : functools.partial( self.__followFocusNode, weakref.ref( editor ) ), "checkBox" : editor.getNodeSet().isSame( editor.scriptNode().focusSet() ), "shortCut" : "`" } ) - m.append( "/Node Selection", { + m.append( "/" + _("Node Selection"), { "command" : functools.partial( self.__followNodeSelection, weakref.ref( editor ) ), "checkBox" : editor.getNodeSet().isSame( editor.scriptNode().selection() ), "shortCut" : "n" diff --git a/python/GafferUI/CompoundNumericNoduleUI.py b/python/GafferUI/CompoundNumericNoduleUI.py index 8c4cb48dfc8..a6afc7b5117 100644 --- a/python/GafferUI/CompoundNumericNoduleUI.py +++ b/python/GafferUI/CompoundNumericNoduleUI.py @@ -39,6 +39,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + def __applyChildVisibility( plug, visible ) : with Gaffer.UndoScope( plug.ancestor( Gaffer.ScriptNode ) ) : @@ -69,7 +71,7 @@ def __plugContextMenuSignal( graphEditor, plug, menuDefinition ) : if len( nodule ) > 0 : menuDefinition.append( - "/Collapse {} Components".format( childNames ), + "/" + _("Collapse {} Components").format( childNames ), { "command" : functools.partial( __applyChildVisibility, plug, False ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ), @@ -77,7 +79,7 @@ def __plugContextMenuSignal( graphEditor, plug, menuDefinition ) : ) else : menuDefinition.append( - "/Expand {} Components".format( childNames ), + "/" + _("Expand {} Components").format( childNames ), { "command" : functools.partial( __applyChildVisibility, plug, True ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) diff --git a/python/GafferUI/CompoundNumericPlugValueWidget.py b/python/GafferUI/CompoundNumericPlugValueWidget.py index 477e330da76..f12f4c37758 100644 --- a/python/GafferUI/CompoundNumericPlugValueWidget.py +++ b/python/GafferUI/CompoundNumericPlugValueWidget.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -162,14 +163,14 @@ def _popupMenu( menuDefinition, plugValueWidget ) : if all( p.isGanged() for p in plugs ) : menuDefinition.append( "/GangDivider", { "divider" : True } ) - menuDefinition.append( "/Ungang", { + menuDefinition.append( "/" + _("Ungang"), { "command" : Gaffer.WeakMethod( compoundNumericPlugValueWidget.__ungang ), "shortCut" : "Ctrl+G", "active" : not readOnly, } ) else : menuDefinition.append( "/GangDivider", { "divider" : True } ) - menuDefinition.append( "/Gang", { + menuDefinition.append( "/" + _("Gang"), { "command" : Gaffer.WeakMethod( compoundNumericPlugValueWidget.__gang ), "shortCut" : "Ctrl+G", "active" : not readOnly and all( p.canGang() for p in plugs ), diff --git a/python/GafferUI/ComputeNodeUI.py b/python/GafferUI/ComputeNodeUI.py index 3246120e485..994cafd4cc1 100644 --- a/python/GafferUI/ComputeNodeUI.py +++ b/python/GafferUI/ComputeNodeUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.ComputeNode, "description", - """ + _(""" Base class for nodes which can compute the values of output plugs based on the values of input plugs. - """, + """), ) diff --git a/python/GafferUI/ConfirmationDialogue.py b/python/GafferUI/ConfirmationDialogue.py index a8bb4b785b4..80790947770 100644 --- a/python/GafferUI/ConfirmationDialogue.py +++ b/python/GafferUI/ConfirmationDialogue.py @@ -35,10 +35,11 @@ ########################################################################## import GafferUI +from GafferUI.i18n import _ class ConfirmationDialogue( GafferUI.Dialogue ) : - def __init__( self, title, message, cancelLabel="Cancel", confirmLabel="OK", sizeMode=GafferUI.Window.SizeMode.Automatic, details = None, **kw ) : + def __init__( self, title, message, cancelLabel=_("Cancel"), confirmLabel=_("OK"), sizeMode=GafferUI.Window.SizeMode.Automatic, details = None, **kw ) : GafferUI.Dialogue.__init__( self, title, sizeMode=sizeMode, **kw ) @@ -47,7 +48,7 @@ def __init__( self, title, message, cancelLabel="Cancel", confirmLabel="OK", siz GafferUI.Label( message ) if details is not None : - with GafferUI.Collapsible( label = "Details", collapsed = True ) : + with GafferUI.Collapsible( label = _("Details"), collapsed = True ) : GafferUI.MultiLineTextWidget( text = details, editable = False, diff --git a/python/GafferUI/ContextProcessorUI.py b/python/GafferUI/ContextProcessorUI.py index b3f50b537f2..afbe0642b6c 100644 --- a/python/GafferUI/ContextProcessorUI.py +++ b/python/GafferUI/ContextProcessorUI.py @@ -35,16 +35,17 @@ ########################################################################## import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.ContextProcessor, "description", - """ + _(""" Base class for nodes which allow the user to make modifications to the upstream evaluation Context. - """, + """), # Add + buttons for creating new plugs in the GraphEditor "noduleLayout:customGadget:addButtonTop:gadgetType", "GafferUI.ContextProcessorUI.PlugAdder", diff --git a/python/GafferUI/ContextQueryUI.py b/python/GafferUI/ContextQueryUI.py index 505ed7c0769..79c41458ee6 100644 --- a/python/GafferUI/ContextQueryUI.py +++ b/python/GafferUI/ContextQueryUI.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ ########################################################################## # Internal utilities @@ -156,9 +157,9 @@ def childPlugValueWidget( self, childPlug ) : Gaffer.ContextQuery, "description", - """ + _(""" Queries variables from the current context, creating outputs for each variable. - """, + """), "nodeGadget:type", "GafferUI::AuxiliaryNodeGadget", "nodeGadget:shape", "oval", @@ -171,14 +172,14 @@ def childPlugValueWidget( self, childPlug ) : "queries" : { "description" : - """ + _(""" The context variables to be queried - arbitrary numbers of context variables may be added as children of this plug via the user interface, or via python. Each child is a `NameValuePlug` whose `name` plug is the context variable to query, and whose `value` plug is the default value to use if the variable does not exist in the context with an appropriate type. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -194,37 +195,37 @@ def childPlugValueWidget( self, childPlug ) : "queries.*" : { "description" : - """ + _(""" A pair of variable name to query and default value. - """, + """), }, "queries.*.name" : { "description" : - """ + _(""" The name of the variable to query. - """, + """), }, "queries.*.value" : { "description" : - """ + _(""" The value to output if the variable does not exist. - """, + """), }, "out" : { "description" : - """ + _(""" The parent plug of the query outputs. The order of outputs corresponds to the order of children of `queries`. - """, + """), "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", @@ -239,9 +240,9 @@ def childPlugValueWidget( self, childPlug ) : "out.*" : { "description" : - """ + _(""" The result of the query. - """, + """), "label" : functools.partial( __getLabel, parentPlug = ""), @@ -254,9 +255,9 @@ def childPlugValueWidget( self, childPlug ) : "out.*.exists" : { "description" : - """ + _(""" Outputs true if the variable exists in the context, and is a compatible type. - """, + """), "noduleLayout:label" : functools.partial( __getLabel, parentPlug = "exists" ), @@ -265,10 +266,10 @@ def childPlugValueWidget( self, childPlug ) : "out.*.value" : { "description" : - """ + _(""" Outputs the value of the specified variable, or the default value if the variable does not exist ( or is incompatible ). - """, + """), }, @@ -348,7 +349,7 @@ def __plugPopupMenu( menuDefinition, plugValueWidget ) : if len( menuDefinition.items() ) : menuDefinition.append( "/DeleteDivider", { "divider" : True } ) - menuDefinition.append( "/Delete", { "command" : functools.partial( __deletePlug, queryPlug ), "active" : not Gaffer.MetadataAlgo.readOnly( queryPlug ) } ) + menuDefinition.append( "/" + _("Delete"), { "command" : functools.partial( __deletePlug, queryPlug ), "active" : not Gaffer.MetadataAlgo.readOnly( queryPlug ) } ) return # For ValuePlug in general, we offer the option to drive them with ContextQuery @@ -366,7 +367,7 @@ def __plugPopupMenu( menuDefinition, plugValueWidget ) : menuDefinition.prepend( "/ContextQueryDivider", { "divider" : True } ) menuDefinition.prepend( - "/Create Context Query...", + "/" + _("Create Context Query..."), { "command" : functools.partial( __createContextQuery, plug ) } diff --git a/python/GafferUI/ContextVariableTweaksUI.py b/python/GafferUI/ContextVariableTweaksUI.py index eecb074c7ab..1b68aef721a 100644 --- a/python/GafferUI/ContextVariableTweaksUI.py +++ b/python/GafferUI/ContextVariableTweaksUI.py @@ -41,16 +41,17 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.ContextVariableTweaks, "description", - """ + _(""" Makes modifications to context variables. Tweaks are applied to context variables coming from downstream nodes, resulting in different values given to upstream nodes. - """, + """), "layout:section:Settings.Tweaks:collapsed", False, @@ -59,10 +60,10 @@ "ignoreMissing" : { "description" : - """ + _(""" Ignores tweaks targeting missing context variables. When off, missing context variables cause the node to error, unless the tweak mode is `CreateIfMissing`. - """, + """), "nodule:type" : "", }, @@ -70,11 +71,11 @@ "tweaks" : { "description" : - """ + _(""" The tweaks to be made to the context variables. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or using the ContextVariableTweaks API via python. - """, + """), "layout:section" : "Settings.Tweaks", "plugValueWidget:type" : "GafferUI.LayoutPlugValueWidget", diff --git a/python/GafferUI/ContextVariablesUI.py b/python/GafferUI/ContextVariablesUI.py index 304a796c046..22b34cde450 100644 --- a/python/GafferUI/ContextVariablesUI.py +++ b/python/GafferUI/ContextVariablesUI.py @@ -35,16 +35,17 @@ ########################################################################## import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.ContextVariables, "description", - """ + _(""" Adds variables which can be referenced by upstream expressions and string substitutions. - """, + """), plugs = { @@ -63,11 +64,11 @@ "variables" : { "description" : - """ + _(""" The variables to be added. Each variable is represented as a child plug, created either through the UI or using the CompoundDataPlug API. - """, + """), "plugCreationWidget:excludedTypes" : "Gaffer.ObjectPlug", "nodule:type" : "", @@ -77,7 +78,7 @@ "extraVariables" : { "description" : - """ + _(""" An additional set of variables to be added. Arbitrary numbers of variables may be specified within a single IECore::CompoundData object, where each key/value pair in the object defines a variable. @@ -87,7 +88,7 @@ If the same variable is defined by both the variables and the extraVariables plugs, then the value from the extraVariables is taken. - """, + """), "layout:section" : "Extra", "nodule:type" : "", diff --git a/python/GafferUI/DeleteContextVariablesUI.py b/python/GafferUI/DeleteContextVariablesUI.py index cc857dc2158..f011785f173 100644 --- a/python/GafferUI/DeleteContextVariablesUI.py +++ b/python/GafferUI/DeleteContextVariablesUI.py @@ -35,24 +35,25 @@ ########################################################################## import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.DeleteContextVariables, "description", - """ + _(""" Removes variables from the Context so that they won't be visible to upstream nodes. - """, + """), plugs = { "variables" : { "description" : - """ + _(""" The variables to be deleted. - """, + """), "nodule:type" : "", diff --git a/python/GafferUI/DependencyNodeUI.py b/python/GafferUI/DependencyNodeUI.py index 6ba45126964..27ae9213c8c 100644 --- a/python/GafferUI/DependencyNodeUI.py +++ b/python/GafferUI/DependencyNodeUI.py @@ -36,25 +36,26 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.DependencyNode, "description", - """ + _(""" Base class for nodes where input plugs have an effect on output plugs. - """, + """), plugs = { "enabled" : { "description" : - """ + _(""" Turns the node on and off. - """, + """), "layout:index" : -2, # Last but one "layout:section" : "Node", diff --git a/python/GafferUI/DotUI.py b/python/GafferUI/DotUI.py index ec663b79014..94c55f5caba 100644 --- a/python/GafferUI/DotUI.py +++ b/python/GafferUI/DotUI.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ ########################################################################## # Public methods @@ -63,9 +64,9 @@ def connect( applicationRoot ) : Gaffer.Dot, "description", - """ + _(""" A utility node which can be used for organising large graphs. - """, + """), "nodeGadget:minWidth", 0.0, "nodeGadget:padding", 0.5, @@ -90,7 +91,7 @@ def connect( applicationRoot ) : "labelType" : { "description" : - """ + _(""" The method used to apply an optional label to the dot. Using a node name is recommended, because it encourages the use of descriptive node @@ -99,7 +100,7 @@ def connect( applicationRoot ) : label does however provide more flexibility, since node names are restricted in the characters they can use. - """, + """), "plugValueWidget:type" :"GafferUI.PresetsPlugValueWidget", "nodule:type" : "", @@ -114,9 +115,9 @@ def connect( applicationRoot ) : "label" : { "description" : - """ + _(""" The label displayed when the type is set to custom. - """, + """), "nodule:type" : "", "layout:activator" : "labelTypeIsCustom", diff --git a/python/GafferUI/EditMenu.py b/python/GafferUI/EditMenu.py index f355e8610e9..7c95bb52b0c 100644 --- a/python/GafferUI/EditMenu.py +++ b/python/GafferUI/EditMenu.py @@ -44,46 +44,48 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + def appendDefinitions( menuDefinition, prefix="" ) : - menuDefinition.append( prefix + "/Undo", { "command" : undo, "shortCut" : "Ctrl+Z", "active" : __undoAvailable } ) - menuDefinition.append( prefix + "/Redo", { "command" : redo, "shortCut" : "Shift+Ctrl+Z", "active" : __redoAvailable } ) + menuDefinition.append( prefix + "/Undo", { "command" : undo, "shortCut" : "Ctrl+Z", "active" : __undoAvailable, "label" : _( "Undo" ) } ) + menuDefinition.append( prefix + "/Redo", { "command" : redo, "shortCut" : "Shift+Ctrl+Z", "active" : __redoAvailable, "label" : _( "Redo" ) } ) menuDefinition.append( prefix + "/UndoDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Cut", { "command" : cut, "shortCut" : "Ctrl+X", "active" : __mutableSelectionAvailable } ) - menuDefinition.append( prefix + "/Copy", { "command" : copy, "shortCut" : "Ctrl+C", "active" : selectionAvailable } ) - menuDefinition.append( prefix + "/Paste", { "command" : paste, "shortCut" : "Ctrl+V", "active" : __pasteAvailable } ) - menuDefinition.append( prefix + "/Duplicate with Inputs", { "command" : duplicateWithInputs, "shortCut" : "Ctrl+D", "active" : selectionAvailable } ) - menuDefinition.append( prefix + "/Delete", { "command" : delete, "shortCut" : "Backspace, Delete", "active" : __mutableSelectionAvailable } ) - menuDefinition.append( prefix + "/Rename", { "command" : rename, "shortCut" : "F2", "active" : __renameAvailable } ) + menuDefinition.append( prefix + "/Cut", { "command" : cut, "shortCut" : "Ctrl+X", "active" : __mutableSelectionAvailable, "label" : _( "Cut" ) } ) + menuDefinition.append( prefix + "/Copy", { "command" : copy, "shortCut" : "Ctrl+C", "active" : selectionAvailable, "label" : _( "Copy" ) } ) + menuDefinition.append( prefix + "/Paste", { "command" : paste, "shortCut" : "Ctrl+V", "active" : __pasteAvailable, "label" : _( "Paste" ) } ) + menuDefinition.append( prefix + "/Duplicate with Inputs", { "command" : duplicateWithInputs, "shortCut" : "Ctrl+D", "active" : selectionAvailable, "label" : _( "Duplicate with Inputs" ) } ) + menuDefinition.append( prefix + "/Delete", { "command" : delete, "shortCut" : "Backspace, Delete", "active" : __mutableSelectionAvailable, "label" : _( "Delete" ) } ) + menuDefinition.append( prefix + "/Rename", { "command" : rename, "shortCut" : "F2", "active" : __renameAvailable, "label" : _( "Rename" ) } ) menuDefinition.append( prefix + "/CutCopyPasteDeleteDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Find...", { "command" : find, "shortCut" : "Ctrl+F" } ) + menuDefinition.append( prefix + "/Find...", { "command" : find, "shortCut" : "Ctrl+F", "label" : _( "Find..." ) } ) menuDefinition.append( prefix + "/FindDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Arrange", { "command" : arrange, "shortCut" : "Ctrl+L", "active" : __arrangeAvailable } ) + menuDefinition.append( prefix + "/Arrange", { "command" : arrange, "shortCut" : "Ctrl+L", "active" : __arrangeAvailable, "label" : _( "Arrange" ) } ) menuDefinition.append( prefix + "/ArrangeDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Select All", { "command" : selectAll, "shortCut" : "Ctrl+A" } ) - menuDefinition.append( prefix + "/Select None", { "command" : selectNone, "shortCut" : "Shift+Ctrl+A", "active" : selectionAvailable } ) + menuDefinition.append( prefix + "/Select All", { "command" : selectAll, "shortCut" : "Ctrl+A", "label" : _( "Select All" ) } ) + menuDefinition.append( prefix + "/Select None", { "command" : selectNone, "shortCut" : "Shift+Ctrl+A", "active" : selectionAvailable, "label" : _( "Select None" ) } ) - menuDefinition.append( prefix + "/Select Connected/Inputs", { "command" : selectInputs, "active" : selectionAvailable } ) - menuDefinition.append( prefix + "/Select Connected/Add Inputs", { "command" : selectAddInputs, "active" : selectionAvailable } ) + menuDefinition.append( prefix + "/Select Connected/Inputs", { "command" : selectInputs, "active" : selectionAvailable, "label" : _("Inputs") } ) + menuDefinition.append( prefix + "/Select Connected/Add Inputs", { "command" : selectAddInputs, "active" : selectionAvailable, "label" : _("Add Inputs") } ) menuDefinition.append( prefix + "/Select Connected/InputsDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Select Connected/Upstream", { "command" : selectUpstream, "active" : selectionAvailable } ) - menuDefinition.append( prefix + "/Select Connected/Add Upstream", { "command" : selectAddUpstream, "active" : selectionAvailable } ) + menuDefinition.append( prefix + "/Select Connected/Upstream", { "command" : selectUpstream, "active" : selectionAvailable, "label" : _("Upstream") } ) + menuDefinition.append( prefix + "/Select Connected/Add Upstream", { "command" : selectAddUpstream, "active" : selectionAvailable, "label" : _("Add Upstream") } ) menuDefinition.append( prefix + "/Select Connected/UpstreamDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Select Connected/Outputs", { "command" : selectOutputs, "active" : selectionAvailable } ) - menuDefinition.append( prefix + "/Select Connected/Add Outputs", { "command" : selectAddOutputs, "active" : selectionAvailable } ) + menuDefinition.append( prefix + "/Select Connected/Outputs", { "command" : selectOutputs, "active" : selectionAvailable, "label" : _("Outputs") } ) + menuDefinition.append( prefix + "/Select Connected/Add Outputs", { "command" : selectAddOutputs, "active" : selectionAvailable, "label" : _("Add Outputs") } ) menuDefinition.append( prefix + "/Select Connected/OutputsDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Select Connected/Downstream", { "command" : selectDownstream, "active" : selectionAvailable } ) - menuDefinition.append( prefix + "/Select Connected/Add Downstream", { "command" : selectAddDownstream, "active" : selectionAvailable } ) + menuDefinition.append( prefix + "/Select Connected/Downstream", { "command" : selectDownstream, "active" : selectionAvailable, "label" : _("Downstream") } ) + menuDefinition.append( prefix + "/Select Connected/Add Downstream", { "command" : selectAddDownstream, "active" : selectionAvailable, "label" : _("Add Downstream") } ) menuDefinition.append( prefix + "/Select Connected/DownstreamDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Select Connected/Add All", { "command" : selectConnected, "active" : selectionAvailable } ) + menuDefinition.append( prefix + "/Select Connected/Add All", { "command" : selectConnected, "active" : selectionAvailable, "label" : _("Add All") } ) ## \todo: Remove nodeGraph fallback when all client code has been updated __Scope = collections.namedtuple( "Scope", [ "scriptWindow", "script", "parent", "graphEditor", "nodeGraph" ] ) @@ -152,8 +154,8 @@ def paste( menu ) : originalSelection = Gaffer.StandardSet( iter( s.script.selection() ) ) errorHandler = GafferUI.ErrorDialogue.ErrorHandler( - title = "Errors Occurred During Pasting", - closeLabel = "Oy vey", + title = _( "Errors Occurred During Pasting" ), + closeLabel = _( "Oy vey" ), parentWindow = s.scriptWindow ) @@ -200,8 +202,8 @@ def duplicateWithInputs( menu ) : s = scope( menu ) errorHandler = GafferUI.ErrorDialogue.ErrorHandler( - title = "Errors Occurred During Duplication", - closeLabel = "Oy vey", + title = _( "Errors Occurred During Duplication" ), + closeLabel = _( "Oy vey" ), parentWindow = s.scriptWindow ) @@ -274,8 +276,8 @@ def rename( menu ) : d = GafferUI.TextInputDialogue( initialText = s.script.selection()[-1].getName(), - title = "Enter name", - confirmLabel = "Rename" + title = _( "Enter name" ), + confirmLabel = _( "Rename" ) ) # Hack to borrow the input validation from NameWidget so we can prevent the diff --git a/python/GafferUI/EditScopeUI.py b/python/GafferUI/EditScopeUI.py index c9b2b7ead95..336a3782463 100644 --- a/python/GafferUI/EditScopeUI.py +++ b/python/GafferUI/EditScopeUI.py @@ -44,6 +44,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI._StyleSheet import _styleColors from Qt import QtGui @@ -54,10 +55,10 @@ Gaffer.EditScope, "description", - """ + _(""" A container that interactive tools may make nodes in as necessary. - """, + """), "icon", "editScopeNode.png", @@ -126,7 +127,7 @@ def __init__( self, plug, **kw ) : GafferUI.PlugValueWidget.__init__( self, self.__listContainer, plug, **kw ) with self.__listContainer : - self.__label = GafferUI.Label( "Edit Target" ) + self.__label = GafferUI.Label( _("Edit Target") ) self.__busyWidget = GafferUI.BusyWidget( size = 18 ) self.__busyWidget.setVisible( False ) self.__menuButton = GafferUI.MenuButton( @@ -268,7 +269,7 @@ def __updateMenuButton( self ) : if self.__followingGlobalEditTarget() : self.__menuButton.setText( " " ) else : - self.__menuButton.setText( editScope.getName() if editScope is not None else "Source" ) + self.__menuButton.setText( editScope.getName() if editScope is not None else _("Source") ) if editScope is not None : self.__menuButton.setImage( @@ -374,7 +375,7 @@ def __activeEditScopes( self ) : def __buildMenu( self, path, currentEditScope ) : result = IECore.MenuDefinition() - result.append( "/__TargetsDivider__", { "divider" : True, "label" : "Edit Targets" } ) + result.append( "/__TargetsDivider__", { "divider" : True, "label" : _("Edit Targets") } ) for childPath in path.children() : itemName = childPath[-1] @@ -422,7 +423,7 @@ def __buildMenu( self, path, currentEditScope ) : ) if result.size() == 1 : - result.append( "No EditScopes Available", { "active" : False } ) + result.append( "No EditScopes Available", { "active" : False, "label" : _("No EditScopes Available") } ) return result @@ -459,7 +460,7 @@ def __menuDefinition( self ) : if self.__contextTracker.updatePending() : result.append( "/__RefreshDivider__", { "divider" : True } ) - result.append( "/Refresh", { "command" : Gaffer.WeakMethod( self.__refreshMenu ) } ) + result.append( "/" + _("Refresh"), { "command" : Gaffer.WeakMethod( self.__refreshMenu ) } ) result.append( "/__SourceDivider__", { "divider" : True } ) result.append( @@ -472,18 +473,19 @@ def __menuDefinition( self ) : ) if self.__globalEditTargetPlug() is not None : - result.append( "/__FollowDivider__", { "divider" : True, "label" : "Options" } ) + result.append( "/__FollowDivider__", { "divider" : True, "label" : _("Options") } ) result.append( "/Follow Global Edit Target", { "command" : functools.partial( Gaffer.WeakMethod( self.__connectPlug ), self.__globalEditTargetPlug() ), "checkBox" : self.__followingGlobalEditTarget(), - "description" : "Always use the global edit target.", + "description" : _("Always use the global edit target."), + "label" : _("Follow Global Edit Target"), } ) if currentEditScope is not None : - result.append( "/__ActionsDivider__", { "divider" : True, "label" : "Actions" } ) + result.append( "/__ActionsDivider__", { "divider" : True, "label" : _("Actions") } ) nodes = currentEditScope.processors() nodes.extend( self.__userNodes( currentEditScope ) ) @@ -499,7 +501,7 @@ def __menuDefinition( self ) : else : result.append( "/Show Edits/EditScope is Empty", - { "active" : False }, + { "active" : False, "label" : _("EditScope is Empty") }, ) return result diff --git a/python/GafferUI/Editor.py b/python/GafferUI/Editor.py index cb1336ef826..324b0c83cca 100644 --- a/python/GafferUI/Editor.py +++ b/python/GafferUI/Editor.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore from Qt import QtWidgets @@ -156,7 +157,7 @@ def getTitle( self ) : c = c.__bases__[0] # otherwise we default to using the classname - return IECore.CamelCase.toSpaced( self.__class__.__name__ ) + return _( IECore.CamelCase.toSpaced( self.__class__.__name__ ) ) ## A signal emitted whenever the title changes. def titleChangedSignal( self ) : diff --git a/python/GafferUI/ErrorDialogue.py b/python/GafferUI/ErrorDialogue.py index 78fa8ed2fa1..21cc1e2de4b 100644 --- a/python/GafferUI/ErrorDialogue.py +++ b/python/GafferUI/ErrorDialogue.py @@ -41,6 +41,7 @@ import IECore import GafferUI +from GafferUI.i18n import _ class ErrorDialogue( GafferUI.Dialogue ) : @@ -50,7 +51,7 @@ class ErrorDialogue( GafferUI.Dialogue ) : # - message : A simple (string) message to display. # - messages : A list of messages in the format stored by `IECore.CapturingMessageHandler.messages` # - details : A string containing additional details to be shown in a collapsed section. - def __init__( self, title, message = None, details = None, messages = None, closeLabel = "Close", **kw ) : + def __init__( self, title, message = None, details = None, messages = None, closeLabel = _("Close"), **kw ) : GafferUI.Dialogue.__init__( self, title, sizeMode=GafferUI.Window.SizeMode.Manual, **kw ) @@ -79,7 +80,7 @@ def __init__( self, title, message = None, details = None, messages = None, clos messageWidget.setMessages( messages ) if details is not None : - with GafferUI.Collapsible( label = "Details", collapsed = True ) : + with GafferUI.Collapsible( label = _("Details"), collapsed = True ) : GafferUI.MultiLineTextWidget( text = details, editable = False, @@ -148,7 +149,7 @@ def __exit__( self, type, value, tb ) : ## Displays an exception in a modal dialogue. By default the currently handled exception is displayed # but another exception can be displayed by specifying excInfo in the same format as returned by sys.exc_info() @staticmethod - def displayException( title="Error", messagePrefix=None, withDetails=True, parentWindow=None, exceptionInfo=None ) : + def displayException( title=_("Error"), messagePrefix=None, withDetails=True, parentWindow=None, exceptionInfo=None ) : if exceptionInfo is None : exceptionInfo = sys.exc_info() diff --git a/python/GafferUI/Examples.py b/python/GafferUI/Examples.py index 1f6c222ce8d..724f8e15641 100644 --- a/python/GafferUI/Examples.py +++ b/python/GafferUI/Examples.py @@ -42,6 +42,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + __examples = collections.OrderedDict() def registerExample( key, absFilePath, description = "", notableNodes = None ) : @@ -92,7 +94,7 @@ def __buildExamplesMenu( nodeOrNone, menu ) : } ) else: - result.append( "/No Examples Available", { "active" : False } ) + result.append( "/" + _("No Examples Available"), { "active" : False } ) return result diff --git a/python/GafferUI/ExpressionUI.py b/python/GafferUI/ExpressionUI.py index a3975c2ed28..7080390ec37 100644 --- a/python/GafferUI/ExpressionUI.py +++ b/python/GafferUI/ExpressionUI.py @@ -42,16 +42,17 @@ import IECore import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Expression, "description", - """ + _(""" Utility node for computing values via scripted expressions. - """, + """), "layout:customWidget:Expression:widgetType", "GafferUI.ExpressionUI.ExpressionWidget", "nodeGadget:type", "GafferUI::AuxiliaryNodeGadget", @@ -119,7 +120,7 @@ def __popupMenu( menuDefinition, plugValueWidget ) : menuDefinition.prepend( "/ExpressionDivider", { "divider" : True } ) for language in languages : menuDefinition.prepend( - "/Create " + IECore.CamelCase.toSpaced( language ) + " Expression...", + "/" + _("Create %s Expression...") % IECore.CamelCase.toSpaced( language ), { "command" : functools.partial( __createExpression, plug, language ) } @@ -143,7 +144,7 @@ def __init__( self, node, **kw ) : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) : - GafferUI.Label( "Language" ) + GafferUI.Label( _("Language") ) self.__languageMenu = GafferUI.MenuButton( "", menu = GafferUI.Menu( Gaffer.WeakMethod( self.__languageMenuDefinition ) ) ) self.__languageMenu.setEnabled( not Gaffer.MetadataAlgo.readOnly( node ) ) @@ -250,7 +251,7 @@ def __walk( graphComponent, result ) : return bookmarkMenuDefinition - menuDefinition.append( "/Insert Bookmark", { "subMenu" : functools.partial( __bookmarkMenu, bookmarks ) } ) + menuDefinition.append( "/" + _("Insert Bookmark"), { "subMenu" : functools.partial( __bookmarkMenu, bookmarks ) } ) self.expressionContextMenuSignal()( menuDefinition, self ) @@ -276,7 +277,7 @@ def __update( self ) : self.__textWidget.setText( expression ) self.__textWidget.setEnabled( bool( language ) ) - self.__languageMenu.setText( IECore.CamelCase.toSpaced( language ) if language else "Choose..." ) + self.__languageMenu.setText( IECore.CamelCase.toSpaced( language ) if language else _("Choose...") ) completer = self.__completers.get( language ) self.__textWidget.setCompleter( completer( self.__node ) if completer is not None else None ) diff --git a/python/GafferUI/FileMenu.py b/python/GafferUI/FileMenu.py index cd1a9db1d52..cf1153d268a 100644 --- a/python/GafferUI/FileMenu.py +++ b/python/GafferUI/FileMenu.py @@ -44,22 +44,24 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + ## Appends items to the IECore.MenuDefinition object passed to build a File menu containing # standard open/save/revert/etc def appendDefinitions( menuDefinition, prefix="" ) : - menuDefinition.append( prefix + "/New", { "command" : new, "shortCut" : "Ctrl+N" } ) - menuDefinition.append( prefix + "/Open...", { "command" : open, "shortCut" : "Ctrl+O" } ) - menuDefinition.append( prefix + "/Open Recent", { "subMenu" : openRecent } ) + menuDefinition.append( prefix + "/New", { "command" : new, "shortCut" : "Ctrl+N", "label" : _( "New" ) } ) + menuDefinition.append( prefix + "/Open...", { "command" : open, "shortCut" : "Ctrl+O", "label" : _( "Open..." ) } ) + menuDefinition.append( prefix + "/Open Recent", { "subMenu" : openRecent, "label" : _( "Open Recent" ) } ) menuDefinition.append( prefix + "/OpenDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Save", { "command" : save, "shortCut" : "Ctrl+S" } ) - menuDefinition.append( prefix + "/Save As...", { "command" : saveAs, "shortCut" : "Shift+Ctrl+S" } ) - menuDefinition.append( prefix + "/Revert To Saved", { "command" : revertToSaved, "active" : __revertToSavedAvailable } ) + menuDefinition.append( prefix + "/Save", { "command" : save, "shortCut" : "Ctrl+S", "label" : _( "Save" ) } ) + menuDefinition.append( prefix + "/Save As...", { "command" : saveAs, "shortCut" : "Shift+Ctrl+S", "label" : _( "Save As..." ) } ) + menuDefinition.append( prefix + "/Revert To Saved", { "command" : revertToSaved, "active" : __revertToSavedAvailable, "label" : _( "Revert To Saved" ) } ) menuDefinition.append( prefix + "/SaveDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Export Selection...", { "command" : exportSelection, "active" : __selectionAvailable } ) - menuDefinition.append( prefix + "/Import...", { "command" : importFile } ) + menuDefinition.append( prefix + "/Export Selection...", { "command" : exportSelection, "active" : __selectionAvailable, "label" : _( "Export Selection..." ) } ) + menuDefinition.append( prefix + "/Import...", { "command" : importFile, "label" : _( "Import..." ) } ) menuDefinition.append( prefix + "/ImportExportDivider", { "divider" : True } ) - menuDefinition.append( prefix + "/Settings...", { "command" : showSettings } ) + menuDefinition.append( prefix + "/Settings...", { "command" : showSettings, "label" : _( "Settings..." ) } ) ## A function suitable as the command for a File/New menu item. It must be invoked from a menu which # has a ScriptWindow in its ancestry. @@ -79,7 +81,7 @@ def open( menu ) : scriptWindow = menu.ancestor( GafferUI.ScriptWindow ) path, bookmarks = __pathAndBookmarks( scriptWindow ) - dialogue = GafferUI.PathChooserDialogue( path, title="Open script", confirmLabel="Open", valid=True, leaf=True, bookmarks=bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title=_( "Open script" ), confirmLabel=_( "Open" ), valid=True, leaf=True, bookmarks=bookmarks ) path = dialogue.waitForPath( parentWindow = scriptWindow ) if not path : @@ -104,10 +106,10 @@ def __addScript( application, fileName, dialogueParentWindow = None, asNew = Fal recoveryFileName = backups.recoveryFile( fileName ) if recoveryFileName : dialogue = GafferUI.ConfirmationDialogue( - title = "Backup Available", - message = "A more recent backup is available. Open backup instead?", - confirmLabel = "Open Backup", - cancelLabel = "Open", + title = _( "Backup Available" ), + message = _( "A more recent backup is available. Open backup instead?" ), + confirmLabel = _( "Open Backup" ), + cancelLabel = _( "Open" ), ) useBackup = dialogue.waitForConfirmation( parentWindow = dialogueParentWindow ) if useBackup is None : @@ -119,7 +121,7 @@ def __addScript( application, fileName, dialogueParentWindow = None, asNew = Fal script = Gaffer.ScriptNode() script["fileName"].setValue( recoveryFileName or fileName ) - dialogue = GafferUI.BackgroundTaskDialogue( "Loading" ) + dialogue = GafferUI.BackgroundTaskDialogue( _( "Loading" ) ) result = dialogue.waitForBackgroundTask( functools.partial( script.load, continueOnError = True, ), dialogueParentWindow ) if isinstance( result, IECore.Cancelled ) : return @@ -184,7 +186,7 @@ def openRecent( menu ) : } ) else : - result.append( "/None Available", { "active" : False } ) + result.append( "/" + _("None Available"), { "active" : False, "label" : _( "None Available" ) } ) return result @@ -229,7 +231,7 @@ def save( menu ) : scriptWindow = menu.ancestor( GafferUI.ScriptWindow ) script = scriptWindow.scriptNode() if script["fileName"].getValue() : - dialogue = GafferUI.BackgroundTaskDialogue( "Saving File" ) + dialogue = GafferUI.BackgroundTaskDialogue( _( "Saving File" ) ) # Really we want to call `script.save()` here, but that would # create an edit to the `unsavedChanges` plug from the background # thread, which is problematic for any connected UIs on the main @@ -249,7 +251,7 @@ def saveAs( menu ) : script = scriptWindow.scriptNode() path, bookmarks = __pathAndBookmarks( scriptWindow ) - dialogue = GafferUI.PathChooserDialogue( path, title="Save script", confirmLabel="Save", leaf=True, bookmarks=bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title=_( "Save script" ), confirmLabel=_( "Save" ), leaf=True, bookmarks=bookmarks ) path = dialogue.waitForPath( parentWindow = scriptWindow ) if not path : @@ -259,7 +261,7 @@ def saveAs( menu ) : if not path.endswith( ".gfr" ) : path += ".gfr" - dialogue = GafferUI.BackgroundTaskDialogue( "Saving File" ) + dialogue = GafferUI.BackgroundTaskDialogue( _( "Saving File" ) ) result = dialogue.waitForBackgroundTask( functools.partial( script.serialiseToFile, path ), parentWindow = scriptWindow ) if not isinstance( result, Exception ) : @@ -275,18 +277,17 @@ def revertToSaved( menu ) : scriptWindow = menu.ancestor( GafferUI.ScriptWindow ) dialogue = GafferUI.ConfirmationDialogue( - title = "Discard Unsaved Changes?", - message = "There are unsaved changes which will be lost." - "Discard them and revert?", - confirmLabel = "Revert", - cancelLabel = "Cancel", + title = _( "Discard Unsaved Changes?" ), + message = _( "There are unsaved changes which will be lost. Discard them and revert?" ), + confirmLabel = _( "Revert" ), + cancelLabel = _( "Cancel" ), ) if not dialogue.waitForConfirmation( parentWindow = scriptWindow ) : return with GafferUI.ErrorDialogue.ErrorHandler( - title = "Errors Occurred During Loading", - closeLabel = "Oy vey", + title = _( "Errors Occurred During Loading" ), + closeLabel = _( "Oy vey" ), parentWindow = scriptWindow ) : scriptWindow.scriptNode().load( continueOnError = True ) @@ -316,7 +317,7 @@ def exportSelection( menu ) : assert( node.parent().isAncestorOf( parent ) ) parent = node.parent() - dialogue = GafferUI.PathChooserDialogue( path, title="Export selection", confirmLabel="Export", leaf=True, bookmarks=bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title=_( "Export selection" ), confirmLabel=_( "Export" ), leaf=True, bookmarks=bookmarks ) path = dialogue.waitForPath( parentWindow = scriptWindow ) if not path : @@ -326,7 +327,7 @@ def exportSelection( menu ) : if not path.endswith( ".gfr" ) : path += ".gfr" - dialogue = GafferUI.BackgroundTaskDialogue( "Saving File" ) + dialogue = GafferUI.BackgroundTaskDialogue( _( "Saving File" ) ) dialogue.waitForBackgroundTask( functools.partial( script.serialiseToFile, path, parent, script.selection() ), parentWindow = scriptWindow ) ## A function suitable as the command for a File/Import File... menu item. It must be invoked from a menu which @@ -336,15 +337,15 @@ def importFile( menu ) : scope = GafferUI.EditMenu.scope( menu ) path, bookmarks = __pathAndBookmarks( scope.scriptWindow ) - dialogue = GafferUI.PathChooserDialogue( path, title="Import script", confirmLabel="Import", valid=True, leaf=True, bookmarks=bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title=_( "Import script" ), confirmLabel=_( "Import" ), valid=True, leaf=True, bookmarks=bookmarks ) path = dialogue.waitForPath( parentWindow = scope.scriptWindow ) if path is None : return errorHandler = GafferUI.ErrorDialogue.ErrorHandler( - title = "Errors Occurred During Loading", - closeLabel = "Oy vey", + title = _( "Errors Occurred During Loading" ), + closeLabel = _( "Oy vey" ), parentWindow = scope.scriptWindow ) @@ -386,7 +387,7 @@ def showSettings( menu ) : break if settingsWindow is None : - settingsWindow = GafferUI.Window( "Settings", borderWidth=8 ) + settingsWindow = GafferUI.Window( _( "Settings" ), borderWidth=8 ) settingsWindow._settingsEditor = True settingsWindow.setChild( GafferUI.NodeUI.create( scriptWindow.scriptNode() ) ) scriptWindow.addChildWindow( settingsWindow ) diff --git a/python/GafferUI/FileSequencePathFilterWidget.py b/python/GafferUI/FileSequencePathFilterWidget.py index 107e30534f6..d26a5cd02a5 100644 --- a/python/GafferUI/FileSequencePathFilterWidget.py +++ b/python/GafferUI/FileSequencePathFilterWidget.py @@ -36,6 +36,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class FileSequencePathFilterWidget( GafferUI.PathFilterWidget ) : @@ -51,7 +52,7 @@ def __init__( self, pathFilter, **kw ) : def _updateFromPathFilter( self ) : - self.__checkBox.setText( "Show sequences" ) + self.__checkBox.setText( _("Show sequences") ) self.__checkBox.setState( self.pathFilter().getMode() == Gaffer.FileSequencePathFilter.Keep.Concise ) def __stateChanged( self, checkBox ) : diff --git a/python/GafferUI/GadgetWidget.py b/python/GafferUI/GadgetWidget.py index d886712be5f..3a242904283 100644 --- a/python/GafferUI/GadgetWidget.py +++ b/python/GafferUI/GadgetWidget.py @@ -42,6 +42,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n import OpenGL.GL as GL @@ -300,6 +302,49 @@ def __visibilityChanged( self, widget ) : self.__viewportGadget.setVisible( self.visible() ) +def _translateGadgetToolTip( toolTip ) : + + if not _i18n.translateNodeNames() : + return toolTip + + import re + + # C++ gadget tooltips have the format: + # # NodeTypeName\n\nDescription text... + # or for plugs: + # # plug.path\n\nDescription text... + m = re.match( r'^(#+ )(.+?)(\n.*)?$', toolTip, re.DOTALL ) + if m : + prefix = m.group( 1 ) + heading = m.group( 2 ) + rest = m.group( 3 ) or "" + + # Translate the heading (node type name) + # C++ gives CamelCase like "OSLShader", .po has spaced "OSL Shader" + translated_heading = _( IECore.CamelCase.toSpaced( heading ) ) + + # Translate the description if present + if rest and _i18n.translateTooltips() : + # Split into paragraphs and translate each + parts = rest.split( "\n\n" ) + translated_parts = [] + for part in parts : + stripped = part.strip() + if stripped : + tr = _( stripped ) + translated_parts.append( tr ) + else : + translated_parts.append( part ) + rest = "\n\n".join( translated_parts ) + + return prefix + translated_heading + rest + + # For non-heading tooltips, try translating the whole thing + if _i18n.translateTooltips() : + return _( toolTip ) + + return toolTip + ## Used to make the tooltips dependent on which gadget is under the mouse class _EventFilter( QtCore.QObject ) : @@ -327,6 +372,7 @@ def eventFilter( self, qObject, qEvent ) : if not toolTip : return False + toolTip = _translateGadgetToolTip( toolTip ) toolTip = GafferUI.DocumentationAlgo.markdownToHTML( toolTip ) QtWidgets.QToolTip.showText( qEvent.globalPos(), toolTip, qObject ) diff --git a/python/GafferUI/GraphBookmarksUI.py b/python/GafferUI/GraphBookmarksUI.py index 0502aa37f17..3750d929af9 100644 --- a/python/GafferUI/GraphBookmarksUI.py +++ b/python/GafferUI/GraphBookmarksUI.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ ########################################################################## # Public methods @@ -52,7 +53,7 @@ def appendNodeContextMenuDefinitions( graphEditor, node, menuDefinition ) : menuDefinition.append( "/GraphBookmarksDivider", { "divider" : True } ) menuDefinition.append( - "/Bookmarked", + "/" + _("Bookmarked"), { "checkBox" : Gaffer.MetadataAlgo.getBookmarked( node ), "command" : functools.partial( __setBookmarked, node ), @@ -62,7 +63,7 @@ def appendNodeContextMenuDefinitions( graphEditor, node, menuDefinition ) : for i in range( 1, 10 ) : menuDefinition.append( - "/Numeric Bookmark/%s" % i, + "/" + _("Numeric Bookmark") + "/%s" % i, { "command" : functools.partial( __assignNumericBookmark, node, i ), "shortCut" : "Ctrl+%i" % i, @@ -71,7 +72,7 @@ def appendNodeContextMenuDefinitions( graphEditor, node, menuDefinition ) : ) menuDefinition.append( - "/Numeric Bookmark/Remove", + "/" + _("Numeric Bookmark") + "/" + _("Remove"), { "command" : functools.partial( __assignNumericBookmark, node, 0 ), "shortCut" : "Ctrl+0", @@ -109,7 +110,7 @@ def appendPlugContextMenuDefinitions( graphEditor, plug, menuDefinition ) : bookmarkPlug = outPlug if inPlug.isSame( plug ) else inPlug label += "/" + bookmarkPlug.relativeName( bookmark ) menuDefinition.append( - "/Connect Bookmark/" + label, + "/" + _("Connect Bookmark") + "/" + label, { "command" : functools.partial( __connect, inPlug, outPlug ), "active" : not outPlug.isSame( inPlug.getInput() ) and not Gaffer.MetadataAlgo.readOnly( inPlug ) @@ -132,7 +133,7 @@ def followBookmark( number, weakEditor, _ ) : script = editor.scriptNode() - menuDefinition.append( "/NumericBookmarkDivider", { "divider" : True, "label" : "Follow Numeric Bookmark" } ) + menuDefinition.append( "/NumericBookmarkDivider", { "divider" : True, "label" : _("Follow Numeric Bookmark") } ) for i in range( 1, 10 ) : bookmarkNode = Gaffer.MetadataAlgo.getNumericBookmark( script, i ) @@ -275,9 +276,9 @@ def __findBookmark( editor, bookmarks = None ) : menuDefinition.append( path, { "command" : command } ) if not len( bookmarks ) : - menuDefinition.append( "/No bookmarks available", { "active" : False, "searchText" : "" } ) + menuDefinition.append( "/" + _("No bookmarks available"), { "active" : False, "searchText" : "" } ) - editor.__findBookmarksMenu = GafferUI.Menu( menuDefinition, title = "Find Bookmark", searchable = True ) + editor.__findBookmarksMenu = GafferUI.Menu( menuDefinition, title = _("Find Bookmark"), searchable = True ) editor.__findBookmarksMenu.popup() def __assignNumericBookmark( node, numericBookmark ) : diff --git a/python/GafferUI/GraphComponentBrowserMode.py b/python/GafferUI/GraphComponentBrowserMode.py index b2cdb0148eb..ca85aee092c 100644 --- a/python/GafferUI/GraphComponentBrowserMode.py +++ b/python/GafferUI/GraphComponentBrowserMode.py @@ -38,6 +38,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class GraphComponentBrowserMode( GafferUI.BrowserEditor.Mode ) : @@ -62,7 +63,7 @@ def _initialPath( self ) : leafOnly = False, userData = { "UI" : { - "label" : "Show hidden", + "label" : _("Show hidden"), "invertEnabled" : True, } } diff --git a/python/GafferUI/GraphEditor.py b/python/GafferUI/GraphEditor.py index a1d4a816c48..53552ea994e 100644 --- a/python/GafferUI/GraphEditor.py +++ b/python/GafferUI/GraphEditor.py @@ -37,11 +37,14 @@ import functools import imath +import unicodedata import IECore import Gaffer import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n class GraphEditor( GafferUI.Editor ) : @@ -80,7 +83,7 @@ def __init__( self, scriptNode, **kw ) : image = "annotations.png", hasFrame = False, menu = GafferUI.Menu( Gaffer.WeakMethod( self.__annotationsMenu ), - title = "Annotations" + title = _("Annotations") ) ) GafferUI.Spacer( imath.V2i( 1 ) ) @@ -89,6 +92,8 @@ def __init__( self, scriptNode, **kw ) : self.__nodeMenu = None self.__readOnlyPopup = None + self.__rootChildAddedConnection = None + self.__pendingTranslatedNodes = set() ## Returns the internal GadgetWidget holding the GraphGadget. def graphGadgetWidget( self ) : @@ -116,7 +121,7 @@ def getTitle( self ) : if title: return title - result = IECore.CamelCase.toSpaced( self.__class__.__name__ ) + result = _( IECore.CamelCase.toSpaced( self.__class__.__name__ ) ) root = self.graphGadget().getRoot() if not root.isSame( self.scriptNode() ) : @@ -215,7 +220,7 @@ def plugDirectionsWalk( gadget ) : if Gaffer.Plug.Direction.In in plugDirections : menuDefinition.append( - "/Connections/Show Input Connections", + "/" + _("Connections") + "/" + _("Show Input Connections"), { "checkBox" : functools.partial( cls.__getNodeInputConnectionsVisible, graphEditor.graphGadget(), node ), "command" : functools.partial( cls.__setNodeInputConnectionsVisible, graphEditor.graphGadget(), node ), @@ -225,7 +230,7 @@ def plugDirectionsWalk( gadget ) : if Gaffer.Plug.Direction.Out in plugDirections : menuDefinition.append( - "/Connections/Show Output Connections", + "/" + _("Connections") + "/" + _("Show Output Connections"), { "checkBox" : functools.partial( cls.__getNodeOutputConnectionsVisible, graphEditor.graphGadget(), node ), "command" : functools.partial( cls.__setNodeOutputConnectionsVisible, graphEditor.graphGadget(), node ), @@ -235,7 +240,7 @@ def plugDirectionsWalk( gadget ) : if Gaffer.Plug.Direction.In in plugDirections : menuDefinition.append( - "/Connections/Show Input Labels", + "/" + _("Connections") + "/" + _("Show Input Labels"), { "checkBox" : functools.partial( cls.__getNoduleLabelsVisible, node, "input" ), "command" : functools.partial( cls.__setNoduleLabelsVisible, node, "input" ), @@ -245,7 +250,7 @@ def plugDirectionsWalk( gadget ) : if Gaffer.Plug.Direction.Out in plugDirections : menuDefinition.append( - "/Connections/Show Output Labels", + "/" + _("Connections") + "/" + _("Show Output Labels"), { "checkBox" : functools.partial( cls.__getNoduleLabelsVisible, node, "output" ), "command" : functools.partial( cls.__setNoduleLabelsVisible, node, "output" ), @@ -262,7 +267,7 @@ def appendEnabledPlugMenuDefinitions( cls, graphEditor, node, menuDefinition ) : if enabledPlug is not None : menuDefinition.append( "/EnabledDivider", { "divider" : True } ) menuDefinition.append( - "/Enabled", + "/" + _("Enabled"), { "command" : functools.partial( cls.__setValue, enabledPlug ), "checkBox" : enabledPlug.getValue(), @@ -274,7 +279,7 @@ def appendEnabledPlugMenuDefinitions( cls, graphEditor, node, menuDefinition ) : def appendContentsMenuDefinitions( cls, graphEditor, node, menuDefinition ) : menuDefinition.append( "/FocusDivider", { "divider" : True } ) - menuDefinition.append( "/Focus", { + menuDefinition.append( "/" + _("Focus") + "", { "command" : functools.partial( graphEditor.scriptNode().setFocus, node ), "active" : not node.isSame( graphEditor.scriptNode().getFocus() ), "shortCut" : "Ctrl+`" @@ -284,7 +289,7 @@ def appendContentsMenuDefinitions( cls, graphEditor, node, menuDefinition ) : return menuDefinition.append( "/ContentsDivider", { "divider" : True } ) - menuDefinition.append( "/Show Contents...", { "command" : functools.partial( cls.acquire, node ) } ) + menuDefinition.append( "/" + _("Show Contents..."), { "command" : functools.partial( cls.acquire, node ) } ) __nodeDoubleClickSignal = GafferUI.WidgetEventSignal() ## Returns a signal which is emitted whenever a node is double clicked. @@ -349,7 +354,7 @@ def __popupNodeMenu( self ) : else : if self.__readOnlyPopup is None : - GafferUI.PopupWindow.showWarning( "Node Graph Not Editable", parent = self, center = self.bound().center() ) + GafferUI.PopupWindow.showWarning( _("Node Graph Not Editable"), parent = self, center = self.bound().center() ) def __nodeMenuVisibilityChanged( self, widget ) : @@ -614,6 +619,95 @@ def __rootChanged( self, graphGadget, previousRoot ) : self.titleChangedSignal()( self ) + # Conectar a los nodos nuevos bajo el root actual para traducir el texto + # inmediatamente, sin depender del siguiente frame de renderizado. + try : + self.__rootChildAddedConnection = graphGadget.getRoot().childAddedSignal().connect( + Gaffer.WeakMethod( self.__rootChildAdded ), scoped = True + ) + except Exception : + self.__rootChildAddedConnection = None + + # Re-translate gadgets in the new root + self.__translateNodeGadgets( graphGadget ) + self.__gadgetWidget._qtWidget().update() + + def __rootChildAdded( self, parent, child ) : + + if not _i18n.translateNodeNames() : + return + + if not isinstance( child, Gaffer.Node ) : + return + + if self.__translateNodeGadgetIfPossible( child ) : + self.__gadgetWidget._qtWidget().update() + return + + # En algunos casos el nodo se añade antes de que exista su grafeto. + # Reintentamos en reposo hasta que se cree. + self.__pendingTranslatedNodes.add( child ) + GafferUI.EventLoop.addIdleCallback( self.__deferredTranslatePendingNodes ) + + def __translateNodeGadgetIfPossible( self, node ) : + + graphGadget = self.graphGadget() + gadget = graphGadget.nodeGadget( node ) + if gadget is None : + return False + + try : + contents = gadget.getContents() + # StandardNodeGadget uses a NameGadget by default, which + # resets to node.getName() on nameChangedSignal and would + # overwrite any translated text. Replace it with a plain + # TextGadget so the translation is stable. Once replaced, + # isinstance() returns False and the node is not reprocessed. + if isinstance( contents, GafferUI.NameGadget ) : + safeText = self.__getSafeTranslation( node ) + gadget.setContents( GafferUI.TextGadget( safeText ) ) + self.__translateNoduleLabels( node ) + except Exception : + pass + + return True + + @staticmethod + def __getSafeTranslation( node ) : + + typeName = node.typeName().rpartition( ":" )[-1] + translated = _i18n.getNodeLabel( typeName, node ) + # IECoreGL::Font only supports single-byte chars (char c), + # so strip accents for the OpenGL node graph labels. + return _i18n.stripAccents( translated ) + + def __deferredTranslatePendingNodes( self ) : + + if not self.__pendingTranslatedNodes : + return False + + pending = list( self.__pendingTranslatedNodes ) + madeProgress = False + for node in pending : + # El nodo puede haber sido borrado o movido a otro root + try : + if node.parent() is None : + self.__pendingTranslatedNodes.discard( node ) + continue + except Exception : + self.__pendingTranslatedNodes.discard( node ) + continue + + if self.__translateNodeGadgetIfPossible( node ) : + self.__pendingTranslatedNodes.discard( node ) + madeProgress = True + + if madeProgress : + self.__gadgetWidget._qtWidget().update() + + # Seguir intentándolo mientras queden pendientes. + return bool( self.__pendingTranslatedNodes ) + def __rootNameChanged( self, root, oldName ) : self.titleChangedSignal()( self ) @@ -630,6 +724,10 @@ def __preRender( self, viewportGadget ) : graphGadget = self.graphGadget() nodes = [ g.node() for g in graphGadget.unpositionedNodeGadgets() ] + + # Translate labels for any new node gadgets + self.__translateNodeGadgets( graphGadget ) + if not nodes : return @@ -652,6 +750,88 @@ def __preRender( self, viewportGadget ) : self.frame( nodes, extend = True ) + # Schedule a deferred re-translation pass. setContents() during + # preRender may not take visual effect until the *next* frame, and + # the graph goes idle after creation, so request one extra render. + if _i18n.translateNodeNames() : + GafferUI.EventLoop.addIdleCallback( self.__deferredTranslateNodeGadgets ) + + def __deferredTranslateNodeGadgets( self ) : + + self.__translateNodeGadgets( self.graphGadget() ) + self.__gadgetWidget._qtWidget().update() + return False + + def __translateNodeGadgets( self, graphGadget ) : + + if not _i18n.translateNodeNames() : + return + + root = graphGadget.getRoot() + for node in root.children( Gaffer.Node ) : + gadget = graphGadget.nodeGadget( node ) + if gadget is None : + continue + + try : + contents = gadget.getContents() + if isinstance( contents, GafferUI.NameGadget ) : + safeText = self.__getSafeTranslation( node ) + gadget.setContents( GafferUI.TextGadget( safeText ) ) + # Translate nodule labels – set instance metadata which + # has highest priority and overrides shader-UI registrations. + self.__translateNoduleLabels( node ) + except Exception : + pass + + @staticmethod + def __translateNoduleLabels( node ) : + + def _recurse( plug, depth = 0 ) : + if depth > 8 : + return + GraphEditor.__translatePlugNoduleLabel( plug ) + for child in plug.children( Gaffer.Plug ) : + _recurse( child, depth + 1 ) + + for plug in node.children( Gaffer.Plug ) : + _recurse( plug ) + + @staticmethod + def __translatePlugNoduleLabel( plug ) : + + # Read the current label from any registration source + label = Gaffer.Metadata.value( plug, "noduleLayout:label" ) + if label is None or not isinstance( label, str ) : + # No metadata registered – use plug name as source for translation + name = plug.getName() + # Handle standalone color/vector components (g→V, b→A) + comp = _i18n.translateColorComponent( name ) + if comp is not None and comp != name.upper() : + Gaffer.Metadata.registerValue( plug, "noduleLayout:label", comp ) + return + # Translate the plug name itself (e.g. "intensity" → "intensidad") + spaced = _i18n._camelToSpaced( name ) + translated = _i18n.translateLabel( spaced ) + safe = _i18n.stripAccents( translated ) + if safe != name : + Gaffer.Metadata.registerValue( plug, "noduleLayout:label", safe ) + return + + translated = _i18n.translateLabel( label ) + + # Always strip accents for IECoreGL rendering, even when + # the label was already translated by a dynamic callback + # (e.g. OSLShaderUI.__plugNoduleLabel) that does not strip. + safe = _i18n.stripAccents( translated ) + + if safe == label : + return + + # Set as instance metadata (highest priority) + Gaffer.Metadata.registerValue( plug, "noduleLayout:label", safe ) + + def __annotationsMenu( self ) : graphGadget = self.graphGadget() @@ -829,3 +1009,25 @@ def __enabledPlugForEditing( node ) : return enabledPlug GafferUI.Editor.registerType( "GraphEditor", GraphEditor ) + +# --------------------------------------------------------------------------- +# Nodule label translation +# --------------------------------------------------------------------------- +# Register a default noduleLayout:label on the base Gaffer.Plug type so that +# nodule labels in the graph canvas are translated. More specific +# registrations (e.g. on TweakPlug) take precedence automatically. + +def __translatedNoduleLabel( plug ) : + + name = plug.getName() + if not _i18n.translateNodeNames() : + return name + + # CamelCase-split, then translate via .po / _WORD_MAP + spaced = _i18n._camelToSpaced( name ) + translated = _i18n.translateLabel( spaced ) + + # IECoreGL font only supports single-byte chars – strip accents + return _i18n.stripAccents( translated ) + +Gaffer.Metadata.registerValue( Gaffer.Plug, "noduleLayout:label", __translatedNoduleLabel ) diff --git a/python/GafferUI/InfoPathFilterWidget.py b/python/GafferUI/InfoPathFilterWidget.py index bc3026fb47f..5783e0c7d87 100644 --- a/python/GafferUI/InfoPathFilterWidget.py +++ b/python/GafferUI/InfoPathFilterWidget.py @@ -43,6 +43,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class InfoPathFilterWidget( GafferUI.PathFilterWidget ) : @@ -57,7 +58,7 @@ def __init__( self, pathFilter, **kw ) : filterButton.clickedSignal().connect( Gaffer.WeakMethod( self.__buttonClicked ) ) self.__filterText = GafferUI.TextWidget() - self.__filterText.setPlaceholderText( "Filter..." ) + self.__filterText.setPlaceholderText( _("Filter...") ) self.__filterText.editingFinishedSignal().connect( Gaffer.WeakMethod( self.__filterEditingFinished ) ) self.__filterText.textChangedSignal().connect( Gaffer.WeakMethod( self.__filterTextChanged ) ) diff --git a/python/GafferUI/LabelPlugValueWidget.py b/python/GafferUI/LabelPlugValueWidget.py index c9eec567eda..e68f3b16338 100644 --- a/python/GafferUI/LabelPlugValueWidget.py +++ b/python/GafferUI/LabelPlugValueWidget.py @@ -36,6 +36,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n from GafferUI.PlugValueWidget import sole @@ -327,6 +329,6 @@ def __formatter( graphComponents ) : if graphComponents : label = Gaffer.Metadata.value( graphComponents[-1], "label" ) if label is not None : - return label + return _i18n.translateLabel( label ) - return GafferUI.NameLabel.defaultFormatter( graphComponents ) + return _i18n.translateLabel( GafferUI.NameLabel.defaultFormatter( graphComponents ) ) diff --git a/python/GafferUI/LayoutMenu.py b/python/GafferUI/LayoutMenu.py index 014281138db..c0963fcd023 100644 --- a/python/GafferUI/LayoutMenu.py +++ b/python/GafferUI/LayoutMenu.py @@ -41,6 +41,8 @@ import GafferUI +from GafferUI.i18n import _ + ## Appends a submenu of the given name to the specified IECore.MenuDefinition. The submenu # contains commands to facilitate the administration of different UI layouts. def appendDefinitions( menuDefinition, name="" ) : @@ -73,7 +75,7 @@ def save( menu ) : if layoutName not in layoutNames : break - d = GafferUI.TextInputDialogue( initialText=layoutName, title="Save Layout", confirmLabel="Save" ) + d = GafferUI.TextInputDialogue( initialText=layoutName, title=_( "Save Layout" ), confirmLabel=_( "Save" ) ) t = d.waitForText( parentWindow = scriptWindow ) d.setVisible( False ) @@ -153,21 +155,21 @@ def __setDefault( layouts, name, *unused ) : } ) if persistentLayoutNames : - menuDefinition.append( "/Save As/Divider", { "divider" : True } ) + menuDefinition.append( "/" + _("Save As") + "/Divider", { "divider" : True } ) - menuDefinition.append( "/Save As/New Layout...", { "command" : save } ) + menuDefinition.append( "/" + _("Save As") + "/" + _("New Layout..."), { "command" : save, "label" : _( "New Layout..." ) } ) # Menu items to delete layouts if persistentLayoutNames : for name in persistentLayoutNames : - menuDefinition.append( "/Delete/" + name, { "command" : functools.partial( layouts.remove, name = name ) } ) + menuDefinition.append( "/" + _("Delete") + name, { "command" : functools.partial( layouts.remove, name = name ) } ) menuDefinition.append( "/SaveDeleteDivider", { "divider" : True } ) # Other menu items - menuDefinition.append( "/Full Screen", { "command" : fullScreen, "checkBox" : fullScreenCheckBox, "shortCut" : "F11" } ) + menuDefinition.append( "/" + _("Full Screen"), { "command" : fullScreen, "checkBox" : fullScreenCheckBox, "shortCut" : "F11", "label" : _( "Full Screen" ) } ) return menuDefinition diff --git a/python/GafferUI/LoopUI.py b/python/GafferUI/LoopUI.py index 14be0bca321..590efa7e8c8 100644 --- a/python/GafferUI/LoopUI.py +++ b/python/GafferUI/LoopUI.py @@ -38,19 +38,20 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Loop, "description", - """ + _(""" Applies a node network to an input iteratively. > Caution : This should _not_ be your first choice of tool. > For many use cases the Instancer, CollectScenes and CollectImages > nodes are more suitable and offer _significantly_ better performance. - """, + """), # Add + buttons for creating new plugs in the GraphEditor "noduleLayout:customGadget:addButtonTop:gadgetType", "GafferUI.LoopUI.PlugAdder", @@ -63,46 +64,46 @@ "in" : { "description" : - "The initial starting point for the loop." + _("The initial starting point for the loop.") }, "out" : { "description" : - "The final result of the loop.", + _("The final result of the loop."), }, "previous" : { "description" : - """ + _(""" The result from the previous iteration of the loop, or the primary input if no iterations have been performed yet. The content of the loop is defined by feeding this previous result through the processing nodes of choice and back around into the next plug. - """, + """), }, "next" : { "description" : - """ + _(""" The input to be used as the start of the next iteration of the loop. - """, + """), }, "iterations" : { "description" : - """ + _(""" The number of times the loop is applied to form the output. - """, + """), "nodule:type" : "", @@ -111,12 +112,12 @@ "indexVariable" : { "description" : - """ + _(""" The name of a Context Variable used to specify the index of the current iteration. This can be referenced from expressions within the loop network to modify the operations performed during each iteration of the loop. - """, + """), "nodule:type" : "", @@ -168,7 +169,7 @@ def __graphEditorPlugContextMenu( graphEditor, plug, menuDefinition ) : return menuDefinition.append( - "/Connect to {0}".format( "Previous" if plug == node["next"] else "Next" ), + "/" + _("Connect to {0}").format( _("Previous") if plug == node["next"] else _("Next") ), { "command" : functools.partial( __createLoop, node = node ), "active" : ( diff --git a/python/GafferUI/MatchPatternPathFilterWidget.py b/python/GafferUI/MatchPatternPathFilterWidget.py index 5022d2fffe1..c32240e086e 100644 --- a/python/GafferUI/MatchPatternPathFilterWidget.py +++ b/python/GafferUI/MatchPatternPathFilterWidget.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class MatchPatternPathFilterWidget( GafferUI.PathFilterWidget ) : @@ -159,12 +160,12 @@ def __updatePlaceholderText( self, pathFilter ) : propertyNameData = self.__propertyFilters().get( pathFilter.getPropertyName(), None ) self.__patternWidget.setPlaceholderText( - "Filter{}".format( ( " by " + propertyNameData.value + "..." ) if propertyNameData is not None else "..." ) + "{}{}".format( _("Filter"), ( " " + _("by") + " " + propertyNameData.value + "..." ) if propertyNameData is not None else "..." ) ) def __propertyFilters( self ) : - result = { "name": IECore.StringData( "Name" ), "filesystem:owner": IECore.StringData( "Owner" ) } + result = { "name": IECore.StringData( _("Name") ), "filesystem:owner": IECore.StringData( _("Owner") ) } with IECore.IgnoredExceptions( KeyError ) : result = self.pathFilter().userData()["UI"]["propertyFilters"] diff --git a/python/GafferUI/Menu.py b/python/GafferUI/Menu.py index 1888651e08e..654b4906e8e 100644 --- a/python/GafferUI/Menu.py +++ b/python/GafferUI/Menu.py @@ -46,6 +46,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n from Qt import QtCore from Qt import QtGui @@ -235,7 +237,7 @@ def __show( self ) : self.__searchLine.textEdited.connect( Gaffer.WeakMethod( self.__updateSearchMenu ) ) self.__searchLine.returnPressed.connect( Gaffer.WeakMethod( self.__searchReturnPressed ) ) self.__searchLine.setObjectName( "gafferSearchField" ) - self.__searchLine.setPlaceholderText( "Search..." ) + self.__searchLine.setPlaceholderText( _("Search...") ) if self.__lastAction : self.__searchLine.setText( self.__lastAction.text() ) self.__searchMenu.setDefaultAction( self.__lastAction ) @@ -303,7 +305,7 @@ def __build( self, qtMenu, recurse=False, forShortCuts=False ) : # it's an intermediate submenu we need to make # to construct the path to something else - subMenu = _Menu( qtMenu, name ) + subMenu = _Menu( qtMenu, _(name) ) qtMenu.addMenu( subMenu ) subMenu.__definition = definition.reRooted( "/" + name + "/" ) @@ -323,7 +325,7 @@ def __build( self, qtMenu, recurse=False, forShortCuts=False ) : if forShortCuts and not getattr( item, 'hasShortCuts', True ) : continue - subMenu = _Menu( qtMenu, name ) + subMenu = _Menu( qtMenu, _(name) ) active = self.__evaluateItemValue( item.active ) subMenu.setEnabled( active ) @@ -363,7 +365,7 @@ def __build( self, qtMenu, recurse=False, forShortCuts=False ) : # add a title if required. if self.__title is not None and qtMenu is self._qtWidget() : - titleWidget = QtWidgets.QLabel( self.__title ) + titleWidget = QtWidgets.QLabel( _(self.__title) ) titleWidget.setIndent( 0 ) titleWidget.setObjectName( "gafferMenuTitle" ) titleWidgetAction = QtWidgets.QWidgetAction( qtMenu ) @@ -386,7 +388,7 @@ def __buildAction( self, item, name, parent ) : if item.divider : qtAction = _DividerAction( item, parent ) else : - qtAction = _Action( item, label, parent ) + qtAction = _Action( item, _(label), parent ) if item.checkBox is not None : qtAction.setCheckable( True ) @@ -576,7 +578,7 @@ def __updateSearchMenu( self, text ) : else : if overflowMenu is None : self.__searchMenu.addSeparator() - overflowMenu = _Menu( self.__searchMenu, "More Results" ) + overflowMenu = _Menu( self.__searchMenu, _("More Results") ) self.__searchMenu.addMenu( overflowMenu ) overflowMenu.addAction( action ) @@ -622,6 +624,24 @@ def __matchingActions( self, searchText ) : match = matcher.search( name ) + # Also try matching against the full category path + # so that e.g. "3D" finds nodes under "/3Delight/..." + if not match : + for _item, _path in self.__searchStructure[name] : + match = matcher.search( _path ) + if match : + break + + # Bilingual search: also try the translated label + if not match and _i18n.translateNodeNames() : + for _item, _path in self.__searchStructure[name] : + leafName = _path.rstrip( "/" ).rsplit( "/", 1 )[-1] + translatedName = _( leafName ) + if translatedName != leafName : + match = matcher.search( translatedName ) + if match : + break + if match : weight = 0 @@ -651,10 +671,20 @@ def __matchingActions( self, searchText ) : for item, path in self.__searchStructure[name] : + if _i18n.translateNodeNames() and _i18n.language() != "en" : + displayName = path.rstrip( "/" ).rsplit( "/", 1 )[-1] + else : + displayName = name + action = self.__cachedSearchActions.get( path ) if action is None : - action = self.__buildAction( item, name, self.__searchMenu ) + action = self.__buildAction( item, displayName, self.__searchMenu ) self.__cachedSearchActions[path] = action + else : + # Cached actions may have been created before translation was fully + # initialised, so make sure the visible text reflects current locale. + with IECore.IgnoredExceptions( Exception ) : + action.setText( _( displayName ) ) if name not in results : results[name] = { "pos" : pos, "weight" : weight, "actions" : [], 'grp' : match.groups() } @@ -775,7 +805,7 @@ def __init__( self, item, *args, **kwarg ) : QtWidgets.QWidgetAction.__init__( self, *args, **kwarg ) if hasattr( item, 'label' ) and item.label : - titleWidget = QtWidgets.QLabel( item.label ) + titleWidget = QtWidgets.QLabel( _(item.label) ) titleWidget.setIndent( 0 ) titleWidget.setObjectName( "gafferMenuLabeledDivider" ) titleWidget.setEnabled( False ) diff --git a/python/GafferUI/MenuBar.py b/python/GafferUI/MenuBar.py index 3fea2df2300..5e29a88f3e7 100644 --- a/python/GafferUI/MenuBar.py +++ b/python/GafferUI/MenuBar.py @@ -40,6 +40,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + from Qt import QtCore from Qt import QtGui from Qt import QtWidgets @@ -104,7 +106,7 @@ def __setattr__( self, key, value ) : # hasShortCuts as the definition it was on is lost here. menu = GafferUI.Menu( subMenuDefinition, _qtParent=self._qtWidget() ) menu.__hasShortCuts = getattr( item, 'hasShortCuts', True ) - menu._qtWidget().setTitle( name ) + menu._qtWidget().setTitle( _( name ) ) self._qtWidget().addMenu( menu._qtWidget() ) self.__subMenus.append( menu ) diff --git a/python/GafferUI/MessageWidget.py b/python/GafferUI/MessageWidget.py index 0573152e408..37ab17c1e5e 100644 --- a/python/GafferUI/MessageWidget.py +++ b/python/GafferUI/MessageWidget.py @@ -44,6 +44,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore from Qt import QtGui @@ -80,7 +81,7 @@ def __init__( self, messageLevel = IECore.MessageHandler.Level.Info, role = Role upperToolbar = GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) with upperToolbar : - GafferUI.Label( "Show" ) + GafferUI.Label( _("Show") ) self.__levelWidget = _MessageLevelWidget() self.__levelWidget.messageLevelChangedSignal().connect( Gaffer.WeakMethod( self.__messageLevelChanged ) ) @@ -101,7 +102,7 @@ def __init__( self, messageLevel = IECore.MessageHandler.Level.Info, role = Role GafferUI.Spacer( imath.V2i( 0 ) ) self.__toEndButton = GafferUI.Button( image = "scrollToBottom.png", hasFrame = False ) - self.__toEndButton.setToolTip( "Scroll to bottom and follow new messages [B]" ) + self.__toEndButton.setToolTip( _("Scroll to bottom and follow new messages [B]") ) self.__toEndButton.buttonPressSignal().connect( Gaffer.WeakMethod( self.__table.scrollToLatest ) ) GafferUI.Spacer( imath.V2i( 3 ), imath.V2i( 3 ) ) @@ -421,11 +422,11 @@ def __init__( self, tableView, **kw ) : # Activated allows to repeatedly jump to the next search result self.__searchField.activatedSignal().connect( Gaffer.WeakMethod( self.__textActivated ) ) self.__searchField._qtWidget().setObjectName( "gafferSearchField" ) - self.__searchField.setPlaceholderText( "Search" ) + self.__searchField.setPlaceholderText( _("Search") ) self.__searchField._qtWidget().setMaximumWidth( 250 ) - self.__prevButton.setToolTip( "Show previous match [P]" ) - self.__nextButton.setToolTip( "Show next match [N]" ) + self.__prevButton.setToolTip( _("Show previous match [P]") ) + self.__nextButton.setToolTip( _("Show next match [N]") ) # Though Qt provides clearButtonEnabled(), this seems to be missing its icon on macOS, resulting in a # clickable-but-not-visible clear button. As such we need to make our own. Icons need to be 16x16 exactly. diff --git a/python/GafferUI/NameSwitchUI.py b/python/GafferUI/NameSwitchUI.py index d3d2f6b9b3d..f675f3c45b6 100644 --- a/python/GafferUI/NameSwitchUI.py +++ b/python/GafferUI/NameSwitchUI.py @@ -42,13 +42,14 @@ import GafferUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.NameSwitch, "description", - """ + _(""" Switches between multiple input connections, passing through the chosen input to the output. Each input has a "name" as well as a value, and switching is performed by comparing the names against @@ -62,18 +63,18 @@ by spaces. - The first input is used as a default, and is chosen only if no other input matches. - """, + """), plugs = { "selector" : { "description" : - """ + _(""" The value that the input names will be matched against. Typically this will refer to a Context Variable using the `${variableName}` syntax. - """, + """), "preset:Render Pass" : "${renderPass}", @@ -165,11 +166,11 @@ "enabledNames" : { "description" : - """ + _(""" An output plug containing the names of all currently enabled inputs. Example uses include driving `Collect.contextValues` to collect all the inputs, or `Wedge.strings` to dispatch a task per input. - """, + """), "layout:section" : "Advanced", "plugValueWidget:type" : "GafferUI.ConnectionPlugValueWidget", @@ -380,7 +381,7 @@ def __init__( self, plug ) : # Spacers on default row occupy the space taken by PlugValueWidgets on # non-default rows. This keeps the ConnectionPlugValueWidgets in alignment. GafferUI.Spacer( imath.V2i( 11, 1 ) ) - label = GafferUI.Label( "Default", horizontalAlignment = GafferUI.HorizontalAlignment.Left ) + label = GafferUI.Label( _("Default"), horizontalAlignment = GafferUI.HorizontalAlignment.Left ) label._qtWidget().setFixedWidth( self.__labelWidth ) GafferUI.Spacer( imath.V2i( 25, 1 ) ) diff --git a/python/GafferUI/NodeEditor.py b/python/GafferUI/NodeEditor.py index fd3ef679781..987f68ac84b 100644 --- a/python/GafferUI/NodeEditor.py +++ b/python/GafferUI/NodeEditor.py @@ -43,6 +43,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n from Qt import QtWidgets @@ -59,7 +61,7 @@ def __init__( self, scriptNode, **kw ) : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, borderWidth=8, spacing=4 ) as self.__header : # NameLabel with a fixed formatter, to be used as a drag source. - self.__nameLabel = GafferUI.NameLabel( None, formatter = lambda graphComponents : "

Node Name

" ) + self.__nameLabel = GafferUI.NameLabel( None, formatter = lambda graphComponents : "

" + _("Node Name") + "

" ) # NameWidget to allow editing of the name. self.__nameWidget = GafferUI.NameWidget( None ) @@ -137,7 +139,8 @@ def _updateFromSet( self ) : self.__nameLabel.setGraphComponent( node ) self.__nameWidget.setGraphComponent( node ) - self.__typeLabel.setText( "

" + node.typeName().rpartition( ":" )[-1] + "

" ) + typeName = node.typeName().rpartition( ":" )[-1] + self.__typeLabel.setText( "

" + _i18n.getNodeLabel( typeName, node ) + "

" ) toolTip = "# " + node.typeName().rpartition( ":" )[2] description = Gaffer.Metadata.value( node, "description" ) @@ -152,7 +155,24 @@ def _updateFromSet( self ) : def _titleFormat( self ) : - return GafferUI.NodeSetEditor._titleFormat( self, _maxNodes = 1, _reverseNodes = True, _ellipsis = False ) + result = GafferUI.NodeSetEditor._titleFormat( self, _maxNodes = 1, _reverseNodes = True, _ellipsis = False ) + + # Insert translated type name before the instance name bracket + node = self._lastAddedNode() + if node is not None and _i18n.translateNodeNames() : + typeName = node.typeName().rpartition( ":" )[-1] + translated = _i18n.getNodeLabel( typeName, node ) + spaced = _i18n._camelToSpaced( typeName ) + if translated != spaced : + # Insert " – TranslatedType" before the " [" bracket + for i, item in enumerate( result ) : + if isinstance( item, str ) and item.strip() == "[" : + result.insert( i, " \u2013 " + translated ) + break + else : + result.append( " \u2013 " + translated ) + + return result def __infoButtonClicked( self, *unused ) : @@ -169,7 +189,7 @@ def __menuDefinition( self ) : url = Gaffer.Metadata.value( node, "documentation:url" ) result.append( - "/Documentation...", + "/" + _("Documentation..."), { "active" : bool( url ), "command" : functools.partial( GafferUI.showURL, url ), @@ -182,7 +202,7 @@ def __menuDefinition( self ) : result.append( "/DocumentationDivider", { "divider" : True } ) result.append( - "/Revert to Defaults", + "/" + _("Revert to Defaults"), { "command" : Gaffer.WeakMethod( self.__revertToDefaults ), "active" : not Gaffer.MetadataAlgo.readOnly( self.nodeUI().node() ), @@ -191,7 +211,7 @@ def __menuDefinition( self ) : readOnly = Gaffer.MetadataAlgo.getReadOnly( self.nodeUI().node() ) result.append( - "/Unlock" if readOnly else "/Lock", + "/" + _("Unlock") if readOnly else "/" + _("Lock"), { "command" : functools.partial( Gaffer.WeakMethod( self.__applyReadOnly ), not readOnly ), "active" : not Gaffer.MetadataAlgo.readOnly( self.nodeUI().node().parent() ), diff --git a/python/GafferUI/NodeFinderDialogue.py b/python/GafferUI/NodeFinderDialogue.py index 5f35ff61c62..d8ba5367ac5 100644 --- a/python/GafferUI/NodeFinderDialogue.py +++ b/python/GafferUI/NodeFinderDialogue.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class NodeFinderDialogue( GafferUI.Dialogue ) : @@ -51,7 +52,7 @@ def __init__( self, scope, **kw ) : # criteria row GafferUI.Label( - "Find", + _("Find"), parenting = { "index" : ( 0, 0 ), "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ), @@ -67,7 +68,7 @@ def __init__( self, scope, **kw ) : # match text row GafferUI.Label( - "Matching", + _("Matching"), parenting = { "index" : ( 0, 2 ), "alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ), @@ -83,9 +84,9 @@ def __init__( self, scope, **kw ) : self._setWidget( grid ) - self.__cancelButton = self._addButton( "Cancel" ) - self.__selectNextButton = self._addButton( "Select Next" ) - self.__selectAllButton = self._addButton( "Select All" ) + self.__cancelButton = self._addButton( _("Cancel") ) + self.__selectNextButton = self._addButton( _("Select Next") ) + self.__selectAllButton = self._addButton( _("Select All") ) self.__matchPattern.activatedSignal().connect( Gaffer.WeakMethod( self.__activated ) ) @@ -105,9 +106,9 @@ def setScope( self, scope ) : self.__scope = scope if isinstance( self.__scope, Gaffer.ScriptNode ) : - self.setTitle( "Find nodes" ) + self.setTitle( _("Find nodes") ) else : - self.setTitle( "Find nodes in %s" % self.__scope.getName() ) + self.setTitle( _("Find nodes in %s") % self.__scope.getName() ) def getScope( self ) : diff --git a/python/GafferUI/NodeSetEditor.py b/python/GafferUI/NodeSetEditor.py index e8724c879e6..e76af6d977e 100644 --- a/python/GafferUI/NodeSetEditor.py +++ b/python/GafferUI/NodeSetEditor.py @@ -39,6 +39,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore @@ -197,7 +198,7 @@ def _doPendingUpdate( self ) : def _titleFormat( self, _prefix = None, _maxNodes = 2, _reverseNodes = False, _ellipsis = True ) : if _prefix is None : - result = [ IECore.CamelCase.toSpaced( self.__class__.__name__ ) ] + result = [ _( IECore.CamelCase.toSpaced( self.__class__.__name__ ) ) ] else : result = [ _prefix ] diff --git a/python/GafferUI/NodeUI.py b/python/GafferUI/NodeUI.py index 62da0f837db..5fb15fc4367 100644 --- a/python/GafferUI/NodeUI.py +++ b/python/GafferUI/NodeUI.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ def __documentationURL( node ) : @@ -54,9 +55,9 @@ def __documentationURL( node ) : Gaffer.Node, "description", - """ + _(""" A container for plugs. - """, + """), "documentation:url", __documentationURL, "renameable", True, @@ -66,11 +67,11 @@ def __documentationURL( node ) : "user" : { "description" : - """ + _(""" Container for user-defined plugs. Nodes should never make their own plugs here, so users are free to do as they wish. - """, + """), "layout:index" : -1, # Last "layout:section" : "User", @@ -179,7 +180,7 @@ def appendPlugDeletionMenuDefinitions( plugOrPlugValueWidget, menuDefinition ) : if len( menuDefinition.items() ) : menuDefinition.append( "/DeleteDivider", { "divider" : True } ) - menuDefinition.append( "/Delete", { "command" : functools.partial( NodeUI.__deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) + menuDefinition.append( "/" + _("Delete"), { "command" : functools.partial( NodeUI.__deletePlug, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) } ) @staticmethod def __deletePlug( plug ) : diff --git a/python/GafferUI/PathChooserDialogue.py b/python/GafferUI/PathChooserDialogue.py index ddb3bb09bb9..fde9eae6064 100644 --- a/python/GafferUI/PathChooserDialogue.py +++ b/python/GafferUI/PathChooserDialogue.py @@ -37,6 +37,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class PathChooserDialogue( GafferUI.Dialogue ) : @@ -49,13 +50,13 @@ class PathChooserDialogue( GafferUI.Dialogue ) : # None : Accept both leaf and non-leaf paths # True : Accept only leaf paths # False : Accept only non-leaf paths - def __init__( self, path, title=None, cancelLabel="Cancel", confirmLabel="OK", allowMultipleSelection=False, valid=None, leaf=None, bookmarks=None, **kw ) : + def __init__( self, path, title=None, cancelLabel=_("Cancel"), confirmLabel=_("OK"), allowMultipleSelection=False, valid=None, leaf=None, bookmarks=None, **kw ) : if allowMultipleSelection : assert( valid != False ) if title is None : - title = "Select paths" if allowMultipleSelection else "Select path" + title = _("Select paths") if allowMultipleSelection else _("Select path") GafferUI.Dialogue.__init__( self, title, **kw ) diff --git a/python/GafferUI/PathChooserWidget.py b/python/GafferUI/PathChooserWidget.py index 92b27199d0d..9cc012a9c5c 100644 --- a/python/GafferUI/PathChooserWidget.py +++ b/python/GafferUI/PathChooserWidget.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class PathChooserWidget( GafferUI.Widget ) : @@ -66,7 +67,7 @@ def __init__( self, path, previewTypes=[], allowMultipleSelection=False, bookmar with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4, borderWidth = 8 ) : self.__displayModeButton = GafferUI.Button( image = "pathListingTree.png", hasFrame=False ) - self.__displayModeButton.setToolTip( "Toggle between list and tree views" ) + self.__displayModeButton.setToolTip( _("Toggle between list and tree views") ) self.__displayModeButton.clickedSignal().connect( Gaffer.WeakMethod( self.__displayModeButtonClicked ) ) self.__bookmarksButton = GafferUI.MenuButton( @@ -74,17 +75,17 @@ def __init__( self, path, previewTypes=[], allowMultipleSelection=False, bookmar hasFrame=False, menu = GafferUI.Menu( Gaffer.WeakMethod( self.__bookmarksMenuDefinition ) ), ) - self.__bookmarksButton.setToolTip( "Bookmarks" ) + self.__bookmarksButton.setToolTip( _("Bookmarks") ) self.__bookmarksButton.dragEnterSignal().connect( Gaffer.WeakMethod( self.__bookmarksButtonDragEnter ) ) self.__bookmarksButton.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__bookmarksButtonDragLeave ) ) self.__bookmarksButton.dropSignal().connect( Gaffer.WeakMethod( self.__bookmarksButtonDrop ) ) reloadButton = GafferUI.Button( image = "refresh.png", hasFrame=False ) - reloadButton.setToolTip( "Refresh view" ) + reloadButton.setToolTip( _("Refresh view") ) reloadButton.clickedSignal().connect( Gaffer.WeakMethod( self.__reloadButtonClicked ) ) upButton = GafferUI.Button( image = "pathUpArrow.png", hasFrame=False ) - upButton.setToolTip( "Up one level" ) + upButton.setToolTip( _("Up one level") ) upButton.clickedSignal().connect( Gaffer.WeakMethod( self.__upButtonClicked ) ) GafferUI.Spacer( imath.V2i( 2, 2 ) ) @@ -367,9 +368,9 @@ def __bookmarksMenuDefinition( self ) : m.append( "/SaveDeleteDivider", { "divider" : True } ) for name in self.__bookmarks.names( persistent=True ) : - m.append( "/Delete/" + name, { "command" : functools.partial( self.__bookmarks.remove, name ) } ) + m.append( "/" + _("Delete") + name, { "command" : functools.partial( self.__bookmarks.remove, name ) } ) - m.append( "/Add Bookmark...", { + m.append( "/" + _("Add Bookmark..."), { "command" : Gaffer.WeakMethod( self.__saveBookmark ), "active" : self.__dirPath.isValid() and str( self.__dirPath ) not in unbookmarkableLocations, } ) @@ -423,7 +424,7 @@ def __saveBookmark( self, path = None ) : path = self.__dirPath name = path[-1] if len( path ) else "Root" - d = GafferUI.TextInputDialogue( initialText=name, title="Save Bookmark", confirmLabel="Save" ) + d = GafferUI.TextInputDialogue( initialText=name, title=_("Save Bookmark"), confirmLabel=_("Save") ) name = d.waitForText( parentWindow = self.ancestor( GafferUI.Window ) ) if name is not None : diff --git a/python/GafferUI/PathListingWidget.py b/python/GafferUI/PathListingWidget.py index 538ac61391c..ce0ff0a4fcb 100644 --- a/python/GafferUI/PathListingWidget.py +++ b/python/GafferUI/PathListingWidget.py @@ -49,6 +49,7 @@ from ._HeaderView import _HeaderView from ._StyleSheet import _styleColors import GafferUI +from GafferUI.i18n import _ import Qt from Qt import QtCore @@ -65,9 +66,9 @@ class PathListingWidget( GafferUI.Widget ) : IconColumn = _GafferUI.IconPathColumn ## A collection of handy column definitions for FileSystemPaths - defaultNameColumn = StandardColumn( "Name", "name", GafferUI.PathColumn.SizeMode.Stretch ) - defaultFileSystemOwnerColumn = StandardColumn( "Owner", "fileSystem:owner" ) - defaultFileSystemModificationTimeColumn = StandardColumn( "Modified", "fileSystem:modificationTime" ) + defaultNameColumn = StandardColumn( _("Name"), "name", GafferUI.PathColumn.SizeMode.Stretch ) + defaultFileSystemOwnerColumn = StandardColumn( _("Owner"), "fileSystem:owner" ) + defaultFileSystemModificationTimeColumn = StandardColumn( _("Modified"), "fileSystem:modificationTime" ) defaultFileSystemIconColumn = GafferUI.FileIconPathColumn() defaultFileSystemColumns = ( diff --git a/python/GafferUI/PatternMatchUI.py b/python/GafferUI/PatternMatchUI.py index d996c545046..3947df0a1bf 100644 --- a/python/GafferUI/PatternMatchUI.py +++ b/python/GafferUI/PatternMatchUI.py @@ -37,16 +37,17 @@ import IECore import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.PatternMatch, "description", - """ + _(""" Tests an input string against a pattern, outputting true if the string matches. - """, + """), "nodeGadget:type", "GafferUI::AuxiliaryNodeGadget", "auxiliaryNodeGadget:label", "*", @@ -59,9 +60,9 @@ "string" : { "description" : - """ + _(""" The string to be tested. - """, + """), "nodule:type" : "", @@ -70,7 +71,7 @@ "pattern" : { "description" : - """ + _(""" The pattern to match the string against. This can use any of Gaffer's standard wildcards : @@ -83,7 +84,7 @@ | [a-z] | Matches any single character in a range | | [!a-z] | Matches any single character not in a range | | \\ | Escapes the next character | - """, + """), "nodule:type" : "", @@ -92,18 +93,18 @@ "enabled" : { "description" : - """ + _(""" Turns the node on and off. When off, `match` always outputs `false`. - """, + """), }, "match" : { "description" : - """ + _(""" Outputs `true` if the string matches the pattern, and `false` otherwise. - """, + """), "nodule:type" : "", diff --git a/python/GafferUI/PlugCreationWidget.py b/python/GafferUI/PlugCreationWidget.py index ee79b47a9d1..1382e4a1e3c 100644 --- a/python/GafferUI/PlugCreationWidget.py +++ b/python/GafferUI/PlugCreationWidget.py @@ -44,6 +44,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + ## Supports the following metadata registered to the parent node or plug : # # - `plugCreationWidget:includedTypes` : Filters the types of plugs which @@ -74,7 +76,7 @@ def __init__( self, plugParent, **kw ) : image = "plus.png", hasFrame = False, menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ) ), - toolTip = "Click to add plugs", + toolTip = _("Click to add plugs"), immediate = True, ) @@ -260,7 +262,7 @@ def appendDivider( menuPath ) : self.plugCreationMenuSignal()( result, self ) if not result.size() : - result.append( "/All Types Excluded", { "active" : False } ) + result.append( "/" + _("All Types Excluded"), { "active" : False } ) return result @@ -321,7 +323,7 @@ def __dataDropHandler( plugCreationWidget, dragDropEvent ) : plug.setName( plug.typeName().rpartition( ":" )[2] ) if plug is None or not plugCreationWidget.__plugTypeIncluded( type( plug ) ) : - GafferUI.PopupWindow.showWarning( "Unsupported data type", parent = plugCreationWidget ) + GafferUI.PopupWindow.showWarning( _("Unsupported data type"), parent = plugCreationWidget ) return plugCreationWidget.createPlug( plug ) @@ -337,7 +339,7 @@ def __plugDropHandler( plugCreationWidget, dragDropEvent ) : plug = plug["value"] if not plugCreationWidget.__plugTypeIncluded( type( plug ) ) : - GafferUI.PopupWindow.showWarning( "Unsupported type", parent = plugCreationWidget ) + GafferUI.PopupWindow.showWarning( _("Unsupported type"), parent = plugCreationWidget ) return plugCreationWidget.createPlug( plug.createCounterpart( dragDropEvent.data.getName(), Gaffer.Plug.Direction.In ), name = name ) diff --git a/python/GafferUI/PlugLayout.py b/python/GafferUI/PlugLayout.py index 7282139cdd8..5e2444643d2 100644 --- a/python/GafferUI/PlugLayout.py +++ b/python/GafferUI/PlugLayout.py @@ -46,6 +46,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtWidgets @@ -801,7 +802,7 @@ def update( self, section, revealChildren ) : updatedTabs = collections.OrderedDict() updatedTabVisibilities = [] for name, subsection in section.subsections.items() : - tab = existingTabs.get( name ) + tab = existingTabs.get( _(name) ) if tab is None : # Use scroll bars only when the TabLayout is not embedded if self.__embedded : @@ -815,13 +816,13 @@ def update( self, section, revealChildren ) : tab.setChild( _CollapsibleLayout( self.orientation() ) ) updatedTabVisibilities.append( tab.getChild().update( subsection, revealChildren ) ) - updatedTabs[name] = tab + updatedTabs[_(name)] = tab if existingTabs.keys() != updatedTabs.keys() : with Gaffer.Signals.BlockedConnection( self.__currentTabChangedConnection ) : del self.__tabbedContainer[:] - for name, tab in updatedTabs.items() : - self.__tabbedContainer.append( tab, label = name ) + for translatedName, tab in updatedTabs.items() : + self.__tabbedContainer.append( tab, label = translatedName ) for index, subsection in enumerate( section.subsections.values() ) : self.__tabbedContainer.setTabVisible( self.__tabbedContainer[index], updatedTabVisibilities[index] ) @@ -865,7 +866,7 @@ def update( self, section, revealChildren ) : collapsible = self.__collapsibles.get( name ) if collapsible is None : - collapsible = GafferUI.Collapsible( name, _CollapsibleLayout( self.orientation() ), collapsed = True ) + collapsible = GafferUI.Collapsible( _(name), _CollapsibleLayout( self.orientation() ), collapsed = True ) # Hack to add margins at the top and bottom but not at the sides. ## \todo This is exposed in the public API via the borderWidth # parameter to the Collapsible. That parameter sucks because a) it diff --git a/python/GafferUI/PlugPopup.py b/python/GafferUI/PlugPopup.py index 791d38a934b..7406f354427 100644 --- a/python/GafferUI/PlugPopup.py +++ b/python/GafferUI/PlugPopup.py @@ -38,6 +38,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n from GafferUI.PlugValueWidget import sole @@ -68,9 +70,8 @@ def __init__( self, plugs, title = None, warning = None, **kw ) : if len( plugs ) > 1 : nodes = { Gaffer.MetadataAlgo.firstViewableNode( plug ) for plug in plugs } - plugSummary = "{} plugs{}".format( - len( plugs ), - " on {} nodes".format( len( nodes ) ) if len( nodes ) > 1 else "" + plugSummary = _("{} plugs").format( len( plugs ) ) + ( + _(" on {} nodes").format( len( nodes ) ) if len( nodes ) > 1 else "" ) for plug in plugs[1:] : @@ -81,7 +82,7 @@ def __init__( self, plugs, title = None, warning = None, **kw ) : plugSummary = "" target = "{}".format( commonNode.relativeName( script ) ) if script.isAncestorOf( commonNode ) else "" - title = "Editing {}{}".format( + title = _("Editing {}{}").format( target, " ({})".format( plugSummary ) if plugSummary != "" and target != "" else plugSummary ) @@ -114,7 +115,7 @@ def __init__( self, plugs, title = None, warning = None, **kw ) : GafferUI.PlugValueWidget.MultiplePlugTypesError ) as e : self.__plugValueWidget = None - GafferUI.Label( "Unable to edit plugs with mixed types" ) + GafferUI.Label( _("Unable to edit plugs with mixed types") ) e.__traceback__ = None # If we have a ColorPlugValueWidget, expand it to show the chooser. diff --git a/python/GafferUI/PlugValueWidget.py b/python/GafferUI/PlugValueWidget.py index 71a116a3683..001c2a72933 100644 --- a/python/GafferUI/PlugValueWidget.py +++ b/python/GafferUI/PlugValueWidget.py @@ -46,6 +46,8 @@ import Gaffer import GafferUI +from GafferUI import i18n as _i18n +from GafferUI.i18n import _ ## Base class for widgets which can display and optionally edit one or # more ValuePlugs. The base class automatically tracks changes to plug @@ -183,21 +185,25 @@ def getToolTip( self ) : # Name if len( self.getPlugs() ) == 1 : - result = "# " + self.getPlug().relativeName( self.getPlug().node() ) + rawName = self.getPlug().relativeName( self.getPlug().node() ) + translatedName = ".".join( _i18n.translateLabel( part ) for part in rawName.split( "." ) ) + result = "# " + translatedName else : - result = "# {} plugs".format( len( self.getPlugs() ) ) + result = "# {} ".format( len( self.getPlugs() ) ) + _("plugs") # Input if len( self.getPlugs() ) == 1 : input = self.getPlug().getInput() if input is not None : - result += "\n\nInput : {}".format( input.relativeName( input.commonAncestor( self.getPlug() ) ) ) + result += "\n\n" + _("Input") + " : {}".format( input.relativeName( input.commonAncestor( self.getPlug() ) ) ) # Description description = sole( Gaffer.Metadata.value( p, "description" ) for p in self.getPlugs() ) if description : + if _i18n.translateTooltips() : + description = _( description ) result += "\n\n" + description return result @@ -463,7 +469,7 @@ def _popupMenuDefinition( self ) : applicationRoot = sole( p.ancestor( Gaffer.ApplicationRoot ) for p in self.getPlugs() ) menuDefinition.append( - "/Copy Value", { + "/" + _("Copy Value") + "", { "command" : Gaffer.WeakMethod( self.__copyValue ), "active" : len( self.getPlugs() ) == 1 and applicationRoot is not None } @@ -474,7 +480,7 @@ def _popupMenuDefinition( self ) : pasteValue = self._convertValue( applicationRoot.getClipboardContents() ) menuDefinition.append( - "/Paste Value", { + "/" + _("Paste Value") + "", { "command" : functools.partial( Gaffer.WeakMethod( self.__setValues ), pasteValue ), "active" : self._editable() and pasteValue is not None } @@ -483,17 +489,17 @@ def _popupMenuDefinition( self ) : menuDefinition.append( "/CopyPasteDivider", { "divider" : True } ) if any( p.getInput() is not None for p in self.getPlugs() ) : - menuDefinition.append( "/Edit input...", { "command" : Gaffer.WeakMethod( self.__editInputs ) } ) + menuDefinition.append( "/" + _("Edit input..."), { "command" : Gaffer.WeakMethod( self.__editInputs ) } ) menuDefinition.append( "/EditInputDivider", { "divider" : True } ) menuDefinition.append( - "/Remove input", { + "/" + _("Remove input") + "", { "command" : Gaffer.WeakMethod( self.__removeInputs ), "active" : all( p.acceptsInput( None ) and not Gaffer.MetadataAlgo.readOnly( p ) for p in self.getPlugs() ), } ) if all( hasattr( p, "defaultValue" ) and p.direction() == Gaffer.Plug.Direction.In for p in self.getPlugs() ) : menuDefinition.append( - "/Default", { + "/" + _("Default") + "", { "command" : functools.partial( Gaffer.WeakMethod( self.__setValues ), [ p.defaultValue() for p in self.getPlugs() ] ), "active" : self._editable() } @@ -501,7 +507,7 @@ def _popupMenuDefinition( self ) : if all( Gaffer.NodeAlgo.hasUserDefault( p ) and p.direction() == Gaffer.Plug.Direction.In for p in self.getPlugs() ) : menuDefinition.append( - "/User Default", { + "/" + _("User Default") + "", { "command" : Gaffer.WeakMethod( self.__applyUserDefaults ), "active" : self._editable() } @@ -510,7 +516,7 @@ def _popupMenuDefinition( self ) : with self.context() : if any( Gaffer.NodeAlgo.presets( p ) for p in self.getPlugs() ) : menuDefinition.append( - "/Preset", { + "/" + _("Preset") + "", { "subMenu" : Gaffer.WeakMethod( self.__presetsSubMenu ), "active" : self._editable() } @@ -521,7 +527,7 @@ def _popupMenuDefinition( self ) : readOnly = any( Gaffer.MetadataAlgo.getReadOnly( p ) for p in self.getPlugs() ) menuDefinition.append( - "/Unlock" if readOnly else "/Lock", + "/" + _("Unlock") if readOnly else "/" + _("Lock"), { "command" : functools.partial( Gaffer.WeakMethod( self.__applyReadOnly ), not readOnly ), "active" : not any( Gaffer.MetadataAlgo.readOnly( p.parent() ) for p in self.getPlugs() ), diff --git a/python/GafferUI/PlugWidget.py b/python/GafferUI/PlugWidget.py index 998f1677879..c6969546475 100644 --- a/python/GafferUI/PlugWidget.py +++ b/python/GafferUI/PlugWidget.py @@ -35,6 +35,7 @@ # ########################################################################## +import os import warnings import Gaffer @@ -43,6 +44,8 @@ from Qt import QtCore from Qt import QtWidgets +_GAFFER_LANG = os.environ.get( "GAFFER_LANG", "en" ) + ## The PlugWidget combines a LabelPlugValueWidget with a second PlugValueWidget ## suitable for editing the plug. ## \todo This could provide functionality for arbitrary Widgets to be placed @@ -117,6 +120,8 @@ def labelPlugValueWidget( self ) : @staticmethod def labelWidth() : + if _GAFFER_LANG != "en" : + return 195 return 150 ## Ensures that the specified plug has a visible PlugWidget, diff --git a/python/GafferUI/PreferencesUI.py b/python/GafferUI/PreferencesUI.py index a2fee43df5a..9b502641497 100644 --- a/python/GafferUI/PreferencesUI.py +++ b/python/GafferUI/PreferencesUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Preferences, "description", - """ + _(""" A container for application preferences. - """, + """), plugs = { diff --git a/python/GafferUI/PresetsPlugValueWidget.py b/python/GafferUI/PresetsPlugValueWidget.py index 0dce2f2c87d..c23bbef8e5d 100644 --- a/python/GafferUI/PresetsPlugValueWidget.py +++ b/python/GafferUI/PresetsPlugValueWidget.py @@ -41,6 +41,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -97,13 +98,13 @@ def _updateFromValues( self, values, exception ) : if exception is not None : self.__menuButton.setText( "" ) elif isCustom : - self.__menuButton.setText( "Custom" ) + self.__menuButton.setText( _("Custom") ) elif self.__currentPreset : - self.__menuButton.setText( self.__currentPreset ) + self.__menuButton.setText( _(self.__currentPreset) ) elif self.__currentPreset is None : self.__menuButton.setText( "---" ) else : - self.__menuButton.setText( "Invalid" ) + self.__menuButton.setText( _("Invalid") ) self.__menuButton.setErrored( exception is not None ) diff --git a/python/GafferUI/PythonEditor.py b/python/GafferUI/PythonEditor.py index 79a542fccc6..b4efd637f99 100644 --- a/python/GafferUI/PythonEditor.py +++ b/python/GafferUI/PythonEditor.py @@ -47,6 +47,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtWidgets from Qt import QtCore @@ -244,7 +245,7 @@ def __contextMenu( self, widget ) : if widget is self.inputWidget() : definition.append( - "/Execute Selection" if widget.selectedText() else "/Execute", + "/" + _("Execute Selection") if widget.selectedText() else "/" + _("Execute"), { "command" : Gaffer.WeakMethod( self.execute ), "shortCut" : "Enter", @@ -254,7 +255,7 @@ def __contextMenu( self, widget ) : definition.append( "/ExecuteDivider", { "divider" : True } ) definition.append( - "/Copy", + "/" + _("Copy"), { "command" : functools.partial( self.scriptNode().ancestor( Gaffer.ApplicationRoot ).setClipboardContents, @@ -266,7 +267,7 @@ def __contextMenu( self, widget ) : if widget is self.inputWidget() : definition.append( - "/Paste", + "/" + _("Paste"), { "command" : functools.partial( widget.insertText, @@ -279,7 +280,7 @@ def __contextMenu( self, widget ) : definition.append( "/CopyPasteDivider", { "divider" : True } ) definition.append( - "/Select All", + "/" + _("Select All"), { "command" : widget._qtWidget().selectAll, "active" : bool( widget.getText() ) @@ -289,7 +290,7 @@ def __contextMenu( self, widget ) : definition.append( "/SelectDivider", { "divider" : True } ) definition.append( - "/Clear", + "/" + _("Clear"), { "command" : functools.partial( widget.setText, "" ), "active" : bool( widget.getText() ) diff --git a/python/GafferUI/RampPlugValueWidget.py b/python/GafferUI/RampPlugValueWidget.py index 13c4584765c..2ee1a6618a1 100644 --- a/python/GafferUI/RampPlugValueWidget.py +++ b/python/GafferUI/RampPlugValueWidget.py @@ -36,6 +36,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import imath import IECore @@ -52,7 +53,7 @@ def __init__( self, plug, **kw ) : with column : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) : - GafferUI.Label( "Display Mode" ) + GafferUI.Label( _("Display Mode") ) drawModeWidget = GafferUI.MultiSelectionMenu( allowMultipleSelection = False, allowEmptySelection = False ) drawModeWidget.append( "Ramp" ) drawModeWidget.append( "Curves" ) @@ -222,8 +223,8 @@ def __selectedIndexChanged( self, slider ) : self.__valueLabel.setPlug( None ) self.__valueField.setPlug( None ) - self.__positionLabel.label().setText( "Position" ) - self.__valueLabel.label().setText( "Value" ) + self.__positionLabel.label().setText( _("Position") ) + self.__valueLabel.label().setText( _("Value") ) # we don't register this automatically for any plugs, as it takes up a lot of room # in the node editor. this means the SplinePlugValueWidget will be used instead, and diff --git a/python/GafferUI/RandomChoiceUI.py b/python/GafferUI/RandomChoiceUI.py index f187ca6259b..5cac689771b 100644 --- a/python/GafferUI/RandomChoiceUI.py +++ b/python/GafferUI/RandomChoiceUI.py @@ -41,20 +41,21 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.RandomChoice, "description", - """ + _(""" Chooses random values from a list of choices, with optional weights to specify the relative probability of each choice. The randomness is generated from a seed and a context variable; to get useful variation either the seed or the value of the context variable must be varied too. - """, + """), "nodeGadget:type", "GafferUI::AuxiliaryNodeGadget", "auxiliaryNodeGadget:label", "r", @@ -83,26 +84,26 @@ "seed" : { "description" : - """ + _(""" Seed for the random number generator. Different seeds produce different random numbers. When controlling two different properties using the same context variable, different seeds may be used to ensure that the generated values are different. - """, + """), }, "seedVariable" : { "description" : - """ + _(""" The most important plug for achieving interesting variation. Should be set to the name of a context variable which will be different for each evaluation of the node. Good examples are `scene:path` to generate a different value per scene location, or `frame` to generate a different value per frame. - """, + """), "preset:Time" : "frame", "preset:Scene Location" : "scene:path", @@ -112,9 +113,9 @@ "choices" : { "description" : - """ + _(""" The choices that will be randomly selected between based on the seed. - """, + """), "plugValueWidget:type" : "GafferUI.VectorDataPlugValueWidget", @@ -125,10 +126,10 @@ "choices.values" : { "description" : - """ + _(""" The list of values for the choices. Use the `choices.weights` plug to assign a relative probability to each choice. - """, + """), "vectorDataPlugValueWidget:header" : "Value", @@ -137,10 +138,10 @@ "choices.weights" : { "description" : - """ + _(""" The list of weights for the choices. Choices with a higher weight have a greater chance of being chosen. - """, + """), "vectorDataPlugValueWidget:header" : "Weight", "vectorDataPlugValueWidget:index" : -1, @@ -151,9 +152,9 @@ "out" : { "description" : - """ + _(""" Outputs a random choice from the `choices` plug. - """, + """), } @@ -200,9 +201,9 @@ def __popupMenu( menuDefinition, plugValueWidget ) : item = { "command" : functools.partial( __createRandomChoice, list( plugValueWidget.getPlugs() ) ) } try : - menuDefinition.insertAfter( "/Randomise (Choice)...", item, "/Randomise..." ) + menuDefinition.insertAfter( "/" + _("Randomise (Choice)..."), item, "/" + _("Randomise...") ) except KeyError : menuDefinition.prepend( "/RandomiseDivider", { "divider" : True } ) - menuDefinition.prepend( "/Randomise...", item ) + menuDefinition.prepend( "/" + _("Randomise..."), item ) GafferUI.PlugValueWidget.popupMenuSignal().connect( __popupMenu ) diff --git a/python/GafferUI/RandomUI.py b/python/GafferUI/RandomUI.py index ffc70eb2983..3b78f23be23 100644 --- a/python/GafferUI/RandomUI.py +++ b/python/GafferUI/RandomUI.py @@ -40,13 +40,14 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Random, "description", - """ + _(""" Generates repeatable random values from a seed. This can be very useful for the procedural generation of variation. Numeric or colour values may be generated. @@ -54,7 +55,7 @@ The random values are generated from a seed and a Context Variable - to get useful variation either the seed or the value of the Context Variable must be varied too. - """, + """), "nodeGadget:type", "GafferUI::AuxiliaryNodeGadget", "auxiliaryNodeGadget:label", "r", @@ -65,26 +66,26 @@ "seed" : { "description" : - """ + _(""" Seed for the random number generator. Different seeds produce different random numbers. When controlling two different properties using the same Context Variable, different seeds may be used to ensure that the generated values are different. - """, + """), }, "seedVariable" : { "description" : - """ + _(""" The most important plug for achieving interesting variation. Should be set to the name of a Context Variable which will be different for each evaluation of the node. Good examples are "scene:path" to generate a different value per scene location, or "frame" to generate a different value per frame. - """, + """), "preset:Time" : "frame", "preset:Scene Location" : "scene:path", @@ -94,59 +95,59 @@ "floatRange" : { "description" : - """ + _(""" The minimum and maximum values that will be generated for the outFloat plug. - """, + """), }, "baseColor" : { "description" : - """ + _(""" Used as the basis for the random colours generated for the outColor plug. All colours start with this value and then have a random HSV variation applied, using the ranges specified below. - """, + """), }, "hue" : { "description" : - """ + _(""" The +- range over which the hue of the base colour is varied. - """, + """), }, "saturation" : { "description" : - """ + _(""" The +- range over which the saturation of the base colour is varied. - """, + """), }, "value" : { "description" : - """ + _(""" The +- range over which the value of the base colour is varied. - """, + """), }, "outFloat" : { "description" : - """ + _(""" Random floating point output derived from seed, Context Variable and float range plugs. - """, + """), "layout:section" : "Settings.Outputs", @@ -155,10 +156,10 @@ "outColor" : { "description" : - """ + _(""" Random colour output derived from seed, Context Variable, base colour, hue, saturation and value plugs. - """, + """), "layout:section" : "Settings.Outputs", @@ -254,7 +255,7 @@ def __popupMenu( menuDefinition, plugValueWidget ) : if input is None and plugValueWidget._editable() : menuDefinition.prepend( "/RandomiseDivider", { "divider" : True } ) menuDefinition.prepend( - "/Randomise...", + "/" + _("Randomise..."), { "command" : functools.partial( __createRandom, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ), diff --git a/python/GafferUI/ReferenceUI.py b/python/GafferUI/ReferenceUI.py index 57aba36d988..8a37602b95b 100644 --- a/python/GafferUI/ReferenceUI.py +++ b/python/GafferUI/ReferenceUI.py @@ -41,20 +41,21 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Reference, "description", - """ + _(""" References a node network stored in another file. This can be used to share resources among scripts, build powerful non-linear workflows, and as the basis for custom asset management. To generate a file to be referenced, build a network inside a Box node and then export it for referencing. - """, + """), "icon", "referenceNode.png", @@ -105,17 +106,17 @@ def __init__( self, node, **kw ) : with row : - label = GafferUI.Label( "File", horizontalAlignment = GafferUI.Label.HorizontalAlignment.Right ) + label = GafferUI.Label( _("File"), horizontalAlignment = GafferUI.Label.HorizontalAlignment.Right ) label._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) self.__textWidget = GafferUI.TextWidget( node.fileName().as_posix() if node.fileName() is not None else "", editable = False ) loadButton = GafferUI.Button( image = "pathChooser.png", hasFrame=False ) - loadButton.setToolTip( "Load" ) + loadButton.setToolTip( _("Load") ) loadButton.clickedSignal().connect( Gaffer.WeakMethod( self.__loadClicked ) ) self.__reloadButton = GafferUI.Button( image = "refresh.png", hasFrame=False ) - self.__reloadButton.setToolTip( "Reload" ) + self.__reloadButton.setToolTip( _("Reload") ) self.__reloadButton.clickedSignal().connect( Gaffer.WeakMethod( self.__reloadClicked ) ) node.referenceLoadedSignal().connect( Gaffer.WeakMethod( self.__referenceLoaded ) ) @@ -155,7 +156,7 @@ def _waitForFileName( initialFilePath=None, parentWindow=None ) : path.setFilter( Gaffer.FileSystemPath.createStandardFilter( [ "grf" ] ) ) - dialogue = GafferUI.PathChooserDialogue( path, title = "Load reference", confirmLabel = "Load", valid = True, leaf = True, bookmarks = bookmarks ) + dialogue = GafferUI.PathChooserDialogue( path, title = _("Load reference"), confirmLabel = _("Load"), valid = True, leaf = True, bookmarks = bookmarks ) path = dialogue.waitForPath( parentWindow = parentWindow ) if not path : @@ -165,7 +166,7 @@ def _waitForFileName( initialFilePath=None, parentWindow=None ) : def _load( node, filePath, parentWindow ) : - with GafferUI.ErrorDialogue.ErrorHandler( title = "Errors Occurred During Loading", closeLabel = "Oy vey", parentWindow = parentWindow ) : + with GafferUI.ErrorDialogue.ErrorHandler( title = _("Errors Occurred During Loading"), closeLabel = "Oy vey", parentWindow = parentWindow ) : node.load( filePath ) ########################################################################## @@ -186,7 +187,7 @@ def __duplicateAsBox( graphEditor, node ) : temporaryScript.addChild( box ) with GafferUI.ErrorDialogue.ErrorHandler( - title = "Errors Occurred During Loading", + title = _("Errors Occurred During Loading"), closeLabel = "Oy vey", parentWindow = graphEditor.ancestor( GafferUI.Window ), ) : @@ -209,7 +210,7 @@ def __graphEditorNodeContextMenu( graphEditor, node, menuDefinition ) : return menuDefinition.append( - "/Duplicate as Box", + "/" + _("Duplicate as Box"), { "command" : functools.partial( __duplicateAsBox, graphEditor, node ), "active" : bool( node.fileName() ), diff --git a/python/GafferUI/ScriptNodeUI.py b/python/GafferUI/ScriptNodeUI.py index 2b2379ee7e6..c05d6865e7f 100644 --- a/python/GafferUI/ScriptNodeUI.py +++ b/python/GafferUI/ScriptNodeUI.py @@ -37,16 +37,17 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.ScriptNode, "description", - """ + _(""" Defines a "script" - a Gaffer node network which can be saved to disk as a ".gfr" file and reloaded. - """, + """), "ui:childNodesAreViewable", True, @@ -57,19 +58,19 @@ "fileName" : { "description" : - """ + _(""" Where the script is stored. - """, + """), }, "unsavedChanges" : { "description" : - """ + _(""" Indicates whether or not the script has been modified since it was last saved. - """, + """), "plugValueWidget:type" : "", @@ -78,13 +79,13 @@ "frameRange" : { "description" : - """ + _(""" Defines the start and end frames for the script. These don't enforce anything, but are typically used by dispatchers to control default frame ranges, and by the UI to define the range of the time slider. - """, + """), "plugValueWidget:type" : "GafferUI.CompoundNumericPlugValueWidget", @@ -93,31 +94,31 @@ "frameRange.start" : { "description" : - """ + _(""" The start frame. This doesn't enforce anything, but is typically used by dispatchers to control default frame ranges, and by the UI to define the range of the time slider. - """, + """), }, "frameRange.end" : { "description" : - """ + _(""" The end frame. This doesn't enforce anything, but is typically used by dispatchers to control default frame ranges, and by the UI to define the range of the time slider. - """, + """), }, "frame" : { "description" : - """ + _(""" The current frame. > Note : To perform a computation at a particular time, @@ -133,7 +134,7 @@ > Likewise, you should never refer to this plug from > an expression. Always retrieve the frame with > `context.getFrame()` instead. - """, + """), "layout:visibilityActivator" : "hidden", @@ -142,20 +143,20 @@ "framesPerSecond" : { "description" : - """ + _(""" The framerate used to convert between the current frame number and the time in seconds. - """, + """), }, "variables" : { "description" : - """ + _(""" Container for user-defined variables which can be used in expressions anywhere in the script. - """, + """), "layout:section" : "Variables", diff --git a/python/GafferUI/ScriptWindow.py b/python/GafferUI/ScriptWindow.py index 88307cdbbf6..95bc2bd78e5 100644 --- a/python/GafferUI/ScriptWindow.py +++ b/python/GafferUI/ScriptWindow.py @@ -44,6 +44,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + class ScriptWindow( GafferUI.Window ) : def __init__( self, script, **kw ) : @@ -146,15 +148,15 @@ def _acceptsClose( self ) : f = f.rpartition( "/" )[2] if f else "untitled" dialogue = _ChoiceDialogue( - "Discard Unsaved Changes?", - f"The file \"{f}\" has unsaved changes. Do you want to discard them?", - choices = [ "Cancel", "Save", "Discard" ] + _( "Discard Unsaved Changes?" ), + _( "The file \"{file}\" has unsaved changes. Do you want to discard them?" ).format( file = f ), + choices = [ _( "Cancel" ), _( "Save" ), _( "Discard" ) ] ) choice = dialogue.waitForChoice( parentWindow=self ) - if choice == "Discard" : + if choice == _( "Discard" ) : return True - elif choice == "Save" : + elif choice == _( "Save" ) : ## \todo Is it a bit odd that ScriptWindow should depend on FileMenu # like this? Should the code be moved somewhere else? GafferUI.FileMenu.save( self.menuBar() ) diff --git a/python/GafferUI/ShufflePlugValueWidget.py b/python/GafferUI/ShufflePlugValueWidget.py index c9c58d61e8c..f1d44c7eddb 100644 --- a/python/GafferUI/ShufflePlugValueWidget.py +++ b/python/GafferUI/ShufflePlugValueWidget.py @@ -44,6 +44,7 @@ import GafferUI from Qt import QtWidgets +from GafferUI.i18n import _ ########################################################################## # ShufflePlug Widget @@ -136,19 +137,19 @@ def _updateFromValues( self, values, exception ) : # ShufflePlug Metadata ########################################################################## -Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "source", "description", "The name(s) of the source data to be shuffled. Accepts standard matching syntax (eg \"a*b\")." ) +Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "source", "description", _("""The name(s) of the source data to be shuffled. Accepts standard matching syntax (eg \")a*b\").""") ) Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "destination", "description", - """ + _(""" The name of the destination data to be created. Use `${source}` to insert the name of the source data. For example, to prepend `prefix:` set the destination to `prefix:${source}`. - """ + """) ) -Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "deleteSource", "description", "Enable to delete the source data after shuffling to the destination(s)." ) -Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "replaceDestination", "description", "Enable to replace already written destination data with the same name as destination(s)." ) -Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "enabled", "description", "Used to enable/disable this shuffle operation." ) +Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "deleteSource", "description", _("Enable to delete the source data after shuffling to the destination(s).") ) +Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "replaceDestination", "description", _("Enable to replace already written destination data with the same name as destination(s).") ) +Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "enabled", "description", _("Used to enable/disable this shuffle operation.") ) Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "nodule:type", "" ) Gaffer.Metadata.registerValue( Gaffer.ShufflePlug, "*", "nodule:type", "" ) @@ -167,11 +168,11 @@ def __init__( self, plug ) : with column : with GafferUI.ListContainer( GafferUI.ListContainer.Orientation.Horizontal, spacing = 4 ) : - GafferUI.Label( "

Source

" )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) + GafferUI.Label( _("

Source

") )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) GafferUI.Spacer( imath.V2i( 25, 2 ) ) # approximate width of a BoolWidget Switch - GafferUI.Label( "

Destination

" )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) - GafferUI.Label( "

Delete Source

" )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() - 40 ) - GafferUI.Label( "

Replace

" )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) + GafferUI.Label( _("

Destination

") )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) + GafferUI.Label( _("

Delete Source

") )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() - 40 ) + GafferUI.Label( _("

Replace

") )._qtWidget().setFixedWidth( GafferUI.PlugWidget.labelWidth() ) self.__plugLayout = GafferUI.PlugLayout( plug ) self.__addButton = GafferUI.Button( image = "plus.png", hasFrame = False ) diff --git a/python/GafferUI/SpreadsheetUI/_Algo.py b/python/GafferUI/SpreadsheetUI/_Algo.py index 8a3d0fe46d7..e193dcf3f6a 100644 --- a/python/GafferUI/SpreadsheetUI/_Algo.py +++ b/python/GafferUI/SpreadsheetUI/_Algo.py @@ -36,6 +36,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from ._SectionChooser import _SectionChooser @@ -151,17 +152,17 @@ def connectPlugToRowNames( enabledRowNamesConnection, selectorContextVariablePlu existingSelector = spreadsheet["selector"].getValue() if existingSelector and selectorValue and existingSelector != selectorValue : - message = "{sheetName}'s selector is set to: '{sheetSelector}'.\n\n" + \ + message = _("{sheetName}'s selector is set to: '{sheetSelector}'.\n\n" + \ "The '{plugName}' plug requires a different selector to work\n" + \ - "properly. Continuing will reset the selector to '{selector}'." + "properly. Continuing will reset the selector to '{selector}'.") confirm = GafferUI.ConfirmationDialogue( - "Invalid Selector", + _("Invalid Selector"), message.format( sheetName = spreadsheet.getName(), sheetSelector = existingSelector, plugName = enabledRowNamesConnection.getName(), selector = selectorValue ), - confirmLabel = "Continue" + confirmLabel = _("Continue") ) if not confirm.waitForConfirmation( parentWindow = menu.ancestor( GafferUI.Window ) ) : diff --git a/python/GafferUI/SpreadsheetUI/_CellPlugValueWidget.py b/python/GafferUI/SpreadsheetUI/_CellPlugValueWidget.py index d4c9a1b6c14..2be5075692f 100644 --- a/python/GafferUI/SpreadsheetUI/_CellPlugValueWidget.py +++ b/python/GafferUI/SpreadsheetUI/_CellPlugValueWidget.py @@ -44,6 +44,7 @@ from GafferUI.PlugValueWidget import sole from . import _Algo +from GafferUI.i18n import _ class _CellPlugValueWidget( GafferUI.PlugValueWidget ) : @@ -76,11 +77,11 @@ def __init__( self, plugOrPlugs, **kw ) : self.__applyFixedWidths( plugValueWidget ) self.__row.append( plugValueWidget ) else : - self.__row.append( GafferUI.Label( "Unable to edit multiple plugs of this type" ) ) + self.__row.append( GafferUI.Label( _("Unable to edit multiple plugs of this type") ) ) addCellEnabledSwitch = True else : - self.__row.append( GafferUI.Label( "Unable to edit plugs with mixed types" ) ) + self.__row.append( GafferUI.Label( _("Unable to edit plugs with mixed types") ) ) addCellEnabledSwitch = True if addCellEnabledSwitch : diff --git a/python/GafferUI/SpreadsheetUI/_Menus.py b/python/GafferUI/SpreadsheetUI/_Menus.py index 380fa4dbc30..b31756a1669 100644 --- a/python/GafferUI/SpreadsheetUI/_Menus.py +++ b/python/GafferUI/SpreadsheetUI/_Menus.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from . import _Algo from ._RowsPlugValueWidget import _RowsPlugValueWidget @@ -88,6 +89,7 @@ def __spreadsheetSubMenu( plug, command, showSections = True ) : "/No Spreadsheets Available", { "active" : False, + "label" : _("No Spreadsheets Available"), } ) return menuDefinition @@ -119,13 +121,13 @@ def addItems( spreadsheet ) : ) if alreadyConnected and other : - menuDefinition.append( "/__ConnectedDivider__", { "divider" : True, "label" : "Connected" } ) + menuDefinition.append( "/__ConnectedDivider__", { "divider" : True, "label" : _("Connected") } ) for spreadsheet in alreadyConnected : addItems( spreadsheet ) if alreadyConnected and other : - menuDefinition.append( "/__OtherDivider__", { "divider" : True, "label" : "Other" } ) + menuDefinition.append( "/__OtherDivider__", { "divider" : True, "label" : _("Other") } ) for spreadsheet in other : addItems( spreadsheet ) @@ -167,13 +169,15 @@ def __prependSpreadsheetCreationMenuItems( menuDefinition, plugValueWidget ) : menuDefinition.prepend( "/Add to Spreadsheet{}".format( suffix ), { - "subMenu" : functools.partial( __spreadsheetSubMenu, plug, functools.partial( _Algo.addToSpreadsheet, plug ) ) + "subMenu" : functools.partial( __spreadsheetSubMenu, plug, functools.partial( _Algo.addToSpreadsheet, plug ) ), + "label" : _("Add to Spreadsheet") + suffix, } ) menuDefinition.prepend( "/Create Spreadsheet{}...".format( suffix ), { - "command" : functools.partial( _Algo.createSpreadsheet, plug ) + "command" : functools.partial( _Algo.createSpreadsheet, plug ), + "label" : _("Create Spreadsheet") + suffix + "...", } ) @@ -225,7 +229,8 @@ def __nodeEditorToolMenu( nodeEditor, node, menuDefinition ) : "/Create Spreadsheet...", { "command" : functools.partial( _Algo.createSpreadsheetForNode, node, enabledRowNamesConnection, selectorContextVariablePlug, selectorValue ), - "active" : itemsActive + "active" : itemsActive, + "label" : _("Create Spreadsheet..."), } ) @@ -234,7 +239,8 @@ def __nodeEditorToolMenu( nodeEditor, node, menuDefinition ) : "/Connect to Spreadsheet", { "subMenu" : functools.partial( __spreadsheetSubMenu, enabledRowNamesConnection, connectCommand, showSections = False ), - "active" : itemsActive + "active" : itemsActive, + "label" : _("Connect to Spreadsheet"), } ) diff --git a/python/GafferUI/SpreadsheetUI/_Metadata.py b/python/GafferUI/SpreadsheetUI/_Metadata.py index 47441fda295..79c8faf77a3 100644 --- a/python/GafferUI/SpreadsheetUI/_Metadata.py +++ b/python/GafferUI/SpreadsheetUI/_Metadata.py @@ -39,6 +39,7 @@ import IECore import Gaffer +from GafferUI.i18n import _ # Metadata registration # --------------------- @@ -51,7 +52,7 @@ Gaffer.Spreadsheet, "description", - """ + _(""" Provides a spreadsheet designed for easy management of sets of associated plug values. Each column of the spreadsheet corresponds to an output value that can be connected to drive a plug on another @@ -81,7 +82,7 @@ - **Shift + Up**, **Down**, **Left**, **Right** Extend cell selection. - **Ctrl + Up**, **Down**, **Left**, **Right** Move keyboard focus. - **Space** Toggle selection state of cell with keyboard focus. - """, + """), "nodeGadget:type", "GafferUI::AuxiliaryNodeGadget", "nodeGadget:shape", "oval", @@ -100,11 +101,11 @@ "selector" : { "description" : - """ + _(""" The value that the row names will be matched against. Typically this will refer to a Context Variable using the `${variableName}` syntax. - """, + """), "preset:Render Pass" : "${renderPass}", @@ -115,59 +116,59 @@ "rows" : { "description" : - """ + _(""" Holds a child RowPlug for each row in the spreadsheet. - """, + """), }, "rows.default" : { "description" : - """ + _(""" The default row. This provides output values when no other row matches the `selector`. - """, + """), }, "rows.*.name" : { "description" : - """ + _(""" The name of the row. This is matched against the `selector` to determine which row is chosen to be passed to the output. May contain multiple space separated names and any of Gaffer's standard wildcards. - """, + """), }, "rows.*.enabled" : { "description" : - """ + _(""" Enables or disables this row. Disabled rows are ignored. - """, + """), }, "rows.*.cells" : { "description" : - """ + _(""" Contains a child CellPlug for each column in the spreadsheet. - """, + """), }, "out" : { "description" : - """ + _(""" The outputs from the spreadsheet. Contains a child plug for each column in the spreadsheet. - """, + """), "plugValueWidget:type" : "", @@ -176,9 +177,9 @@ "enabledRowNames" : { "description" : - """ + _(""" An output plug containing the names of all currently enabled rows. - """, + """), "layout:section" : "Advanced", "plugValueWidget:type" : "GafferUI.ConnectionPlugValueWidget" @@ -188,7 +189,7 @@ "resolvedRows" : { "description" : - """ + _(""" An output plug containing the resolved cell values for all enabled rows, This can be used to drive expressions in situations where the standard `out` plug is not useful, or would be awkward to use. The @@ -204,7 +205,7 @@ > Note : The output is completely independent of the value of > `selector`. - """, + """), "layout:section" : "Advanced", "plugValueWidget:type" : "GafferUI.ConnectionPlugValueWidget" @@ -214,7 +215,7 @@ "activeRowIndex" : { "description" : - """ + _(""" An output containing the index of the row that matches the selector in the current context. @@ -223,7 +224,7 @@ > convert to `True`). Therefore `Spreadsheet.activeRowIndex` can > be connected to a Node's `enabled` plug to disable the node when > no row is matched. - """, + """), "layout:section" : "Advanced", @@ -275,7 +276,7 @@ def __forwardedMetadata( plug, key ) : for key in [ "description", - "spreadsheet:columnLabel", + _("spreadsheet:columnLabel"), "spreadsheet:columnWidth", "plugValueWidget:type", "presetsPlugValueWidget:allowCustom", diff --git a/python/GafferUI/SpreadsheetUI/_PlugTableModel.py b/python/GafferUI/SpreadsheetUI/_PlugTableModel.py old mode 100755 new mode 100644 index 2dc617637d5..4a718ac5e09 --- a/python/GafferUI/SpreadsheetUI/_PlugTableModel.py +++ b/python/GafferUI/SpreadsheetUI/_PlugTableModel.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore from Qt import QtGui @@ -174,7 +175,7 @@ def headerData( self, section, orientation, role ) : if orientation == QtCore.Qt.Horizontal : if section < 2 : - label = ( "Name", "Enabled" )[ section ] + label = ( _("Name"), _("Enabled") )[ section ] else : cellPlug = self.__rowsPlug.defaultRow()["cells"][ section - 2 ] label = Gaffer.Metadata.value( cellPlug, "spreadsheet:columnLabel" ) diff --git a/python/GafferUI/SpreadsheetUI/_PlugTableView.py b/python/GafferUI/SpreadsheetUI/_PlugTableView.py old mode 100755 new mode 100644 index 2b6a29e4d5d..c6c929f12cf --- a/python/GafferUI/SpreadsheetUI/_PlugTableView.py +++ b/python/GafferUI/SpreadsheetUI/_PlugTableView.py @@ -43,6 +43,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -838,7 +839,7 @@ def __headerButtonPress( self, header, event ) : menuDefinition = IECore.MenuDefinition() menuDefinition.append( - "/Set Label...", + "/" + _("Set Label..."), { "command" : functools.partial( Gaffer.WeakMethod( self.__setColumnLabel ), cellPlug ), "active" : not Gaffer.MetadataAlgo.readOnly( cellPlug ), @@ -846,7 +847,7 @@ def __headerButtonPress( self, header, event ) : ) menuDefinition.append( - "/Set Description...", + "/" + _("Set Description..."), { "command" : functools.partial( Gaffer.WeakMethod( self.__setColumnDescription ), cellPlug ), "active" : not Gaffer.MetadataAlgo.readOnly( cellPlug ), @@ -857,7 +858,7 @@ def __headerButtonPress( self, header, event ) : currentSection = _SectionChooser.getSection( cellPlug ) for sectionName in sectionNames : menuDefinition.append( - "/Move to Section/{}".format( sectionName ), + "/" + _("Move to Section") + "/{}".format( sectionName ), { "command" : functools.partial( Gaffer.WeakMethod( self.__moveToSection ), cellPlug, sectionName = sectionName ), "active" : not Gaffer.MetadataAlgo.readOnly( cellPlug ) and sectionName != currentSection, @@ -865,10 +866,10 @@ def __headerButtonPress( self, header, event ) : ) if sectionNames : - menuDefinition.append( "/Move to Section/__divider__", { "divider" : True } ) + menuDefinition.append( "/" + _("Move to Section") + "/__divider__", { "divider" : True } ) menuDefinition.append( - "/Move to Section/New...", + "/" + _("Move to Section") + "/" + _("New..."), { "command" : functools.partial( Gaffer.WeakMethod( self.__moveToSection ), cellPlug ), "active" : not Gaffer.MetadataAlgo.readOnly( cellPlug ), @@ -878,7 +879,7 @@ def __headerButtonPress( self, header, event ) : menuDefinition.append( "/DeleteDivider", { "divider" : True } ) menuDefinition.append( - "/Delete Column", + "/" + _("Delete Column"), { "command" : functools.partial( Gaffer.WeakMethod( self.__deleteColumn ), cellPlug ), "active" : self.__canDeleteColumn( cellPlug ) @@ -905,21 +906,22 @@ def __prependRowMenuItems( self, menuDefinition, plugs ) : rowsPlug = next( iter( rowPlugs ) ).ancestor( Gaffer.Spreadsheet.RowsPlug ) widths = [ - ( "Half", GafferUI.PlugWidget.labelWidth() * 0.5 ), - ( "Single", GafferUI.PlugWidget.labelWidth() ), - ( "Double", GafferUI.PlugWidget.labelWidth() * 2 ), - ( "Triple", GafferUI.PlugWidget.labelWidth() * 3 ), - ( "Quadruple", GafferUI.PlugWidget.labelWidth() * 4 ), + ( "Half", GafferUI.PlugWidget.labelWidth() * 0.5, _("Half") ), + ( "Single", GafferUI.PlugWidget.labelWidth(), _("Single") ), + ( "Double", GafferUI.PlugWidget.labelWidth() * 2, _("Double") ), + ( "Triple", GafferUI.PlugWidget.labelWidth() * 3, _("Triple") ), + ( "Quadruple", GafferUI.PlugWidget.labelWidth() * 4, _("Quadruple") ), ] currentWidth = self.__getRowNameWidth() - for label, width in widths : + for label, width, translatedLabel in widths : items.append( ( "/Width/{}".format( label ), { "command" : functools.partial( Gaffer.WeakMethod( self.__setRowNameWidth ), width ), "active" : not Gaffer.MetadataAlgo.readOnly( rowsPlug ), "checkBox" : width == currentWidth, + "label" : translatedLabel, } ) ) @@ -934,7 +936,7 @@ def __prependRowMenuItems( self, menuDefinition, plugs ) : "/__DisableRowsDivider__", { "divider" : True } ), ( - ( "/Disable Row%s" if currentEnabledState else "/Enable Row%s" ) % pluralSuffix, + "/" + ((_( "Disable Row%s") if currentEnabledState else _("Enable Row%s")) % pluralSuffix), { "command" : functools.partial( Gaffer.WeakMethod( self.__setRowEnabledState ), enabledPlugs, not currentEnabledState ), "active" : canChangeEnabledState @@ -944,14 +946,14 @@ def __prependRowMenuItems( self, menuDefinition, plugs ) : "/__CopyPasteRowsDivider__", { "divider" : True } ), ( - "Copy Row%s" % pluralSuffix, + _("Copy Row%s") % pluralSuffix, { "command" : Gaffer.WeakMethod( self.__copyRows ), "shortCut" : "Ctrl+C" } ), ( - "Paste Row%s" % pasteRowsPluralSuffix, + _("Paste Row%s") % pasteRowsPluralSuffix, { "command" : Gaffer.WeakMethod( self.__pasteRows ), "active" : _ClipboardAlgo.canPasteRows( self.__getClipboard(), rowsPlug ), @@ -962,7 +964,7 @@ def __prependRowMenuItems( self, menuDefinition, plugs ) : "/__DeleteRowDivider__", { "divider" : True } ), ( - "/Delete Row%s" % pluralSuffix, + "/" + _("Delete Row%s") % pluralSuffix, { "command" : functools.partial( Gaffer.WeakMethod( self.__deleteRows ), rowPlugs ), "active" : self.__canDeleteRows( rowPlugs ) @@ -988,7 +990,7 @@ def __prependCellMenuItems( self, menuDefinition, cellPlugs ) : items = [ ( - ( "/Disable Cell%s" if currentEnabledState else "/Enable Cell%s" ) % pluralSuffix, + "/" + ((_( "Disable Cell%s") if currentEnabledState else _("Enable Cell%s")) % pluralSuffix), { "command" : functools.partial( Gaffer.WeakMethod( self.__setPlugValues ), enabledPlugs, not currentEnabledState ), "active" : canChangeEnabledState, @@ -999,7 +1001,7 @@ def __prependCellMenuItems( self, menuDefinition, cellPlugs ) : ( "/__EditCellsDivider__", { "divider" : True } ), ( - "/Edit Cell%s" % pluralSuffix, + "/" + _("Edit Cell%s") % pluralSuffix, { "active" : _CellPlugValueWidget.canEdit( cellPlugs ), "command" : functools.partial( Gaffer.WeakMethod( self.__editSelectedPlugs ), False ) @@ -1009,7 +1011,7 @@ def __prependCellMenuItems( self, menuDefinition, cellPlugs ) : ( "/__CopyPasteCellsDivider__", { "divider" : True } ), ( - "Copy Cell%s" % pluralSuffix, + _("Copy Cell%s") % pluralSuffix, { "command" : Gaffer.WeakMethod( self.__copyCells ), "active" : _ClipboardAlgo.canCopyPlugs( plugMatrix ), @@ -1017,7 +1019,7 @@ def __prependCellMenuItems( self, menuDefinition, cellPlugs ) : } ), ( - "Paste Cell%s" % pluralSuffix, + _("Paste Cell%s") % pluralSuffix, { "command" : Gaffer.WeakMethod( self.__pasteCells ), "active" : _ClipboardAlgo.canPasteCells( self.__getClipboard(), plugMatrix ), @@ -1141,8 +1143,8 @@ def __selectIndexes( self, indexes ) : def __setColumnLabel( self, cellPlug ) : label = GafferUI.TextInputDialogue( - title = "Set Label", - confirmLabel = "Set", + title = _("Set Label"), + confirmLabel = _("Set"), initialText = Gaffer.Metadata.value( cellPlug, "spreadsheet:columnLabel" ) or cellPlug.getName() ).waitForText( parentWindow = self.ancestor( GafferUI.Window ) ) @@ -1153,8 +1155,8 @@ def __setColumnLabel( self, cellPlug ) : def __setColumnDescription( self, cellPlug ) : description = GafferUI.TextInputDialogue( - title = "Set Description", - confirmLabel = "Set", + title = _("Set Description"), + confirmLabel = _("Set"), initialText = Gaffer.Metadata.value( cellPlug["value"], "description" ) or "", multiLine = True, ).waitForText( parentWindow = self.ancestor( GafferUI.Window ) ) @@ -1283,9 +1285,9 @@ def __moveToSection( self, cellPlug, sectionName = None ) : if sectionName is None : sectionName = GafferUI.TextInputDialogue( - initialText = "New Section", - title = "Move to Section", - confirmLabel = "Move" + initialText = _("New Section"), + title = _("Move to Section"), + confirmLabel = _("Move") ).waitForText( parentWindow = self.ancestor( GafferUI.Window ) ) if not sectionName : diff --git a/python/GafferUI/SpreadsheetUI/_RowsPlugValueWidget.py b/python/GafferUI/SpreadsheetUI/_RowsPlugValueWidget.py old mode 100755 new mode 100644 index c323bf64b57..948b72a9266 --- a/python/GafferUI/SpreadsheetUI/_RowsPlugValueWidget.py +++ b/python/GafferUI/SpreadsheetUI/_RowsPlugValueWidget.py @@ -43,6 +43,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore from Qt import QtWidgets @@ -93,17 +94,17 @@ def __init__( self, plug ) : self.__toggleFilterButton = GafferUI.Button( image = "search.png", hasFrame = False ) self.__toggleFilterButton.clickedSignal().connect( Gaffer.WeakMethod( self.__toggleFilterButtonClicked ) ) - self.__patternWidget = GafferUI.TextWidget( toolTip = "Row filter pattern" ) + self.__patternWidget = GafferUI.TextWidget( toolTip = _("Row filter pattern") ) self.__patternWidget.setText( Gaffer.Metadata.value( plug, "spreadsheet:rowFilter" ) ) - self.__patternWidget.setPlaceholderText( "Filter..." ) + self.__patternWidget.setPlaceholderText( _("Filter...") ) # Ignore the width in X so that the widget is sized based on the width dictated by `rowNamesTable`. self.__patternWidget._qtWidget().setSizePolicy( QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed ) self.__patternWidget.editingFinishedSignal().connect( Gaffer.WeakMethod( self.__patternEditingFinished ) ) - self.__refreshFilterButton = GafferUI.Button( image = "refresh.png", hasFrame = False, toolTip = "Click to refresh row filter" ) + self.__refreshFilterButton = GafferUI.Button( image = "refresh.png", hasFrame = False, toolTip = _("Click to refresh row filter") ) self.__refreshFilterButton.clickedSignal().connect( Gaffer.WeakMethod( self.__refreshFilterButtonClicked ) ) - self.__defaultLabel = GafferUI.Label( "

Default

", horizontalAlignment = GafferUI.HorizontalAlignment.Right ) + self.__defaultLabel = GafferUI.Label( _("

Default

"), horizontalAlignment = GafferUI.HorizontalAlignment.Right ) self.__defaultLabel._qtWidget().setObjectName( "gafferDefaultRowLabel" ) # Ignore the width in X so that the label is sized based on the width dictated by `rowNamesTable`. self.__defaultLabel._qtWidget().setSizePolicy( QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed ) @@ -127,7 +128,7 @@ def __init__( self, plug ) : GafferUI.Spacer( imath.V2i( 1, 4 ), maximumSize = imath.V2i( 1, 4 ) ) self.__addColumnButton = GafferUI.MenuButton( - image="plus.png", hasFrame=False, toolTip = "Click to add column, or drop plug to connect", + image="plus.png", hasFrame=False, toolTip = _("Click to add column, or drop plug to connect"), menu = GafferUI.Menu( Gaffer.WeakMethod( self.__addColumnMenuDefinition ) ) ) self.__addColumnButton.dragEnterSignal().connect( Gaffer.WeakMethod( self.__addColumnButtonDragEnter ) ) @@ -180,7 +181,7 @@ def __init__( self, plug ) : self.__addRowButton = GafferUI.MenuButton( image = "plus.png", hasFrame = False, - toolTip = "Click to add row, or drop new row names", + toolTip = _("Click to add row, or drop new row names"), menu = GafferUI.Menu( Gaffer.WeakMethod( self.__addRowMenuDefinition ) ), immediate = True, parenting = { @@ -356,7 +357,7 @@ def __addColumnMenuDefinition( self ) : def __addColumn( self, menu, plugType ) : - d = GafferUI.TextInputDialogue( initialText = "column", title = "Enter name", confirmLabel = "Add Column" ) + d = GafferUI.TextInputDialogue( initialText = "column", title = _("Enter name"), confirmLabel = _("Add Column") ) name = d.waitForText( parentWindow = menu.ancestor( GafferUI.Window ) ) if not name : return @@ -412,17 +413,17 @@ def __cellsMouseMove( self, widget, event ) : rowPlug = plug.ancestor( Gaffer.Spreadsheet.RowPlug ) if rowPlug == rowPlug.parent().defaultRow() : - rowName = "Default" + rowName = _("Default") else : with self.context() : - rowName = rowPlug["name"].getValue() or "unnamed" + rowName = rowPlug["name"].getValue() or _("unnamed") columnPlug = self.getPlug().defaultRow()["cells"][plug.getName()] columnName = Gaffer.Metadata.value( columnPlug, "spreadsheet:columnLabel" ) if not columnName : columnName = IECore.CamelCase.toSpaced( columnPlug.getName() ) - status = "Row : {}, Column : {}".format( + status = _("Row : {}, Column : {}").format( rowName, columnName ) @@ -461,7 +462,7 @@ def __updateRowFilterWidgets( self ) : self.__patternWidget.setVisible( self.__rowFilterEnabled ) self.__refreshFilterButton.setVisible( self.__rowFilterEnabled ) self.__toggleFilterButton.setImage( "searchOn.png" if self.__rowFilterEnabled else "search.png" ) - self.__toggleFilterButton.setToolTip( "Click to disable row filter" if self.__rowFilterEnabled else "Click to enable row filter" ) + self.__toggleFilterButton.setToolTip( _("Click to disable row filter") if self.__rowFilterEnabled else _("Click to enable row filter") ) def __toggleFilterButtonClicked( self, *unused ) : diff --git a/python/GafferUI/SpreadsheetUI/_SectionChooser.py b/python/GafferUI/SpreadsheetUI/_SectionChooser.py index 002222e1b42..685400f32ff 100644 --- a/python/GafferUI/SpreadsheetUI/_SectionChooser.py +++ b/python/GafferUI/SpreadsheetUI/_SectionChooser.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore from Qt import QtWidgets @@ -241,9 +242,9 @@ def __renameSection( self, sectionName ) : sectionIsCurrent = self._qtWidget().tabText( self._qtWidget().currentIndex() ) == sectionName newSectionName = GafferUI.TextInputDialogue( - title = "Rename section", + title = _("Rename section"), initialText = sectionName, - confirmLabel = "Rename", + confirmLabel = _("Rename"), ).waitForText( parentWindow = self.ancestor( GafferUI.Window ) ) if not newSectionName or newSectionName == sectionName : @@ -280,9 +281,9 @@ def __setSectionDescription( self, sectionName ) : metadataKey = "spreadsheet:section:{}:description".format( sectionName ) description = GafferUI.TextInputDialogue( - title = "Set Description", + title = _("Set Description"), initialText = Gaffer.Metadata.value( self.__rowsPlug, metadataKey ), - confirmLabel = "Set", + confirmLabel = _("Set"), multiLine = True, ).waitForText( parentWindow = self.ancestor( GafferUI.Window ) ) @@ -345,7 +346,7 @@ def __contextMenuRequested( self, pos ) : for index, name in enumerate( self.sectionNames( self.__rowsPlug ) ) : m.append( - "/Switch to/%s" % name, + "/" + _("Switch to") + "/%s" % name, { "command" : functools.partial( Gaffer.WeakMethod( self.__setCurrent ), index ) } @@ -356,7 +357,7 @@ def __contextMenuRequested( self, pos ) : readOnly = Gaffer.MetadataAlgo.readOnly( self.__rowsPlug ) m.append( - "/Rename...", + "/" + _("Rename..."), { "command" : functools.partial( Gaffer.WeakMethod( self.__renameSection ), sectionName ), "active" : not readOnly, @@ -364,7 +365,7 @@ def __contextMenuRequested( self, pos ) : ) m.append( - "/Set Description...", + "/" + _("Set Description..."), { "command" : functools.partial( Gaffer.WeakMethod( self.__setSectionDescription ), sectionName ), "active" : not readOnly, @@ -374,7 +375,7 @@ def __contextMenuRequested( self, pos ) : sectionNames = self.sectionNames( self.__rowsPlug ) for toSectionName in sectionNames : m.append( - "/Move Columns To/{}".format( toSectionName ), + "/" + _("Move Columns To") + "/{}".format( toSectionName ), { "command" : functools.partial( Gaffer.WeakMethod( self.__moveSection ), sectionName, toSectionName ), "active" : toSectionName != sectionName and not readOnly, @@ -384,7 +385,7 @@ def __contextMenuRequested( self, pos ) : m.append( "/__DeleteDivider__", { "divider" : True } ) m.append( - "/Delete", + "/" + _("Delete"), { "command" : functools.partial( Gaffer.WeakMethod( self.__deleteSection ), sectionName ), "active" : not readOnly, @@ -394,7 +395,7 @@ def __contextMenuRequested( self, pos ) : m.append( "/__RemoveDivider__", { "divider" : True } ) m.append( - "/Remove Sectioning", + "/" + _("Remove Sectioning"), { "command" : functools.partial( Gaffer.WeakMethod( self.__removeSectioning ) ), "active" : not readOnly, diff --git a/python/GafferUI/StringPlugValueWidget.py b/python/GafferUI/StringPlugValueWidget.py index 60a3fc9df41..498bfeefca2 100644 --- a/python/GafferUI/StringPlugValueWidget.py +++ b/python/GafferUI/StringPlugValueWidget.py @@ -43,6 +43,7 @@ import GafferUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ ## Supported Metadata : # @@ -249,7 +250,7 @@ def __substitutionsButtonPress( widget, event ) : label.buttonPressSignal().connect( lambda widget, event : True ) label.dragBeginSignal().connect( functools.partial( __substitutionsDragBegin, text = text ) ) label.dragEndSignal().connect( __substitutionsDragEnd ) - button = GafferUI.Button( image = "duplicate.png", hasFrame = False, toolTip = "Copy Text" ) + button = GafferUI.Button( image = "duplicate.png", hasFrame = False, toolTip = _("Copy Text") ) button.clickedSignal().connect( functools.partial( __substitutionsCopyClicked, text = text ) ) widget.__substitutionsPopupWindow.popup( parent = widget ) diff --git a/python/GafferUI/SubGraphUI.py b/python/GafferUI/SubGraphUI.py index 9f7d95e1f2a..8e842d292db 100644 --- a/python/GafferUI/SubGraphUI.py +++ b/python/GafferUI/SubGraphUI.py @@ -35,14 +35,15 @@ ########################################################################## import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.SubGraph, "description", - """ + _(""" Holds a nested node graph of its own. - """, + """), ) diff --git a/python/GafferUI/SwitchUI.py b/python/GafferUI/SwitchUI.py index ad4e32e64ad..cc1c7b69aea 100644 --- a/python/GafferUI/SwitchUI.py +++ b/python/GafferUI/SwitchUI.py @@ -38,16 +38,17 @@ import GafferUI from GafferUI.PlugValueWidget import sole +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.Switch, "description", - """ + _(""" Chooses between multiple input connections, passing through the chosen input to the output. - """, + """), # Add + buttons for creating new plugs in the GraphEditor "noduleLayout:customGadget:addButtonTop:gadgetType", "GafferUI.SwitchUI.PlugAdder", @@ -64,12 +65,12 @@ "index" : { "description" : - """ + _(""" The index of the input which is passed through. A value of 0 chooses the first input, 1 the second and so on. Values larger than the number of available inputs wrap back around to the beginning. - """, + """), "nodule:type" : "", @@ -78,10 +79,10 @@ "in" : { "description" : - """ + _(""" The array of inputs to choose from. One of these is chosen by the index plug to be passed through to the output. - """, + """), "nodule:type" : "GafferUI::CompoundNodule", "plugValueWidget:type" : "", @@ -93,9 +94,9 @@ "out" : { "description" : - """ + _(""" Outputs the input specified by the index. - """, + """), "plugValueWidget:type" : "", @@ -104,14 +105,14 @@ "deleteContextVariables" : { "description" : - """ + _(""" The names of context variables to be deleted before accessing the array of inputs. Names should be space-separated and may use Gaffer's standard wildcards. > Tip : This is convenient for cleaning up context variables only needed to compute the switch index. - """, + """), "nodule:type" : "", "layout:section" : "Advanced", @@ -121,12 +122,12 @@ "connectedInputs" : { "description" : - """ + _(""" The indices of the input array that have incoming connections. > Tip : This can be used to drive a Wedge or Collect node so that > they operate over each input in turn. - """, + """), "nodule:type" : "", "layout:section" : "Advanced", diff --git a/python/GafferUI/TextInputDialogue.py b/python/GafferUI/TextInputDialogue.py index 45dc79f0bc3..e4e531213f8 100644 --- a/python/GafferUI/TextInputDialogue.py +++ b/python/GafferUI/TextInputDialogue.py @@ -37,10 +37,11 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ class TextInputDialogue( GafferUI.Dialogue ) : - def __init__( self, initialText="", title="Enter text", cancelLabel="Cancel", confirmLabel="OK", multiLine = False, **kw ) : + def __init__( self, initialText="", title=_("Enter text"), cancelLabel=_("Cancel"), confirmLabel=_("OK"), multiLine = False, **kw ) : GafferUI.Dialogue.__init__( self, title, sizeMode=GafferUI.Window.SizeMode.Fixed, **kw ) diff --git a/python/GafferUI/TimeWarpUI.py b/python/GafferUI/TimeWarpUI.py index 9b22ade5dc2..f0adc5cdc3f 100644 --- a/python/GafferUI/TimeWarpUI.py +++ b/python/GafferUI/TimeWarpUI.py @@ -35,27 +35,28 @@ ########################################################################## import Gaffer +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( Gaffer.TimeWarp, "description", - """ + _(""" Changes the time at which upstream nodes are evaluated using the following formula : `upstreamFrame = frame * speed + offset` - """, + """), plugs = { "speed" : { "description" : - """ + _(""" Multiplies the current frame value. - """, + """), "nodule:type" : "", @@ -64,9 +65,9 @@ "offset" : { "description" : - """ + _(""" Adds to the current frame value (after multiplication with speed). - """, + """), "nodule:type" : "", diff --git a/python/GafferUI/Timeline.py b/python/GafferUI/Timeline.py index b0f4358adba..2c4a0736c0d 100644 --- a/python/GafferUI/Timeline.py +++ b/python/GafferUI/Timeline.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from Qt import QtCore from Qt import QtGui @@ -72,7 +73,7 @@ def __init__( self, scriptNode, **kw ) : self.__sliderRangeStart = GafferUI.NumericWidget( scriptNode["frameRange"]["start"].getValue() ) self.__sliderRangeStart.setFixedCharacterWidth( 4 ) - self.__sliderRangeStart.setToolTip( "Slider minimum" ) + self.__sliderRangeStart.setToolTip( _("Slider minimum") ) self.__sliderRangeStartChangedConnection = self.__sliderRangeStart.editingFinishedSignal().connect( Gaffer.WeakMethod( self.__sliderRangeChanged ) ) self.__slider = _TimelineSlider( @@ -98,12 +99,12 @@ def __init__( self, scriptNode, **kw ) : self.__frame = GafferUI.NumericWidget( self.__playback.context().getFrame() ) self.__frame.setFixedCharacterWidth( 5 ) - self.__frame.setToolTip( "Current frame" ) + self.__frame.setToolTip( _("Current frame") ) self.__frameChangedConnection = self.__frame.valueChangedSignal().connect( Gaffer.WeakMethod( self.__valueChanged ) ) self.__sliderRangeEnd = GafferUI.NumericWidget( scriptNode["frameRange"]["end"].getValue() ) self.__sliderRangeEnd.setFixedCharacterWidth( 4 ) - self.__sliderRangeEnd.setToolTip( "Slider maximum" ) + self.__sliderRangeEnd.setToolTip( _("Slider maximum") ) self.__sliderRangeEndChangedConnection = self.__sliderRangeEnd.editingFinishedSignal().connect( Gaffer.WeakMethod( self.__sliderRangeChanged ) ) self.__scriptRangeEnd = GafferUI.NumericPlugValueWidget( scriptNode["frameRange"]["end"] ) diff --git a/python/GafferUI/TogglePlugValueWidget.py b/python/GafferUI/TogglePlugValueWidget.py index cb6627cad84..57ef054749a 100644 --- a/python/GafferUI/TogglePlugValueWidget.py +++ b/python/GafferUI/TogglePlugValueWidget.py @@ -36,6 +36,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -87,8 +88,8 @@ def getToolTip( self ) : if result : result += "\n\n" - result += "## Actions\n\n" - result += "- Click to toggle to/from default value\n" + result += "## " + _("Actions") + "\n\n" + result += "- " + _("Click to toggle to/from default value") + "\n" return result diff --git a/python/GafferUI/ToolUI.py b/python/GafferUI/ToolUI.py index 13c5dd3856b..53da8a31795 100644 --- a/python/GafferUI/ToolUI.py +++ b/python/GafferUI/ToolUI.py @@ -36,6 +36,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ def __image( plug ) : @@ -48,9 +49,9 @@ def __image( plug ) : GafferUI.Tool, "description", - """ + _(""" Base class for interactive tools used in the Viewer. - """, + """), plugs = { diff --git a/python/GafferUI/UIEditor.py b/python/GafferUI/UIEditor.py index a9fa9483c19..0b7213362b4 100644 --- a/python/GafferUI/UIEditor.py +++ b/python/GafferUI/UIEditor.py @@ -47,6 +47,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from . import MetadataWidget ## The UIEditor class allows the user to edit the interfaces for nodes. @@ -71,17 +72,17 @@ def __init__( self, scriptNode, **kw ) : with self.__tabbedContainer : # Node tab - with GafferUI.ListContainer( spacing = 4, borderWidth = 8, parenting = { "label" : "Node" } ) as self.__nodeTab : + with GafferUI.ListContainer( spacing = 4, borderWidth = 8, parenting = { "label" : _("Node") } ) as self.__nodeTab : with _Row() : - _Label( "Name" ) + _Label( _("Name") ) self.__nodeNameWidget = GafferUI.NameWidget( None ) with _Row() : - _Label( "Description", parenting = { "verticalAlignment" : GafferUI.ListContainer.VerticalAlignment.Top } ) + _Label( _("Description"), parenting = { "verticalAlignment" : GafferUI.ListContainer.VerticalAlignment.Top } ) self.__nodeMetadataWidgets.append( MetadataWidget.MultiLineStringMetadataWidget( key = "description" ) @@ -89,7 +90,7 @@ def __init__( self, scriptNode, **kw ) : with _Row() : - _Label( "Documentation URL" ) + _Label( _("Documentation URL") ) self.__nodeMetadataWidgets.append( MetadataWidget.StringMetadataWidget( key = "documentation:url" ) @@ -97,7 +98,7 @@ def __init__( self, scriptNode, **kw ) : with _Row() : - _Label( "Color" ) + _Label( _("Color") ) self.__nodeMetadataWidgets.append( MetadataWidget.ColorSwatchMetadataWidget( key = "nodeGadget:color", defaultValue = imath.Color3f( 0.4 ) ) @@ -105,13 +106,13 @@ def __init__( self, scriptNode, **kw ) : with _Row() as self.__iconRow : - _Label( "Icon" ) + _Label( _("Icon") ) self.__nodeMetadataWidgets.append( MetadataWidget.FileSystemPathMetadataWidget( key = "icon" ) ) - GafferUI.Label( "Scale" ) + GafferUI.Label( _("Scale") ) scaleWidget = MetadataWidget.NumericMetadataWidget( key = "iconScale", defaultValue = 1.5 ) scaleWidget.numericWidget()._qtWidget().setMaximumWidth( 60 ) @@ -119,7 +120,7 @@ def __init__( self, scriptNode, **kw ) : with _Row() as self.__plugAddButtons : - _Label( "Plug Creators" ) + _Label( _("Plug Creators") ) for side in ( "Top", "Bottom", "Left", "Right" ) : GafferUI.Label( side ) @@ -129,7 +130,7 @@ def __init__( self, scriptNode, **kw ) : ) ) # Plugs tab - with GafferUI.SplitContainer( orientation=GafferUI.SplitContainer.Orientation.Horizontal, borderWidth = 8, parenting = { "label" : "Plugs" } ) as self.__plugTab : + with GafferUI.SplitContainer( orientation=GafferUI.SplitContainer.Orientation.Horizontal, borderWidth = 8, parenting = { "label" : _("Plugs") } ) as self.__plugTab : self.__plugListing = _PlugListing() self.__plugListing.selectionChangedSignal().connect( Gaffer.WeakMethod( self.__plugListingSelectionChanged ) ) @@ -179,7 +180,7 @@ def appendNodeContextMenuDefinitions( cls, graphEditor, node, menuDefinition ) : menuDefinition.append( "/UIEditorDivider", { "divider" : True } ) menuDefinition.append( - "/Set Color...", + "/" + _("Set Color..."), { "command" : functools.partial( cls.__setColor, node = node ), "active" : not Gaffer.MetadataAlgo.readOnly( node ), @@ -192,7 +193,7 @@ def appendNodeContextMenuDefinitions( cls, graphEditor, node, menuDefinition ) : if nodeGadgetTypes == { "GafferUI::AuxiliaryNodeGadget", "GafferUI::StandardNodeGadget" } : nodeGadgetType = Gaffer.Metadata.value( node, "nodeGadget:type" ) or "GafferUI::StandardNodeGadget" menuDefinition.append( - "/Show Name", + "/" + _("Show Name"), { "command" : functools.partial( cls.__setNameVisible, node ), "checkBox" : nodeGadgetType == "GafferUI::StandardNodeGadget", @@ -210,7 +211,7 @@ def appendNodeEditorToolMenuDefinitions( cls, nodeEditor, node, menuDefinition ) menuDefinition.append( "/Edit UI Divider", { "divider" : True } ) menuDefinition.append( - "/Edit UI...", + "/" + _("Edit UI..."), { "command" : functools.partial( GafferUI.UIEditor.acquire, node ), "active" : ( @@ -377,7 +378,7 @@ def __plugPopupMenu( menuDefinition, plugValueWidget ) : return menuDefinition.append( "/EditUIDivider", { "divider" : True } ) - menuDefinition.append( "/Edit UI...", + menuDefinition.append( "/" + _("Edit UI..."), { "command" : functools.partial( __editPlugUI, node, plug ), "active" : not Gaffer.MetadataAlgo.readOnly( plug ) @@ -952,23 +953,23 @@ def __addMenuDefinition( self ) : m = IECore.MenuDefinition() - m.append( "/Add Plug/Bool", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.BoolPlug ) } ) - m.append( "/Add Plug/Float", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.FloatPlug ) } ) - m.append( "/Add Plug/Int", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.IntPlug ) } ) - m.append( "/Add Plug/NumericDivider", { "divider" : True } ) + m.append( "/" + _("Add Plug") + "/" + _("Bool"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.BoolPlug ) } ) + m.append( "/" + _("Add Plug") + "/" + _("Float"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.FloatPlug ) } ) + m.append( "/" + _("Add Plug") + "/" + _("Int"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.IntPlug ) } ) + m.append( "/" + _("Add Plug") + "/NumericDivider", { "divider" : True } ) - m.append( "/Add Plug/String", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.StringPlug ) } ) - m.append( "/Add Plug/StringDivider", { "divider" : True } ) + m.append( "/" + _("Add Plug") + "/" + _("String"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.StringPlug ) } ) + m.append( "/" + _("Add Plug") + "/StringDivider", { "divider" : True } ) - m.append( "/Add Plug/V2i", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.V2iPlug ) } ) - m.append( "/Add Plug/V3i", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.V3iPlug ) } ) - m.append( "/Add Plug/V2f", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.V2fPlug ) } ) - m.append( "/Add Plug/V3f", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.V3fPlug ) } ) - m.append( "/Add Plug/VectorDivider", { "divider" : True } ) + m.append( "/" + _("Add Plug") + "/" + _("V2i"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.V2iPlug ) } ) + m.append( "/" + _("Add Plug") + "/" + _("V3i"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.V3iPlug ) } ) + m.append( "/" + _("Add Plug") + "/" + _("V2f"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.V2fPlug ) } ) + m.append( "/" + _("Add Plug") + "/" + _("V3f"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.V3fPlug ) } ) + m.append( "/" + _("Add Plug") + "/VectorDivider", { "divider" : True } ) - m.append( "/Add Plug/Color3f", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.Color3fPlug ) } ) - m.append( "/Add Plug/Color4f", { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.Color4fPlug ) } ) - m.append( "/Add Plug/ColorDivider", { "divider" : True } ) + m.append( "/" + _("Add Plug") + "/" + _("Color3f"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.Color3fPlug ) } ) + m.append( "/" + _("Add Plug") + "/" + _("Color4f"), { "command" : functools.partial( Gaffer.WeakMethod( self.__addPlug ), Gaffer.Color4fPlug ) } ) + m.append( "/" + _("Add Plug") + "/ColorDivider", { "divider" : True } ) for label, plugType in [ ( "Float", Gaffer.FloatVectorDataPlug ), @@ -987,11 +988,11 @@ def __addMenuDefinition( self ) : } ) else : - m.append( "/Add Plug/Array/" + label, { "divider" : True } ) + m.append( "/" + _("Add Plug") + "/" + _("Array") + label, { "divider" : True } ) m.append( "/Add Plug Divider", { "divider" : True } ) - m.append( "/Add Section", { "command" : Gaffer.WeakMethod( self.__addSection ) } ) + m.append( "/" + _("Add Section"), { "command" : Gaffer.WeakMethod( self.__addSection ) } ) return m @@ -1111,14 +1112,14 @@ def __init__( self, **kw ) : with GafferUI.ListContainer( spacing = 4 ) as self.__editingColumn : - GafferUI.Label( "Name" ) + GafferUI.Label( _("Name") ) self.__nameWidget = GafferUI.TextWidget() self.__nameWidget.editingFinishedSignal().connect( Gaffer.WeakMethod( self.__nameEditingFinished ) ) GafferUI.Spacer( imath.V2i( 4 ), maximumSize = imath.V2i( 4 ) ) - GafferUI.Label( "Value" ) + GafferUI.Label( _("Value") ) # We make a UI for editing preset values by copying the plug # onto this node and then making a PlugValueWidget for it. @@ -1341,54 +1342,54 @@ def __init__( self, **kw ) : with _Row() : - _Label( "Name" ) + _Label( _("Name") ) self.__nameWidget = GafferUI.NameWidget( None ) with _Row() : - _Label( "Label" ) + _Label( _("Label") ) self.__metadataWidgets["label"] = MetadataWidget.StringMetadataWidget( key = "label", acceptEmptyString = False ) with _Row() : - _Label( "Description", parenting = { "verticalAlignment" : GafferUI.ListContainer.VerticalAlignment.Top } ) + _Label( _("Description"), parenting = { "verticalAlignment" : GafferUI.ListContainer.VerticalAlignment.Top } ) self.__metadataWidgets["description"] = MetadataWidget.MultiLineStringMetadataWidget( key = "description" ) self.__metadataWidgets["description"].textWidget().setFixedLineHeight( 10 ) with _Row() : - _Label( "Widget" ) + _Label( _("Widget") ) self.__widgetMenu = GafferUI.MenuButton( menu = GafferUI.Menu( Gaffer.WeakMethod( self.__widgetMenuDefinition ) ) ) - with GafferUI.Collapsible( "Presets", collapsed = True ) : + with GafferUI.Collapsible( _("Presets"), collapsed = True ) : with _Row() : _Label( "" ) self.__presetsEditor = _PresetsEditor() - with GafferUI.Collapsible( "Widget Settings", collapsed = True ) : + with GafferUI.Collapsible( _("Widget Settings"), collapsed = True ) : self.__widgetSettingsContainer = GafferUI.ListContainer( spacing = 4 ) - with GafferUI.Collapsible( "Graph Editor", collapsed = True ) : + with GafferUI.Collapsible( _("Graph Editor"), collapsed = True ) : with GafferUI.ListContainer( spacing = 4 ) as self.__graphEditorSection : with _Row() : - _Label( "Gadget" ) + _Label( _("Gadget") ) self.__gadgetMenu = GafferUI.MenuButton( menu = GafferUI.Menu( Gaffer.WeakMethod( self.__gadgetMenuDefinition ) ) ) with _Row() : - _Label( "Position" ) + _Label( _("Position") ) self.__metadataWidgets["noduleLayout:section"] = MetadataWidget.MenuMetadataWidget( key = "noduleLayout:section", labelsAndValues = [ @@ -1402,12 +1403,12 @@ def __init__( self, **kw ) : with _Row() : - _Label( "Color" ) + _Label( _("Color") ) self.__metadataWidgets["nodule:color"] = MetadataWidget.ColorSwatchMetadataWidget( key = "nodule:color", defaultValue = imath.Color3f( 0.4 ) ) with _Row() : - _Label( "Connection Color" ) + _Label( _("Connection Color") ) self.__metadataWidgets["connectionGadget:color"] = MetadataWidget.ColorSwatchMetadataWidget( key = "connectionGadget:color", defaultValue = imath.Color3f( 0.125 ) ) self.__plug = None @@ -1631,14 +1632,14 @@ def __init__( self, **kw ) : with _Row() : - _Label( "Name" ) + _Label( _("Name") ) self.__nameWidget = GafferUI.TextWidget() self.__nameWidget.editingFinishedSignal().connect( Gaffer.WeakMethod( self.__nameWidgetEditingFinished ) ) with _Row() : - _Label( "Summary", parenting = { "verticalAlignment" : GafferUI.ListContainer.VerticalAlignment.Top } ) + _Label( _("Summary"), parenting = { "verticalAlignment" : GafferUI.ListContainer.VerticalAlignment.Top } ) self.__summaryMetadataWidget = MetadataWidget.MultiLineStringMetadataWidget( key = "" ) diff --git a/python/GafferUI/UserPlugs.py b/python/GafferUI/UserPlugs.py index 18e4d4bfd41..235554b6ba9 100644 --- a/python/GafferUI/UserPlugs.py +++ b/python/GafferUI/UserPlugs.py @@ -44,6 +44,8 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ + ## \deprecated. Remove in version 1.7. def appendPlugCreationMenuDefinitions( plugParent, menuDefinition, prefix = "" ) : @@ -118,7 +120,7 @@ def __init__( self, plugParent, **kw ) : image="plus.png", hasFrame=False, menu=GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ) ), - toolTip = "Click to add plugs" + toolTip = _("Click to add plugs") ) GafferUI.Spacer( imath.V2i( 1 ), imath.V2i( 999999, 1 ), parenting = { "expand" : True } ) diff --git a/python/GafferUI/VectorDataPlugValueWidget.py b/python/GafferUI/VectorDataPlugValueWidget.py index 0cafd846502..030e4c7183d 100644 --- a/python/GafferUI/VectorDataPlugValueWidget.py +++ b/python/GafferUI/VectorDataPlugValueWidget.py @@ -41,6 +41,8 @@ import Gaffer import GafferUI +from GafferUI import i18n as _i18n +from GafferUI.i18n import _ # Supported plug metadata : # @@ -63,10 +65,13 @@ def __init__( self, plug, **kw ) : dataPlugs = self.__dataPlugs() if len( dataPlugs ) > 1 : self.__dataWidget.setHeader( [ - Gaffer.Metadata.value( p, "vectorDataPlugValueWidget:header" ) or IECore.CamelCase.toSpaced( p.getName() ) + _( Gaffer.Metadata.value( p, "vectorDataPlugValueWidget:header" ) or IECore.CamelCase.toSpaced( p.getName() ) ) + for p in dataPlugs + ] ) + self.__dataWidget.setToolTips( [ + _( Gaffer.Metadata.value( p, "description" ) ) if _i18n.translateTooltips() and Gaffer.Metadata.value( p, "description" ) else Gaffer.Metadata.value( p, "description" ) or "" for p in dataPlugs ] ) - self.__dataWidget.setToolTips( [ Gaffer.Metadata.value( p, "description" ) or "" for p in dataPlugs ] ) self.__dataWidget.dataChangedSignal().connect( Gaffer.WeakMethod( self.__dataChanged ) ) diff --git a/python/GafferUI/VectorDataWidget.py b/python/GafferUI/VectorDataWidget.py index df805905600..ae03a01a359 100644 --- a/python/GafferUI/VectorDataWidget.py +++ b/python/GafferUI/VectorDataWidget.py @@ -42,6 +42,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.ColorSwatch import _Checker from ._TableView import _TableView @@ -457,8 +458,8 @@ def _contextMenuDefinition( self, selectedRows ) : m = IECore.MenuDefinition() - m.append( "/Select All", { "command" : Gaffer.WeakMethod( self.__selectAll ) } ) - m.append( "/Clear Selection", { "command" : Gaffer.WeakMethod( self.__clearSelection ) } ) + m.append( "/Select All", { "command" : Gaffer.WeakMethod( self.__selectAll ), "label" : _("Select All") } ) + m.append( "/Clear Selection", { "command" : Gaffer.WeakMethod( self.__clearSelection ), "label" : _("Clear Selection") } ) if self.getEditable() and self.getSizeEditable() : @@ -467,7 +468,8 @@ def _contextMenuDefinition( self, selectedRows ) : "/Delete Selected Rows", { "command" : functools.partial( Gaffer.WeakMethod( self.__removeRows ), selectedRows ), - "shortCut" : "Backspace, Delete" + "shortCut" : "Backspace, Delete", + "label" : _("Delete Selected Rows"), } ) diff --git a/python/GafferUI/ViewUI.py b/python/GafferUI/ViewUI.py index dbf96519021..b264e893746 100644 --- a/python/GafferUI/ViewUI.py +++ b/python/GafferUI/ViewUI.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ from GafferUI.PlugValueWidget import sole @@ -103,9 +104,9 @@ "displayTransform.name" : { "description" : - """ + _(""" The colour transform used for correcting the Viewer output for display. - """, + """), "plugValueWidget:type" : "GafferUI.PresetsPlugValueWidget", "label" : "", @@ -125,9 +126,9 @@ "displayTransform.clipping" : { "description" : - """ + _(""" Highlights the regions in which the colour values go above 1 or below 0. - """, + """), "plugValueWidget:type" : "GafferUI.TogglePlugValueWidget", "togglePlugValueWidget:image:on" : "clippingOn.png", @@ -138,9 +139,9 @@ "displayTransform.exposure" : { "description" : - """ + _(""" Applies an exposure adjustment to the image. - """, + """), "plugValueWidget:type" : "GafferUI.TogglePlugValueWidget", "togglePlugValueWidget:image:on" : "exposureOn.png", @@ -153,9 +154,9 @@ "displayTransform.gamma" : { "description" : - """ + _(""" Applies a gamma correction to the image. - """, + """), "plugValueWidget:type" : "GafferUI.TogglePlugValueWidget", "togglePlugValueWidget:image:on" : "gammaOn.png", @@ -168,9 +169,9 @@ "displayTransform.absolute" : { "description" : - """ + _(""" Converts negative values to positive. - """, + """), "layout:visibilityActivator" : False, @@ -189,7 +190,7 @@ def __init__( self, plug, **kw ) : hasFrame = False, menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ), - title = "Channel", + title = _("Channel"), ) ) @@ -213,7 +214,7 @@ def __menuDefinition( self ) : m = IECore.MenuDefinition() m.append( - "/All", + "/" + _("All"), { "command" : functools.partial( Gaffer.WeakMethod( self.__setValue ), -1 ), "checkBox" : soloChannel == -1 @@ -237,7 +238,7 @@ def __menuDefinition( self ) : m.append( "/LuminanceDivider", { "divider" : True, }) m.append( - "/Luminance", + "/" + _("Luminance"), { "command" : functools.partial( Gaffer.WeakMethod( self.__setValue ), -2 ), "checkBox" : soloChannel == -2, diff --git a/python/GafferUI/Viewer.py b/python/GafferUI/Viewer.py index 39f1db0bd1f..120a3ac6f1e 100644 --- a/python/GafferUI/Viewer.py +++ b/python/GafferUI/Viewer.py @@ -44,6 +44,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ import IECoreGL @@ -302,10 +303,10 @@ def __updateViewportMessage( self, unused = None ) : text = None icon = None if self.getNodeSet() == self.scriptNode().focusSet() : - text = "Focus a node to view" + text = _("Focus a node to view") icon = "viewerFocusPrompt.png" elif self.getNodeSet() == self.scriptNode().selection() : - text = "Select a node to view" + text = _("Select a node to view") icon = "viewerSelectPrompt.png" else : self.__gadgetWidget.setViewportGadget( GafferUI.ViewportGadget() ) @@ -396,14 +397,14 @@ def __init__( self, view ) : for tool in self.tools : - toolTip = tool.getName() + toolTip = _( tool.getName() ) description = Gaffer.Metadata.value( tool, "description" ) if description : - toolTip += "\n\n" + IECore.StringUtil.wrap( description, 80 ) + toolTip += "\n\n" + IECore.StringUtil.wrap( _( description.strip() ), 80 ) shortCut = Gaffer.Metadata.value( tool, "viewer:shortCut" ) if shortCut is not None : - toolTip += "\n\nShortcut : " + shortCut + toolTip += "\n\n" + _("Shortcut") + " : " + shortCut widget = GafferUI.BoolPlugValueWidget( tool["active"], toolTip = toolTip ) diff --git a/python/GafferUI/_PlugAdder.py b/python/GafferUI/_PlugAdder.py index 68fd0b597b1..997ace211b3 100644 --- a/python/GafferUI/_PlugAdder.py +++ b/python/GafferUI/_PlugAdder.py @@ -40,6 +40,7 @@ import Gaffer import GafferUI +from GafferUI.i18n import _ def __plugMenu( title, plugs ) : @@ -56,7 +57,7 @@ def choosePlug( plug ) : } ) - menu = GafferUI.Menu( menuDefinition, title = title ) + menu = GafferUI.Menu( menuDefinition, title = _( title ) ) menu.popup( modal = True ) return chosenPlugs[0] if chosenPlugs else None @@ -88,7 +89,7 @@ def chooseName( name ) : } ) - menu = GafferUI.Menu( menuDefinition, title = title ) + menu = GafferUI.Menu( menuDefinition, title = _( title ) ) menu.popup( modal = True ) return chosenNames[0] if chosenNames else "" diff --git a/python/GafferUI/i18n.py b/python/GafferUI/i18n.py new file mode 100644 index 00000000000..7416aa6518b --- /dev/null +++ b/python/GafferUI/i18n.py @@ -0,0 +1,680 @@ +import functools +import gettext +import json +import os +import pathlib +import re +import unicodedata + + +# --------------------------------------------------------------------------- +# i18n preferences config file +# --------------------------------------------------------------------------- +# Stored at ~/gaffer/i18n.json so it can be read *before* the full +# Preferences node is available. The file is a small JSON dict: +# { "language": "es", "translateNodeNames": true, "translateTooltips": true } + +_I18N_CONF = pathlib.Path( "~/gaffer/i18n.json" ).expanduser() + +def _readConf() : + """Return the persisted i18n preferences dict, or empty dict.""" + try : + with open( _I18N_CONF, "r", encoding = "utf-8" ) as f : + return json.load( f ) + except Exception : + return {} + +def saveConf( language, translateNodeNames, translateTooltips ) : + """Persist the i18n preferences to ~/gaffer/i18n.json.""" + _I18N_CONF.parent.mkdir( parents = True, exist_ok = True ) + with open( _I18N_CONF, "w", encoding = "utf-8" ) as f : + json.dump( + { + "language" : language, + "translateNodeNames" : translateNodeNames, + "translateTooltips" : translateTooltips, + }, + f, indent = 2 + ) + +# --------------------------------------------------------------------------- +# Determine effective language +# --------------------------------------------------------------------------- +# Priority: stored preference > GAFFER_LANG env var > "en" + +_conf = _readConf() +_LANG = _conf.get( "language", os.environ.get( "GAFFER_LANG", "en" ) ) +# Publish back so other code can query it +os.environ["GAFFER_LANG"] = _LANG + +_translateNodeNames = _conf.get( "translateNodeNames", True ) +_translateTooltips = _conf.get( "translateTooltips", True ) + +# --------------------------------------------------------------------------- +# Load gettext catalog +# --------------------------------------------------------------------------- + +_LOCALE_DIR = os.path.join( os.path.dirname( __file__ ), "locale" ) + +_trans = gettext.translation( + "gaffer", + _LOCALE_DIR, + languages = [ _LANG ], + fallback = True, +) + +# --------------------------------------------------------------------------- +# Translation functions +# --------------------------------------------------------------------------- + +def _normalize( text ) : + """Collapse whitespace so triple-quoted source strings match + single-line .po msgid entries.""" + return " ".join( text.split() ) + +def _( text ) : + normalized = _normalize( text ) + translated = _trans.gettext( normalized ) + if translated != normalized : + return translated + # Fallback: try original text in case .po uses the raw form + return _trans.gettext( text ) + +def stripAccents( text ) : + """Remove diacritical marks AND ñ/Ñ for IECoreGL rendering. + + IECoreGL::Font indexes glyphs via ``char c`` which iterates + over raw UTF-8 bytes. Multi-byte characters like ñ (0xC3 0xB1) + produce two wrong glyphs instead of one correct one. So we must + replace ñ→n, Ñ→N in addition to stripping combining marks. + """ + text = text.replace( "\u00f1", "n" ).replace( "\u00d1", "N" ) + nfd = unicodedata.normalize( "NFD", text ) + return "".join( c for c in nfd if unicodedata.category( c ) != "Mn" ) + +def pgettext( context, text ) : + """Translate *text* with a disambiguating *context* (msgctxt). + + Uses the standard gettext convention of storing the lookup key + as ``context + "\\x04" + text``. If no translation is found the + original *text* is returned (never the combined key). + """ + msgid = context + "\x04" + text + translated = _trans.gettext( msgid ) + if translated == msgid : + return text + return translated + +# --------------------------------------------------------------------------- +# Query helpers – used by the UI to check toggle states +# --------------------------------------------------------------------------- + +def language() : + return _LANG + +def translateNodeNames() : + return _translateNodeNames + +def translateTooltips() : + return _translateTooltips + +# --------------------------------------------------------------------------- +# Node type label helper +# --------------------------------------------------------------------------- + +_camelCaseRe = re.compile( r"(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-zA-Z])(?=[0-9])" ) + +def _camelToSpaced( name ) : + """Convert CamelCase to spaced form: ``SystemCommand`` → ``System Command``.""" + return _camelCaseRe.sub( " ", name ) + +# Standard acronym / display corrections applied to shader names. +# Matches the replacements used by Cycles and Arnold ShaderMenu.py. +_SHADER_DISPLAY_CORRECTIONS = [ + ( "Hsv", "HSV" ), ( "Rgb", "RGB" ), ( "Xyz", "XYZ" ), ( "Bw", "BW" ), + ( " To ", " to " ), ( "Aov", "AOV" ), ( "Uvmap", "UV Map" ), + ( "Ies", "IES" ), ( "Bsdf", "BSDF" ), ( "Non Uniform", "Nonuniform" ), + ( "Uv ", "UV " ), ( "Osl", "OSL" ), +] + +def getNodeLabel( typeName, node = None ) : + """Return the translated UI label for a node type name. + + *typeName* is the short C++ class name, e.g. ``"Rectangle"" + or ``"SystemCommand"``. The name is converted to spaced form + (``"System Command"``) before lookup so that existing menu + translations are reused. When ``translateNodeNames`` is + disabled the spaced English name is returned unchanged. + + If *node* is provided and it has a ``"name"`` StringPlug (i.e. + it is a Shader or Light node), the specific shader/light name + is used instead of the generic C++ wrapper type, so that e.g. + each USD shader shows its own name rather than all of them + showing "USD Shader". + """ + # Extract the shader name (a hashable string) so the expensive + # work can be memoized by _getNodeLabelCached. + shaderName = None + if node is not None : + try : + import GafferScene + isShaderOrLight = isinstance( node, ( GafferScene.Shader, GafferScene.Light ) ) + except Exception : + isShaderOrLight = False + + if isShaderOrLight : + try : + import GafferOSL + if isinstance( node, GafferOSL.OSLCode ) : + isShaderOrLight = False + except Exception : + pass + + if isShaderOrLight : + try : + shaderName = node["name"].getValue() or None + except Exception : + pass + + return _getNodeLabelCached( typeName, shaderName ) + +@functools.lru_cache( maxsize = 512 ) +def _getNodeLabelCached( typeName, shaderName ) : + """Cached inner implementation of getNodeLabel. + + Both arguments are hashable strings (or None). The regex + splitting, acronym corrections, and gettext lookup are + performed once per unique (typeName, shaderName) pair. + """ + if shaderName is not None : + # Strip category path — only show the leaf name. + # Original Gaffer sets the node name to the leaf via + # __nodeName() which does shaderName.rpartition("/")[-1]. + if "/" in shaderName : + shaderName = shaderName.rsplit( "/", 1 )[-1] + + parts = shaderName.split( "_" ) + spacedParts = [ _camelToSpaced( x ) for x in parts ] + # Title-case each part so display corrections ("Bsdf" → "BSDF") + # and .po lookups ("Principled BSDF") work for lowercase shader + # names like "principled_bsdf". + spacedParts = [ + p[0].upper() + p[1:] if p and p[0].islower() else p + for p in spacedParts + ] + spaced = " ".join( spacedParts ) + + if not _translateNodeNames : + for orig, repl in _SHADER_DISPLAY_CORRECTIONS : + spaced = spaced.replace( orig, repl ) + return spaced + + tr = _( spaced ) + if tr != spaced : + return tr + for orig, repl in _SHADER_DISPLAY_CORRECTIONS : + spaced = spaced.replace( orig, repl ) + return _( spaced ) + + spaced = _camelToSpaced( typeName ) + if not _translateNodeNames : + return spaced + return _( spaced ) + +# --------------------------------------------------------------------------- +# Word-by-word label translation for dynamic plug/parameter names +# --------------------------------------------------------------------------- + +# Color / vector component translation (RGB → RVA, XYZ unchanged) +_COLOR_COMPONENT_MAP = { + "r" : "R", "g" : "V", "b" : "A", + "x" : "X", "y" : "Y", "z" : "Z", +} + +def translateColorComponent( name ) : + """Translate a single-char color/vector component name. + + Returns the translated character or None if not applicable. + """ + if not _translateNodeNames : + return None + lower = name.lower() + if lower in _COLOR_COMPONENT_MAP : + return _COLOR_COMPONENT_MAP[lower] + return None + +# Common multi-word phrases that require Spanish noun-adjective order. +# Checked BEFORE word-by-word fallback in translateLabel(). +_PHRASE_MAP = { + "default value" : "valor predeterminado", + "default values" : "valores predeterminados", + "default color" : "color predeterminado", + "default name" : "nombre predeterminado", + "default label" : "etiqueta predeterminada", + "default mode" : "modo predeterminado", + "total internal reflection" : "reflexión interna total", + "channel name" : "nombre de canal", + "file name" : "nombre de archivo", + "custom value" : "valor personalizado", + "custom name" : "nombre personalizado", + "enabled value" : "valor habilitado", + "active value" : "valor activo", + "input value" : "valor de entrada", + "output value" : "valor de salida", + "source value" : "valor de origen", + "constant value" : "valor constante", + "maximum value" : "valor máximo", + "minimum value" : "valor mínimo", + "specular color" : "color especular", + "specular colour" : "color especular", + "diffuse color" : "color difuso", + "diffuse colour" : "color difuso", + "emission color" : "color de emisión", + "emission colour" : "color de emisión", + "refraction color" : "color de refracción", + "refraction colour" : "color de refracción", + "reflection color" : "color de reflexión", + "reflection colour" : "color de reflexión", + "ambient occlusion" : "oclusión ambiental", + "focal length" : "longitud focal", + "aspect ratio" : "proporción de aspecto", + "pattern match" : "coincidencia de patrón", + "pass through" : "pasar a través", +} + +_WORD_MAP = { + # Common plug/parameter words + "color" : "color", "colour" : "color", + "colors" : "colores", "colours" : "colores", + "values" : "valores", "value" : "valor", + "names" : "nombres", "name" : "nombre", + "visible" : "visible", + "in" : "en", "of" : "de", "the" : "el", "a" : "un", "an" : "un", + "and" : "y", "or" : "o", "to" : "a", "for" : "para", "with" : "con", + "from" : "desde", "by" : "por", "on" : "en", "at" : "en", + "diffuse" : "difuso", "reflections" : "reflexiones", "refractions" : "refracciones", + "reflection" : "reflexión", "refraction" : "refracción", + "specular" : "especular", "glossy" : "brillante", + "emission" : "emisión", "emissive" : "emisivo", + "ambient" : "ambiental", "occlusion" : "oclusión", + "shadow" : "sombra", "shadows" : "sombras", + "light" : "luz", "lights" : "luces", + "camera" : "cámara", "cameras" : "cámaras", + "input" : "entrada", "output" : "salida", + "inputs" : "entradas", "outputs" : "salidas", + "image" : "imagen", "images" : "imágenes", + "scene" : "escena", "scenes" : "escenas", + "object" : "objeto", "objects" : "objetos", + "filter" : "filtro", "filters" : "filtros", + "pass" : "pase", "passes" : "pases", + "render" : "render", "renderer" : "renderer", + "shader" : "shader", "shaders" : "shaders", + "material" : "material", "materials" : "materiales", + "texture" : "textura", "textures" : "texturas", + "normal" : "normal", "normals" : "normales", + "position" : "posición", "positions" : "posiciones", + "rotation" : "rotación", "scale" : "escala", + "transform" : "transformación", "translation" : "traslación", + "matrix" : "matriz", + "width" : "ancho", "height" : "alto", "depth" : "profundidad", + "size" : "tamaño", "radius" : "radio", "angle" : "ángulo", + "distance" : "distancia", "offset" : "desplazamiento", + "min" : "mín", "max" : "máx", "minimum" : "mínimo", "maximum" : "máximo", + "default" : "predeterminado", "custom" : "personalizado", + "enabled" : "habilitado", "disabled" : "deshabilitado", + "enable" : "habilitar", "disable" : "deshabilitar", + "type" : "tipo", "mode" : "modo", "method" : "método", + "source" : "origen", "destination" : "destino", "target" : "objetivo", + "weight" : "peso", "weights" : "pesos", + "intensity" : "intensidad", "brightness" : "brillo", + "exposure" : "exposición", "gamma" : "gamma", + "contrast" : "contraste", "saturation" : "saturación", + "hue" : "tono", "opacity" : "opacidad", + "transparency" : "transparencia", "alpha" : "alfa", + "red" : "rojo", "green" : "verde", "blue" : "azul", + "white" : "blanco", "black" : "negro", + "clamp" : "limitar", "clamps" : "limitaciones", + "multiply" : "multiplicar", "divide" : "dividir", + "add" : "añadir", "subtract" : "restar", + "mix" : "mezclar", "blend" : "mezclar", + "invert" : "invertir", "reverse" : "invertir", + "flip" : "voltear", "mirror" : "espejo", + "smooth" : "suave", "smoothing" : "suavizado", + "interpolation" : "interpolación", "samples" : "muestras", "sample" : "muestra", + "density" : "densidad", "frequency" : "frecuencia", + "amplitude" : "amplitud", "phase" : "fase", + "seed" : "semilla", "random" : "aleatorio", + "threshold" : "umbral", "tolerance" : "tolerancia", + "boundary" : "límite", "bounds" : "límites", + "subdivision" : "subdivisión", "iterations" : "iteraciones", + "count" : "cantidad", "number" : "número", + "index" : "índice", "level" : "nivel", + "layer" : "capa", "layers" : "capas", + "channel" : "canal", "channels" : "canales", + "mask" : "máscara", "masks" : "máscaras", + "area" : "área", "volume" : "volumen", + "surface" : "superficie", "mesh" : "malla", + "vertex" : "vértice", "vertices" : "vértices", + "edge" : "arista", "edges" : "aristas", + "face" : "cara", "faces" : "caras", + "point" : "punto", "points" : "puntos", + "curve" : "curva", "curves" : "curvas", + "line" : "línea", "lines" : "líneas", + "primitive" : "primitiva", "variable" : "variable", + "attribute" : "atributo", "attributes" : "atributos", + "option" : "opción", "options" : "opciones", + "parameter" : "parámetro", "parameters" : "parámetros", + "property" : "propiedad", "properties" : "propiedades", + "set" : "conjunto", "sets" : "conjuntos", + "group" : "grupo", "groups" : "grupos", + "path" : "ruta", "paths" : "rutas", + "file" : "archivo", "files" : "archivos", + "directory" : "directorio", + "format" : "formato", "resolution" : "resolución", + "frame" : "fotograma", "frames" : "fotogramas", + "time" : "tiempo", "duration" : "duración", + "start" : "inicio", "end" : "fin", + "near" : "cercano", "far" : "lejano", + "clip" : "recortar", "crop" : "recorte", + "top" : "superior", "bottom" : "inferior", + "left" : "izquierda", "right" : "derecha", + "front" : "frontal", "back" : "posterior", + "up" : "arriba", "down" : "abajo", + "inside" : "interior", "outside" : "exterior", + "global" : "global", "local" : "local", + "world" : "mundo", "space" : "espacio", + "coordinate" : "coordenada", "coordinates" : "coordenadas", + "axis" : "eje", "pivot" : "pivote", + "center" : "centro", "origin" : "origen", + "visibility" : "visibilidad", + "display" : "visualización", "compare" : "comparación", + "preview" : "previsualización", + "background" : "fondo", "foreground" : "primer plano", + "scatter" : "dispersión", "absorption" : "absorción", + "roughness" : "rugosidad", "metallic" : "metálico", + "clearcoat" : "barniz", "sheen" : "brillo sedoso", + "subsurface" : "subsuperficie", "transmission" : "transmisión", + "anisotropic" : "anisotrópico", "anisotropy" : "anisotropía", + "tangent" : "tangente", "tangents" : "tangentes", + "bitangent" : "bitangente", + "displacement" : "desplazamiento", + "bump" : "relieve", + "mapping" : "mapeo", "projection" : "proyección", + "repeat" : "repetición", "tile" : "mosaico", + "wrap" : "envolver", "clipping" : "acotamiento", + "blur" : "desenfoque", "sharp" : "nítido", + "noise" : "ruido", "pattern" : "patrón", + "falloff" : "atenuación", "decay" : "decaimiento", + "cone" : "cono", "sphere" : "esfera", + "cylinder" : "cilindro", "disk" : "disco", "disc" : "disco", + "quad" : "cuadrilátero", "rectangle" : "rectángulo", + "cube" : "cubo", "box" : "caja", + "spot" : "foco", "directional" : "direccional", + "distant" : "distante", "dome" : "domo", + "environment" : "entorno", + "volume" : "volumen", "fog" : "niebla", + "absolute" : "absoluto", "relative" : "relativo", + "auto" : "automático", "manual" : "manual", + "order" : "orden", "priority" : "prioridad", + "label" : "etiqueta", "description" : "descripción", + "version" : "versión", + "prefix" : "prefijo", "suffix" : "sufijo", + "category" : "categoría", + "user" : "usuario", + "data" : "datos", + "result" : "resultado", "results" : "resultados", + "context" : "contexto", + "expression" : "expresión", + "condition" : "condición", + "active" : "activo", "inactive" : "inactivo", + "exists" : "existe", "missing" : "faltante", + "exact" : "exacto", "match" : "coincidencia", + "inherit" : "heredar", "inherited" : "heredado", + "override" : "sobrescribir", + "delete" : "eliminar", "remove" : "eliminar", + "copy" : "copiar", "paste" : "pegar", + "connect" : "conectar", "disconnect" : "desconectar", + "connection" : "conexión", "connections" : "conexiones", + # Hierarchy terms (fixed convention) + "parent" : "primario", "child" : "secundario", + "children" : "secundarios", + # Gaffer architecture terms (fixed convention) + "plug" : "conector", "plugs" : "conectores", + "widget" : "componente", "widgets" : "componentes", + "gadget" : "grafeto", "gadgets" : "grafetos", + # Additional plug/parameter words + "window" : "ventana", + "variables" : "variables", + "row" : "fila", "rows" : "filas", + "cells" : "celdas", "cell" : "celda", + "resolved" : "resueltas", + "compression" : "compresión", + "command" : "comando", + "deep" : "profundo", + "globals" : "globales", + "batch" : "lote", + "strength" : "fuerza", + "shutter" : "obturador", + "elevation" : "elevación", + "product" : "producto", + "sum" : "suma", + "immediate" : "inmediato", + "isolated" : "aislado", + "process" : "procesar", + "calculate" : "calcular", + "pixel" : "píxel", + "aspect" : "aspecto", + "ratio" : "proporción", + "aperture" : "apertura", + "focal" : "focal", + "length" : "longitud", + "field" : "campo", + "factor" : "factor", + "quality" : "calidad", + "triangle" : "triángulo", + "rule" : "regla", + "overwrite" : "sobrescribir", + "existing" : "existente", + "hide" : "ocultar", + "ignore" : "ignorar", + "keep" : "mantener", + "reference" : "referencia", + "use" : "usar", + "regular" : "regular", + "scaling" : "escalado", + "require" : "requerir", + "requires" : "requiere", + "sequence" : "secuencia", + "execution" : "ejecución", + "multiplier" : "multiplicador", + "setting" : "ajuste", "settings" : "ajustes", + "affect" : "afectar", + "polygon" : "polígono", + "part" : "parte", + "optional" : "opcional", + "orthographic" : "ortográfico", + "override" : "sobrescritura", "overrides" : "sobrescrituras", + "look" : "ver", + "through" : "a través", + "planes" : "planos", + "non" : "no", + "dynamic" : "dinámico", + "script" : "script", + "load" : "cargar", + "errors" : "errores", + "environment" : "entorno", + # Scene Inspector property names + "bound" : "límite", "topology" : "topología", + "constant" : "constante", "uniform" : "uniforme", + "varying" : "variable", + "corners" : "esquinas", "creases" : "pliegues", + "interpolate" : "interpolar", + "linear" : "lineal", "per" : "por", + "ids" : "IDs", "boolean" : "booleano", + "indices" : "índices", "sharpnesses" : "agudezas del pliegue", + "lengths" : "longitudes", "sharpness" : "agudeza del pliegue", + "shear" : "sesgar", + # Technical terms kept as-is + "tir" : "TIR", + "aov" : "VAS", "uv" : "UV", "rgb" : "RVA", "rgba" : "RVAA", + "hsv" : "TSV", + "sss" : "SSS", "ior" : "IOR", "hdri" : "HDRI", + "id" : "ID", + "overscan" : "overscan", + "frustum" : "frustum", + "spline" : "spline", + "fallback" : "respaldo", + # Shader material words + "coating" : "recubrimiento", + "thin" : "delgado", "thick" : "grueso", + "flat" : "plano", + "glass" : "vidrio", "metal" : "metal", + "skin" : "piel", "hair" : "cabello", + "fabric" : "tela", "velvet" : "terciopelo", "satin" : "satén", + "matte" : "mate", + "grain" : "granulación", + "bias" : "sesgo", "power" : "potencia", + "range" : "rango", + "filename" : "nombre de archivo", + "gain" : "ganancia", + "success" : "éxito", + "normalize" : "normalizar", + "bright" : "brillo", + "diameter" : "diámetro", + "orientation" : "orientación", + "backscatter" : "retrodispersión", + "flame" : "llama", + "extension" : "extensión", +} + +def translateLabel( label ) : + """Translate a UI label, using exact .po match first, then word-by-word fallback. + + Useful for dynamic labels like shader parameter names that can't all be + pre-added to the .po file. + """ + if not _translateNodeNames or _LANG == "en" : + return label + + # USD / Cycles attribute names use namespace:name format + # (e.g. "Shadow:color", "Cycles:use glossy") — never translate. + if ":" in label : + return label + + # Try exact match first + exact = _( label ) + if exact != label : + return exact + + # Expand CamelCase into spaced form before word-by-word translation + expanded = _camelCaseRe.sub( " ", label ) + # Replace underscores with spaces so words like "Refraction_" match + expanded = expanded.replace( "_", " " ) + expanded = " ".join( expanded.split() ) # collapse extra spaces + + # Try exact match on expanded form + if expanded != label : + exact2 = _( expanded ) + if exact2 != expanded : + return exact2 + + # Try display-name form (capitalize each word) to match .po entries + # that use "Cast Shadow" while CamelCase expansion gives "cast Shadow". + displayForm = " ".join( w.capitalize() for w in expanded.split() ) + if displayForm != expanded : + exact3 = _( displayForm ) + if exact3 != displayForm : + return exact3 + + # Check phrase map (Spanish noun-adjective reordering) + expLower = expanded.lower() + if expLower in _PHRASE_MAP : + tr = _PHRASE_MAP[expLower] + # Capitalise first letter to match original label casing + if expanded and expanded[0].isupper() and tr and tr[0].islower() : + tr = tr[0].upper() + tr[1:] + return tr + + # Word-by-word fallback with n-gram phrase matching. + # Tries 3-word, then 2-word phrases from _PHRASE_MAP before + # falling back to single-word _WORD_MAP lookup. + words = expanded.split( " " ) + translated = [] + idx = 0 + while idx < len( words ) : + + # Try 3-word phrase + if idx + 2 < len( words ) : + tri = " ".join( words[idx:idx+3] ).lower() + if tri in _PHRASE_MAP : + tr = _PHRASE_MAP[tri] + if idx == 0 and tr and tr[0].islower() : + tr = tr[0].upper() + tr[1:] + translated.append( tr ) + idx += 3 + continue + + # Try 2-word phrase + if idx + 1 < len( words ) : + bi = " ".join( words[idx:idx+2] ).lower() + if bi in _PHRASE_MAP : + tr = _PHRASE_MAP[bi] + if idx == 0 and tr and tr[0].islower() : + tr = tr[0].upper() + tr[1:] + translated.append( tr ) + idx += 2 + continue + + word = words[idx] + + # Single-character words: translate color components, keep others + if len( word ) <= 1 : + lw = word.lower() + if lw in _COLOR_COMPONENT_MAP : + translated.append( _COLOR_COMPONENT_MAP[lw] ) + else : + translated.append( word ) + idx += 1 + continue + + # Handle dotted compound labels (e.g. "Fallback.r" → "Respaldo.R") + if "." in word : + parts = word.split( "." ) + trParts = [] + for j, part in enumerate( parts ) : + lp = part.lower() + if len( part ) == 1 and lp in _COLOR_COMPONENT_MAP : + trParts.append( _COLOR_COMPONENT_MAP[lp] ) + elif lp in _WORD_MAP : + tp = _WORD_MAP[lp] + if idx == 0 and j == 0 and tp and tp[0].islower() : + tp = tp[0].upper() + tp[1:] + trParts.append( tp ) + else : + trParts.append( part ) + translated.append( ".".join( trParts ) ) + idx += 1 + continue + + lower = word.lower() + if lower in _WORD_MAP : + tr = _WORD_MAP[lower] + # Capitalise first word only (Spanish rule) + if idx == 0 and tr and tr[0].islower() : + tr = tr[0].upper() + tr[1:] + translated.append( tr ) + else : + # Keep untranslatable words as-is (proper nouns, acronyms, etc.) + translated.append( word ) + idx += 1 + + return " ".join( translated ) + +# --------------------------------------------------------------------------- +# Search helper – accent-stripping normalisation +# --------------------------------------------------------------------------- + +def normalizeForSearch( text ) : + """Lower-case *text* and strip combining diacritical marks.""" + nfkd = unicodedata.normalize( "NFKD", text ) + return "".join( c for c in nfkd if not unicodedata.combining( c ) ).lower() diff --git a/python/GafferUI/locale/es/LC_MESSAGES/.placeholder b/python/GafferUI/locale/es/LC_MESSAGES/.placeholder new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/GafferUI/locale/es/LC_MESSAGES/gaffer.mo b/python/GafferUI/locale/es/LC_MESSAGES/gaffer.mo new file mode 100644 index 00000000000..aeb782ccbe0 Binary files /dev/null and b/python/GafferUI/locale/es/LC_MESSAGES/gaffer.mo differ diff --git a/python/GafferUI/locale/es/LC_MESSAGES/gaffer.po b/python/GafferUI/locale/es/LC_MESSAGES/gaffer.po new file mode 100644 index 00000000000..752e7d3e0a6 --- /dev/null +++ b/python/GafferUI/locale/es/LC_MESSAGES/gaffer.po @@ -0,0 +1,14678 @@ +msgid "" +msgstr "" +"Project-Id-Version: gaffer 1.6.12.0\n" +"POT-Creation-Date: 2026-02-21 00:00+0000\n" +"PO-Revision-Date: 2026-02-21 00:00+0000\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "File" +msgstr "Archivo" + +msgid "Edit" +msgstr "Editar" + +msgid "Layout" +msgstr "Diseño" + +msgid "Help" +msgstr "Ayuda" + +msgid "New" +msgstr "Nuevo" + +msgid "Open..." +msgstr "Abrir..." + +msgid "Open" +msgstr "Abrir" + +msgid "Open Recent" +msgstr "Abrir reciente" + +msgid "Save" +msgstr "Guardar" + +msgid "Save As..." +msgstr "Guardar como..." + +msgid "Save script" +msgstr "Guardar script" + +msgid "Open script" +msgstr "Abrir script" + +msgid "Revert To Saved" +msgstr "Revertir a guardado" + +msgid "Export Selection..." +msgstr "Exportar selección..." + +msgid "Export selection" +msgstr "Exportar selección" + +msgid "Import..." +msgstr "Importar..." + +msgid "Import" +msgstr "Importar" + +msgid "Import script" +msgstr "Importar script" + +msgid "Settings..." +msgstr "Configuración..." + +msgid "Settings" +msgstr "Configuración" + +msgid "Discard Unsaved Changes?" +msgstr "¿Descartar cambios no guardados?" + +msgid "There are unsaved changes which will be lost. Discard them and revert?" +msgstr "Hay cambios no guardados que se perderán. ¿Descartarlos y revertir?" + +msgid "Revert" +msgstr "Revertir" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "Backup Available" +msgstr "Copia de seguridad disponible" + +msgid "A more recent backup is available. Open backup instead?" +msgstr "Hay una copia de seguridad más reciente. ¿Abrir la copia de seguridad en su lugar?" + +msgid "Open Backup" +msgstr "Abrir copia de seguridad" + +msgid "Loading" +msgstr "Cargando" + +msgid "Saving File" +msgstr "Guardando archivo" + +msgid "None Available" +msgstr "Ninguno disponible" + +msgid "Errors Occurred During Loading" +msgstr "Ocurrieron errores durante la carga" + +msgid "Oy vey" +msgstr "Vaya" + +msgid "About Gaffer..." +msgstr "Acerca de Gaffer..." + +msgid "Preferences..." +msgstr "Preferencias..." + +msgid "Documentation..." +msgstr "Documentación..." + +msgid "Quit" +msgstr "Salir" + +msgid "Preferences" +msgstr "Preferencias" + +msgid "Close" +msgstr "Cerrar" + +msgid "Undo" +msgstr "Deshacer" + +msgid "Redo" +msgstr "Rehacer" + +msgid "Cut" +msgstr "Cortar" + +msgid "Copy" +msgstr "Copiar" + +msgid "Paste" +msgstr "Pegar" + +msgid "Duplicate with Inputs" +msgstr "Duplicar con entradas" + +msgid "Delete" +msgstr "Eliminar" + +msgid "Rename" +msgstr "Renombrar" + +msgid "Find..." +msgstr "Buscar..." + +msgid "Arrange" +msgstr "Organizar" + +msgid "Select All" +msgstr "Seleccionar todo" + +msgid "Select None" +msgstr "Deseleccionar" + +msgid "Errors Occurred During Pasting" +msgstr "Ocurrieron errores al pegar" + +msgid "Errors Occurred During Duplication" +msgstr "Ocurrieron errores al duplicar" + +msgid "Enter name" +msgstr "Introducir nombre" + +msgid "Save Layout" +msgstr "Guardar diseño" + +msgid "New Layout..." +msgstr "Nuevo diseño..." + +msgid "The file \"{file}\" has unsaved changes. Do you want to discard them?" +msgstr "Archivo \"{file}\" tiene cambios sin guardar. ¿Quieres descartarlos?" + +msgid "Graph Editor" +msgstr "Editor de grafos" + +msgid "Node Editor" +msgstr "Editor de nodos" + +msgid "Viewer" +msgstr "Visor" + +msgid "Scene Inspector" +msgstr "Inspector de escena" + +msgid "Set Editor" +msgstr "Editor de sets" + +msgid "Hierarchy View" +msgstr "Vista de jerarquía" + +msgid "Image Inspector" +msgstr "Inspector de imagen" + +msgid "Python Editor" +msgstr "Editor de Python" + +msgid "Light Editor" +msgstr "Editor de luces" + +msgid "Render Pass Editor" +msgstr "Editor de pases de render" + +msgid "Attribute Editor" +msgstr "Editor de atributos" + +msgid "Animation Editor" +msgstr "Editor de animación" + +msgid "Primitive Inspector" +msgstr "Inspector de primitivas" + +msgid "UV Inspector" +msgstr "Inspector UV" + +msgid "Timeline" +msgstr "Línea de tiempo" + +msgid "Spreadsheet Editor" +msgstr "Editor de hoja de cálculo" + +msgid "Node Graph Not Editable" +msgstr "Grafo de nodos no editable" + +msgid "Scene" +msgstr "Escena" + +msgid "Image" +msgstr "Imagen" + +msgid "Utility" +msgstr "Utilidad" + +msgid "Dispatch" +msgstr "Despacho" + +msgid "Cycles" +msgstr "Cycles" + +msgid "OSL" +msgstr "OSL" + +msgid "VDB" +msgstr "VDB" + +msgid "USD" +msgstr "USD" + +msgid "Shader" +msgstr "Shader" + +msgid "Light" +msgstr "Luz" + +msgid "Globals" +msgstr "Globales" + +msgid "Attributes" +msgstr "Atributos" + +msgid "Shader Ball" +msgstr "Esfera de shader" + +msgid "Source" +msgstr "Fuente" + +msgid "Object" +msgstr "Objeto" + +msgid "Transform" +msgstr "Transformar" + +msgid "Context" +msgstr "Contexto" + +msgid "Filter" +msgstr "Filtro" + +msgid "Type" +msgstr "Tipo" + +msgid "Color" +msgstr "Color" + +msgid "Merge" +msgstr "Fusionar" + +msgid "Channel" +msgstr "Canal" + +msgid "Warp" +msgstr "Deformar" + +msgid "Shape" +msgstr "Forma" + +msgid "Text" +msgstr "Texto" + +msgid "Variables" +msgstr "Variables" + +msgid "Execute" +msgstr "Ejecutar" + +msgid "OpenColorIO" +msgstr "OpenColorIO" + +msgid "User" +msgstr "Usuario" + +msgid "File Name" +msgstr "Nombre de archivo" + +msgid "Frame Range" +msgstr "Rango de fotogramas" + +msgid "Frames Per Second" +msgstr "Fotogramas por segundo" + +msgid "Default Format" +msgstr "Formato predeterminado" + +msgid "Render Pass" +msgstr "Pase de render" + +msgid "Edit Target" +msgstr "Objetivo de edición" + +msgid "Name" +msgstr "Nombre" + +msgid "Enabled" +msgstr "Habilitado" + +msgid "In" +msgstr "Entrada" + +msgid "Out" +msgstr "Salida" + +msgid "Interior" +msgstr "Interior" + +msgid "Exterior" +msgstr "Exterior" + +msgid "Search..." +msgstr "Buscar..." + +msgid "More Results" +msgstr "Más resultados" + +msgid "Gaffer" +msgstr "Gaffer" + +msgid "Click to modify the layout" +msgstr "Hacer clic para modificar el diseño" + +msgid "Detach" +msgstr "Separar" + +msgid "Detach Panel" +msgstr "Separar panel" + +msgid "Remove Panel" +msgstr "Eliminar panel" + +msgid "Hide Tabs" +msgstr "Ocultar pestañas" + +msgid "Show Tabs" +msgstr "Mostrar pestañas" + +msgid "Split Left" +msgstr "Dividir izquierda" + +msgid "Split Right" +msgstr "Dividir derecha" + +msgid "Split Bottom" +msgstr "Dividir abajo" + +msgid "Split Top" +msgstr "Dividir arriba" + +msgid "Tab Actions" +msgstr "Acciones de pestaña" + +msgid "Continue" +msgstr "Continuar" + +msgid "Cancelling..." +msgstr "Cancelando..." + +msgid "Error" +msgstr "Error" + +msgid "Warning" +msgstr "Advertencia" + +msgid "Focus a node to view" +msgstr "Enfocar un nodo para visualizar" + +msgid "Select a node to view" +msgstr "Seleccionar un nodo para visualizar" + +msgid "Toggle between list and tree views" +msgstr "Alternar entre vista de lista y árbol" + +msgid "Bookmarks" +msgstr "Marcadores" + +msgid "Refresh view" +msgstr "Actualizar vista" + +msgid "Up one level" +msgstr "Subir un nivel" + +msgid "Add Bookmark..." +msgstr "Añadir marcador..." + +msgid "Save Bookmark" +msgstr "Guardar marcador" + +msgid "Execute Selection" +msgstr "Ejecutar selección" + +msgid "Clear" +msgstr "Limpiar" + +msgid "Node Name" +msgstr "Nombre del nodo" + +msgid "Revert to Defaults" +msgstr "Revertir a valores predeterminados" + +msgid "Unlock" +msgstr "Desbloquear" + +msgid "Lock" +msgstr "Bloquear" + +msgid "Bookmarked" +msgstr "Marcado" + +msgid "Numeric Bookmark" +msgstr "Marcador numérico" + +msgid "Connect Bookmark" +msgstr "Conectar marcador" + +msgid "Copy Value" +msgstr "Copiar valor" + +msgid "Paste Value" +msgstr "Pegar valor" + +msgid "Edit input..." +msgstr "Editar entrada..." + +msgid "Remove input" +msgstr "Eliminar entrada" + +msgid "Default" +msgstr "Predeterminado" + +msgid "User Default" +msgstr "Predeterminado del usuario" + +msgid "Preset" +msgstr "Predefinido" + +msgid "Set Key" +msgstr "Establecer clave" + +msgid "Remove Key" +msgstr "Eliminar clave" + +msgid "Gang" +msgstr "Vincular" + +msgid "Ungang" +msgstr "Desvincular" + +msgid "Reset Default Values" +msgstr "Restablecer valores predeterminados" + +msgid "Export Reference..." +msgstr "Exportar referencia..." + +msgid "Import Reference..." +msgstr "Importar referencia..." + +msgid "Upgrade to use BoxIO" +msgstr "Actualizar para usar BoxIO" + +msgid "Export without current values?" +msgstr "¿Exportar sin los valores actuales?" + +msgid "Export reference" +msgstr "Exportar referencia" + +msgid "Import reference" +msgstr "Importar referencia" + +msgid "Error Importing Reference" +msgstr "Error al importar referencia" + +msgid "Promote to %s" +msgstr "Promover a %s" + +msgid "Promote %s to %s" +msgstr "Promover %s a %s" + +msgid "Unpromote %s from %s" +msgstr "Despromover %s de %s" + +msgid "Unpromote from %s" +msgstr "Despromover de %s" + +msgid "Reset Default Value" +msgstr "Restablecer valor predeterminado" + +msgid "Duplicate as Box" +msgstr "Duplicar como box" + +msgid "Set Color..." +msgstr "Establecer color..." + +msgid "Show Name" +msgstr "Mostrar nombre" + +msgid "Edit UI..." +msgstr "Editar interfaz..." + +msgid "Details" +msgstr "Detalles" + +msgid "OK" +msgstr "Aceptar" + +msgid "Connections" +msgstr "Conexiones" + +msgid "Show Input Connections" +msgstr "Mostrar conexiones de entrada" + +msgid "Show Output Connections" +msgstr "Mostrar conexiones de salida" + +msgid "Show Input Labels" +msgstr "Mostrar etiquetas de entrada" + +msgid "Show Output Labels" +msgstr "Mostrar etiquetas de salida" + +msgid "Focus" +msgstr "Enfocar" + +msgid "Show Contents..." +msgstr "Mostrar contenido..." + +msgid "Inputs" +msgstr "Entradas" + +msgid "Add Inputs" +msgstr "Añadir entradas" + +msgid "Upstream" +msgstr "Ascendente" + +msgid "Add Upstream" +msgstr "Añadir ascendente" + +msgid "Outputs" +msgstr "Salidas" + +msgid "Add Outputs" +msgstr "Añadir salidas" + +msgid "Downstream" +msgstr "Descendente" + +msgid "Add Downstream" +msgstr "Añadir descendente" + +msgid "Add All" +msgstr "Añadir todo" + +msgid "Select Connected" +msgstr "Seleccionar conectados" + +msgid "Export" +msgstr "Exportar" + +msgid "Discard" +msgstr "Descartar" + +msgid "Dispatch Tasks" +msgstr "Despachar tareas" + +msgid "Dispatcher" +msgstr "Despachador" + +msgid "Context Variables" +msgstr "Variables de contexto" + +msgid "Back" +msgstr "Atrás" + +msgid "Dispatching..." +msgstr "Despachando..." + +msgid "Failed" +msgstr "Fallido" + +msgid "Completed" +msgstr "Completado" + +msgid "Errors Occurred During Dispatch" +msgstr "Ocurrieron errores durante el despacho" + +msgid "Kill Selected Jobs" +msgstr "Terminar trabajos seleccionados" + +msgid "Remove Selected Jobs" +msgstr "Eliminar trabajos seleccionados" + +msgid "Log" +msgstr "Registro" + +msgid "Properties" +msgstr "Propiedades" + +msgid "Job Directory" +msgstr "Directorio del trabajo" + +msgid "Environment Command" +msgstr "Comando de entorno" + +msgid "Start Time" +msgstr "Hora de inicio" + +msgid "Find" +msgstr "Buscar" + +msgid "Matching" +msgstr "Coincidencia" + +msgid "Select Next" +msgstr "Seleccionar siguiente" + +msgid "Find nodes" +msgstr "Buscar nodos" + +msgid "Find nodes in %s" +msgstr "Buscar nodos en %s" + +msgid "Slider minimum" +msgstr "Mínimo del deslizador" + +msgid "Current frame" +msgstr "Fotograma actual" + +msgid "Slider maximum" +msgstr "Máximo del deslizador" + +msgid "Show" +msgstr "Mostrar" + +msgid "Scroll to bottom and follow new messages [B]" +msgstr "Desplazar al final y seguir nuevos mensajes [B]" + +msgid "Show previous match [P]" +msgstr "Mostrar coincidencia anterior [P]" + +msgid "Show next match [N]" +msgstr "Mostrar coincidencia siguiente [N]" + +msgid "About " +msgstr "Acerca de " + +msgid "License" +msgstr "Licencia" + +msgid "Dependencies" +msgstr "Dependencias" + +msgid "Annotate" +msgstr "Anotar" + +msgid "Remove" +msgstr "Eliminar" + +msgid "Clear Selection" +msgstr "Limpiar selección" + +msgid "Delete Selected Rows" +msgstr "Eliminar filas seleccionadas" + +msgid "Full Screen" +msgstr "Pantalla completa" + +msgid "Reload" +msgstr "Recargar" + +msgid "Load reference" +msgstr "Cargar referencia" + +msgid "Select color" +msgstr "Seleccionar color" + +msgid "Select paths" +msgstr "Seleccionar rutas" + +msgid "Select path" +msgstr "Seleccionar ruta" + +msgid "Enter text" +msgstr "Introducir texto" + +msgid "Display Mode" +msgstr "Modo de visualización" + +msgid "Position" +msgstr "Posición" + +msgid "Value" +msgstr "Valor" + +msgid "Filter..." +msgstr "Filtrar..." + +msgid "Show sequences" +msgstr "Mostrar secuencias" + +msgid "Button Error" +msgstr "Error de botón" + +msgid "Editing " +msgstr "Editando " + +msgid "Editing {0} transforms" +msgstr "Editando {0} transformaciones" + +msgid "Select something to transform" +msgstr "Seleccionar algo para transformar" + +msgid "Render" +msgstr "Renderizar" + +msgid "Copy Set Members" +msgstr "Copiar miembros del set" + +msgid "Select Set Members" +msgstr "Seleccionar miembros del set" + +msgid "History" +msgstr "Historial" + +msgid "Edit Source..." +msgstr "Editar fuente..." + +msgid "Edit Tweaks..." +msgstr "Editar ajustes..." + +msgid "The selected cells cannot be edited in the current Edit Scope" +msgstr "Celdas seleccionadas no se pueden editar en el ámbito de edición actual" + +msgid "Cannot edit columns with mixed types" +msgstr "No se pueden editar columnas con tipos mixtos" + +msgid "Cannot modify set expressions containing operators with drag and drop." +msgstr "No se pueden modificar expresiones de set que contengan operadores con arrastrar y soltar." + +msgid "{} is read-only." +msgstr "{} es de solo lectura." + +msgid "{} is disabled." +msgstr "{} está deshabilitado." + +msgid "Visible Set Bookmarks" +msgstr "Marcadores de set visible" + +msgid "No Bookmarks Available" +msgstr "No hay marcadores disponibles" + +msgid "New Bookmark..." +msgstr "Nuevo marcador..." + +msgid "Replace" +msgstr "Reemplazar" + +msgid "The script is read-only." +msgstr "Script es de solo lectura." + +msgid "Unable to Delete Upstream Render Passes" +msgstr "No se pueden eliminar pases de render de flujo ascendente" + +msgid "Disable Render Pass{}" +msgstr "Deshabilitar pase{} de render" + +msgid "Unable to Delete Downstream Render Passes" +msgstr "No se pueden eliminar pases de render de flujo descendente" + +msgid "To delete render passes, first choose an editable Edit Scope." +msgstr "Para eliminar pases de render, primero elegir un ámbito de edición editable." + +msgid "To delete render passes, select them from the Name column." +msgstr "Para eliminar pases de render, seleccionarlos desde la columna de nombre." + +msgid "Click to delete selected render passes." +msgstr "Hacer clic para eliminar los pases de render seleccionados." + +msgid "Click to add render pass." +msgstr "Hacer clic para añadir un pase de render." + +msgid "To add a render pass, first choose an editable Edit Scope." +msgstr "Para añadir un pase de render, primero elegir un ámbito de edición editable." + +msgid "Rename section" +msgstr "Renombrar sección" + +msgid "Set Label" +msgstr "Establecer etiqueta" + +msgid "Set Description" +msgstr "Establecer descripción" + +msgid "No Spreadsheets Available" +msgstr "No hay hojas de cálculo disponibles" + +msgid "Connected" +msgstr "Conectado" + +msgid "Other" +msgstr "Otro" + +msgid "Add to Spreadsheet" +msgstr "Añadir a hoja de cálculo" + +msgid "Create Spreadsheet" +msgstr "Crear hoja de cálculo" + +msgid "Create Spreadsheet..." +msgstr "Crear hoja de cálculo..." + +msgid "Connect to Spreadsheet" +msgstr "Conectar a hoja de cálculo" + +msgid "Add Column" +msgstr "Añadir columna" + +msgid "Selected Keys" +msgstr "Claves seleccionadas" + +msgid "Selected Curves" +msgstr "Curvas seleccionadas" + +msgid "Frame" +msgstr "Fotograma" + +msgid "Interpolation" +msgstr "Interpolación" + +msgid "Tie Mode" +msgstr "Modo de enlace" + +msgid "Slope" +msgstr "Pendiente" + +msgid "All" +msgstr "Todos" + +msgid "Render Passes" +msgstr "Pases de render" + +msgid "No Render Passes Available" +msgstr "No hay pases de render disponibles" + +msgid "All Render Passes Disabled" +msgstr "Todos los pases de render desactivados" + +msgid "Options" +msgstr "Opciones" + +msgid "Display Grouped" +msgstr "Mostrar agrupados" + +msgid "Toggle grouped display of render passes." +msgstr "Alternar visualización agrupada de pases de render." + +msgid "Hide Disabled" +msgstr "Ocultar desactivados" + +msgid "Hide render passes disabled for rendering." +msgstr "Ocultar pases de render desactivados para el renderizado." + +msgid "Status" +msgstr "Estado" + +msgid "Running Time" +msgstr "Tiempo de ejecución" + +msgid "CPU usage for current batch" +msgstr "Uso de CPU del lote actual" + +msgid "Memory" +msgstr "Memoria" + +msgid "Memory usage for current batch" +msgstr "Uso de memoria del lote actual" + +msgid "Viewer updates suspended, click to resume" +msgstr "Actualizaciones del visor suspendidas, hacer clic para reanudar" + +msgid "Click to suspend viewer updates [esc]" +msgstr "Hacer clic para suspender actualizaciones del visor [esc]" + +msgid "Constant" +msgstr "Constante" + +msgid "Uniform" +msgstr "Uniforme" + +msgid "Vertex" +msgstr "Vértice" + +msgid "Varying" +msgstr "Variable" + +msgid "FaceVarying" +msgstr "Variable por cara" + +msgid "Edit Targets" +msgstr "Objetivos de edición" + +msgid "No EditScopes Available" +msgstr "No hay ámbitos de edición disponibles" + +msgid "Follow Global Edit Target" +msgstr "Seguir objetivo de edición global" + +msgid "Always use the global edit target." +msgstr "Usar siempre el objetivo de edición global." + +msgid "Actions" +msgstr "Acciones" + +msgid "EditScope is Empty" +msgstr "Ámbito de edición está vacío" + +msgid "Show Edits" +msgstr "Mostrar ediciones" + +msgid "Hide Empty Sets" +msgstr "Ocultar sets vacíos" + +msgid "Hide Empty Selection" +msgstr "Ocultar selección vacía" + +msgid "Members" +msgstr "Miembros" + +msgid "Selected" +msgstr "Seleccionados" + +msgid "Copy Set Name" +msgstr "Copiar nombre de set" + +msgid "Copy Set Names" +msgstr "Copiar nombres de sets" + +msgid "Mute" +msgstr "Silenciar" + +msgid "Solo" +msgstr "Solo" + +msgid "Local Translate" +msgstr "Traslación local" + +msgid "Local Rotate" +msgstr "Rotación local" + +msgid "Local Scale" +msgstr "Escala local" + +msgid "Local Shear" +msgstr "Cizalladura local" + +msgid "World Translate" +msgstr "Traslación global" + +msgid "World Rotate" +msgstr "Rotación global" + +msgid "World Scale" +msgstr "Escala global" + +msgid "World Shear" +msgstr "Cizalladura global" + +msgid "Texture File Name" +msgstr "Nombre de archivo de textura" + +msgid "Show only image files" +msgstr "Mostrar solo archivos de imagen" + +msgid "None" +msgstr "Ninguno" + +msgid "Local Jobs" +msgstr "Trabajos locales" + +msgid "Tools" +msgstr "Herramientas" + +msgid "Key" +msgstr "Clave" + +msgid "Curve" +msgstr "Curva" + +msgid "ConstantNext" +msgstr "Constante siguiente" + +msgid "Cubic" +msgstr "Cúbica" + +msgid "Bezier" +msgstr "Bézier" + +msgid "Save As" +msgstr "Guardar como" + +msgid "Empty" +msgstr "Vacío" + +msgid "Standard (multi-monitor)" +msgstr "Estándar (multimonitor)" + +msgid "Editor Focus" +msgstr "Enfoque del editor" + +msgid "Pin To Nothing" +msgstr "No fijar a nada" + +msgid "Pin %s" +msgstr "Fijar %s" + +msgid "Pin %d Selected Nodes" +msgstr "Fijar %d nodos seleccionados" + +msgid "Follow" +msgstr "Seguir" + +msgid "Follow Numeric Bookmark" +msgstr "Seguir marcador numérico" + +msgid "Following the node selection." +msgstr "Siguiendo la selección de nodos." + +msgid "Following the Focus Node." +msgstr "Siguiendo el nodo de enfoque." + +msgid "Following Numeric Bookmark %d." +msgstr "Siguiendo marcador numérico %d." + +msgid "Pinned to nothing." +msgstr "No fijado a nada." + +msgid "Pinned to %d node(s)." +msgstr "Fijado a %d nodo(s)." + +msgid "Set Filter" +msgstr "Filtro de sets" + +msgid "Cameras" +msgstr "Cámaras" + +msgid "Coordinate Systems" +msgstr "Sistemas de coordenadas" + +msgid "Light Filters" +msgstr "Filtros de luz" + +msgid "Lights" +msgstr "Luces" + +msgid "Examples" +msgstr "Ejemplos" + +msgid "No Examples Available" +msgstr "No hay ejemplos disponibles" + +msgid "Box Basics" +msgstr "Conceptos básicos de Box" + +msgid "Scene Processing" +msgstr "Procesamiento de escena" + +msgid "Compositing" +msgstr "Composición" + +msgid "Rendering" +msgstr "Renderizado" + +msgid "Add Render Pass" +msgstr "Añadir pase de render" + +msgid "Add" +msgstr "Añadir" + +msgid "Add render pass to" +msgstr "Añadir pase de render a" + +msgid "Rename Render Pass" +msgstr "Renombrar pase de render" + +msgid "Rename render pass in" +msgstr "Renombrar pase de render en" + +msgid "Unable to rename" +msgstr "No se puede renombrar" + +msgid "Pass was not created in {}." +msgstr "Pase no fue creado en {}." + +msgid "Click to disable row filter" +msgstr "Hacer clic para deshabilitar el filtro de filas" + +msgid "Click to enable row filter" +msgstr "Hacer clic para habilitar el filtro de filas" + +msgid "Language" +msgstr "Idioma" + +msgid "Choose..." +msgstr "Elegir..." + +msgid "Custom" +msgstr "Personalizado" + +msgid "Invalid" +msgstr "Inválido" + +msgid "Image Properties" +msgstr "Propiedades de imagen" + +msgid "Add image" +msgstr "Añadir imagen" + +msgid "Export image" +msgstr "Exportar imagen" + +msgid "Description" +msgstr "Descripción" + +msgid "Search" +msgstr "Buscar" + +msgid "Load" +msgstr "Cargar" + +msgid "Min" +msgstr "Mín" + +msgid "Max" +msgstr "Máx" + +msgid "Pixel Aspect" +msgstr "Aspecto de píxel" + +msgid "Size" +msgstr "Tamaño" + +msgid "Pixel Inspector" +msgstr "Inspector de píxel" + +msgid "Area Inspector" +msgstr "Inspector de área" + +msgid "Add Color Inspector" +msgstr "Añadir inspector de color" + +msgid "Channels" +msgstr "Canales" + +msgid "Metadata" +msgstr "Metadatos" + +msgid "Light Links" +msgstr "Enlaces de luz" + +msgid "Select Linked Objects" +msgstr "Seleccionar objetos enlazados" + +msgid "Select Linked Lights" +msgstr "Seleccionar luces enlazadas" + +msgid "Selecting Linked Objects" +msgstr "Seleccionando objetos enlazados" + +msgid "Selecting Linked Lights" +msgstr "Seleccionando luces enlazadas" + +msgid "{} Messages" +msgstr "Mensajes de {}" + +msgid "Add..." +msgstr "Añadir..." + +msgid "Add " +msgstr "Añadir " + +msgid "Input" +msgstr "Entrada" + +msgid "Output" +msgstr "Salida" + +msgid "Export OSL Shader..." +msgstr "Exportar shader OSL..." + +msgid "Export OSL Shader" +msgstr "Exportar shader OSL" + +msgid "Error Exporting Shader" +msgstr "Error al exportar shader" + +msgid "No Attributes Found" +msgstr "No se encontraron atributos" + +msgid "Attributes added already" +msgstr "Atributos ya fueron añadidos" + +msgid "No Options Found" +msgstr "No se encontraron opciones" + +msgid "Options added already" +msgstr "Opciones ya fueron añadidas" + +msgid "Select Affected Objects" +msgstr "Seleccionar objetos afectados" + +msgid "Previous" +msgstr "Anterior" + +msgid "Next" +msgstr "Siguiente" + +msgid "First" +msgstr "Primero" + +msgid "Compare Mode" +msgstr "Modo de comparación" + +msgid "Match Display Windows" +msgstr "Coincidir ventanas de visualización" + +msgid "Follow Catalogue Output" +msgstr "Seguir salida de catálogo" + +msgid "Pin" +msgstr "Fijar" + +msgid "Focus Node" +msgstr "Nodo de enfoque" + +msgid "Node Selection" +msgstr "Selección de nodo" + +msgid "Comparison Image" +msgstr "Imagen de comparación" + +msgid "No channels available" +msgstr "No hay canales disponibles" + +msgid "No Channels Available" +msgstr "No hay canales disponibles" + +msgid "(Current Context)" +msgstr "(Contexto actual)" + +msgid " (invalid)" +msgstr " (inválido)" + +msgid " (default)" +msgstr " (predeterminado)" + +msgid "Add Input" +msgstr "Añadir entrada" + +msgid "The values generated by the wedge" +msgstr "Valores generados por la cuña" + +msgid "Steps" +msgstr "Pasos" + +msgid "Ignore Missing Source" +msgstr "Ignorar fuente faltante" + +msgid "Light Drawing Mode" +msgstr "Modo de dibujo de luz" + +msgid "User Guide" +msgstr "Guía del usuario" + +msgid "Node Reference" +msgstr "Referencia de nodos" + +msgid "Keyboard Shortcuts" +msgstr "Atajos de teclado" + +msgid "Forum" +msgstr "Foro" + +msgid "Issue Tracker" +msgstr "Rastreador de errores" + +msgid "Arnold" +msgstr "Arnold" + +msgid "AOVShader" +msgstr "Shader de VAS" + +msgid "Arnold Texture Bake" +msgstr "Horneado de texturas Arnold" + +msgid "Atmosphere" +msgstr "Atmósfera" + +msgid "CameraShaders" +msgstr "Shaders de cámara" + +msgid "Displacement" +msgstr "Desplazamiento" + +msgid "Imager" +msgstr "Procesador de imagen" + +msgid "Integrator" +msgstr "Integrador" + +msgid "Procedural" +msgstr "Procedural" + +msgid "3Delight" +msgstr "3Delight" + +msgid "RenderMan" +msgstr "RenderMan" + +msgid "Display Filter" +msgstr "Filtro de visualización" + +msgid "Sample Filter" +msgstr "Filtro de muestras" + +msgid "OpenGL" +msgstr "OpenGL" + +msgid "Reader" +msgstr "Cargar" + +msgid "Writer" +msgstr "Exportar" + +msgid "Object To Scene" +msgstr "Objeto a escena" + +msgid "Image To Points" +msgstr "Imagen a puntos" + +msgid "Image Scatter" +msgstr "Dispersión de imagen" + +msgid "Camera" +msgstr "Cámara" + +msgid "Coordinate System" +msgstr "Sistema de coordenadas" + +msgid "Clipping Plane" +msgstr "Plano de recorte" + +msgid "External Procedural" +msgstr "Procedural externo" + +msgid "Grid" +msgstr "Cuadrícula" + +msgid "Cube" +msgstr "Cubo" + +msgid "Plane" +msgstr "Plano" + +msgid "Sphere" +msgstr "Esfera" + +msgid "Scatter" +msgstr "Dispersión" + +msgid "Instancer" +msgstr "Instanciador" + +msgid "MotionPath" +msgstr "Trayectoria de movimiento" + +msgid "Primitive Variables" +msgstr "Variables primitivas" + +msgid "Copy Primitive Variables" +msgstr "Copiar variables primitivas" + +msgid "Delete Primitive Variables" +msgstr "Eliminar variables primitivas" + +msgid "Shuffle Primitive Variables" +msgstr "Reorganizar variables primitivas" + +msgid "Resample Primitive Variables" +msgstr "Remuestrear variables primitivas" + +msgid "Collect Primitive Variables" +msgstr "Recopilar variables primitivas" + +msgid "Primitive Variable Tweaks" +msgstr "Ajustes de variables primitivas" + +msgid "Orientation" +msgstr "Orientación" + +msgid "Mesh Type" +msgstr "Tipo de malla" + +msgid "Points Type" +msgstr "Tipo de puntos" + +msgid "Mesh To Points" +msgstr "Malla a puntos" + +msgid "Wireframe" +msgstr "Malla de alambre" + +msgid "Light To Camera" +msgstr "Luz a cámara" + +msgid "Map Projection" +msgstr "Proyección de mapa" + +msgid "Map Offset" +msgstr "Desplazamiento de mapa" + +msgid "Parameters" +msgstr "Parámetros" + +msgid "Mesh Normals" +msgstr "Normales de malla" + +msgid "Mesh Tangents" +msgstr "Tangentes de malla" + +msgid "Delete Faces" +msgstr "Eliminar caras" + +msgid "Delete Curves" +msgstr "Eliminar curvas" + +msgid "Delete Points" +msgstr "Eliminar puntos" + +msgid "Delete Object" +msgstr "Eliminar objeto" + +msgid "Reverse Winding" +msgstr "Invertir enrollado" + +msgid "Mesh Distortion" +msgstr "Distorsión de malla" + +msgid "Mesh Segments" +msgstr "Segmentos de malla" + +msgid "Mesh Split" +msgstr "División de malla" + +msgid "Merge Meshes" +msgstr "Fusionar mallas" + +msgid "Merge Points" +msgstr "Fusionar puntos" + +msgid "Merge Curves" +msgstr "Fusionar curvas" + +msgid "Mesh Subdivide" +msgstr "Subdividir malla" + +msgid "Camera Tweaks" +msgstr "Ajustes de cámara" + +msgid "Curve Sampler" +msgstr "Muestreador de curvas" + +msgid "Closest Point Sampler" +msgstr "Muestreador de punto más cercano" + +msgid "UV Sampler" +msgstr "Muestreador UV" + +msgid "Shader Assignment" +msgstr "Asignación de shader" + +msgid "Shader Tweaks" +msgstr "Ajustes de shader" + +msgid "Standard Attributes" +msgstr "Atributos estándar" + +msgid "Custom Attributes" +msgstr "Atributos personalizados" + +msgid "Delete Attributes" +msgstr "Eliminar atributos" + +msgid "Shuffle Attributes" +msgstr "Reorganizar atributos" + +msgid "Localise Attributes" +msgstr "Localizar atributos" + +msgid "Attribute Visualiser" +msgstr "Visualizador de atributos" + +msgid "Attribute Tweaks" +msgstr "Ajustes de atributos" + +msgid "Copy Attributes" +msgstr "Copiar atributos" + +msgid "Collect Transforms" +msgstr "Recopilar transformaciones" + +msgid "Filters" +msgstr "Filtros" + +msgid "Path Filter" +msgstr "Filtro de ruta" + +msgid "Union Filter" +msgstr "Filtro de unión" + +msgid "Hierarchy" +msgstr "Jerarquía" + +msgid "Group" +msgstr "Grupo" + +msgid "Parent" +msgstr "Primario" + +msgid "Duplicate" +msgstr "Duplicar" + +msgid "SubTree" +msgstr "Subárbol" + +msgid "Prune" +msgstr "Podar" + +msgid "Isolate" +msgstr "Aislar" + +msgid "Collect" +msgstr "Recopilar" + +msgid "Encapsulate" +msgstr "Encapsular" + +msgid "Unencapsulate" +msgstr "Desencapsular" + +msgid "Freeze Transform" +msgstr "Congelar transformación" + +msgid "Point Constraint" +msgstr "Restricción de punto" + +msgid "Aim Constraint" +msgstr "Restricción de apuntado" + +msgid "Parent Constraint" +msgstr "Restricción de primario" + +msgid "Framing Constraint" +msgstr "Restricción de encuadre" + +msgid "Delete Outputs" +msgstr "Eliminar salidas" + +msgid "Delete Sets" +msgstr "Eliminar conjuntos" + +msgid "Standard Options" +msgstr "Opciones estándar" + +msgid "Custom Options" +msgstr "Opciones personalizadas" + +msgid "Delete Options" +msgstr "Eliminar opciones" + +msgid "Copy Options" +msgstr "Copiar opciones" + +msgid "Shuffle Options" +msgstr "Reorganizar opciones" + +msgid "Option Tweaks" +msgstr "Ajustes de opciones" + +msgid "Set" +msgstr "Conjunto" + +msgid "Set Visualiser" +msgstr "Visualizador de conjunto" + +msgid "Filter Query" +msgstr "Consulta de filtro" + +msgid "Transform Query" +msgstr "Consulta de transformación" + +msgid "Bound Query" +msgstr "Consulta de límites" + +msgid "Existence Query" +msgstr "Consulta de existencia" + +msgid "Attribute Query" +msgstr "Consulta de atributos" + +msgid "Set Query" +msgstr "Consulta de conjunto" + +msgid "Shader Query" +msgstr "Consulta de shader" + +msgid "Option Query" +msgstr "Consulta de opciones" + +msgid "Primitive Variable Query" +msgstr "Consulta de variables primitivas" + +msgid "Camera Query" +msgstr "Consulta de cámara" + +msgid "Passes" +msgstr "Pases" + +msgid "Delete Render Passes" +msgstr "Eliminar pases de render" + +msgid "Render Pass Wedge" +msgstr "Cuña de pase de render" + +msgid "Render Pass Shader" +msgstr "Shader de pase de render" + +msgid "Shuffle Render Passes" +msgstr "Reorganizar pases de render" + +msgid "Interactive Render" +msgstr "Render interactivo" + +msgid "Catalogue" +msgstr "Catálogo" + +msgid "Catalogue Select" +msgstr "Selección de catálogo" + +msgid "Rectangle" +msgstr "Rectángulo" + +msgid "Pattern" +msgstr "Patrón" + +msgid "Checkerboard" +msgstr "Tablero de ajedrez" + +msgid "Ramp" +msgstr "Rampa" + +msgid "Clamp" +msgstr "Limitar" + +msgid "Grade" +msgstr "Gradación" + +msgid "CDL" +msgstr "CDL" + +msgid "ColorSpace" +msgstr "Espacio de color" + +msgid "DisplayTransform" +msgstr "Transformación de visualización" + +msgid "LookTransform" +msgstr "Transformación de apariencia" + +msgid "LUT" +msgstr "LUT" + +msgid "Premultiply" +msgstr "Premultiplicar" + +msgid "Unpremultiply" +msgstr "Despremultiplicar" + +msgid "Saturation" +msgstr "Saturación" + +msgid "Blur" +msgstr "Desenfoque" + +msgid "Median" +msgstr "Mediana" + +msgid "Erode" +msgstr "Erosionar" + +msgid "Dilate" +msgstr "Dilatar" + +msgid "BleedFill" +msgstr "Relleno por sangrado" + +msgid "DiskBlur" +msgstr "Desenfoque de disco" + +msgid "Matte" +msgstr "Máscara" + +msgid "Stencil" +msgstr "Troquel" + +msgid "Cryptomatte" +msgstr "Cryptomatte" + +msgid "Contact Sheet" +msgstr "Hoja de contacto" + +msgid "Mix" +msgstr "Mezclar" + +msgid "Resize" +msgstr "Redimensionar" + +msgid "Crop" +msgstr "Recortar" + +msgid "Offset" +msgstr "Desplazamiento" + +msgid "Mirror" +msgstr "Espejo" + +msgid "VectorWarp" +msgstr "Deformación vectorial" + +msgid "Shuffle" +msgstr "Reorganizar" + +msgid "Copy Views" +msgstr "Copiar vistas" + +msgid "Delete Views" +msgstr "Eliminar vistas" + +msgid "Delete Metadata" +msgstr "Eliminar metadatos" + +msgid "Copy Metadata" +msgstr "Copiar metadatos" + +msgid "Shuffle Metadata" +msgstr "Reorganizar metadatos" + +msgid "Metadata Overlay" +msgstr "Superposición de metadatos" + +msgid "Stats" +msgstr "Estadísticas" + +msgid "Sampler" +msgstr "Muestreador" + +msgid "FormatQuery" +msgstr "Consulta de formato" + +msgid "DataWindowQuery" +msgstr "Consulta de ventana de datos" + +msgid "OpenColorIO Context" +msgstr "Contexto de OpenColorIO" + +msgid "Deep" +msgstr "Profundidad" + +msgid "FlatToDeep" +msgstr "Plano a profundidad" + +msgid "DeepToFlat" +msgstr "Profundidad a plano" + +msgid "Tidy" +msgstr "Ordenar" + +msgid "Sample Counts" +msgstr "Conteo de muestras" + +msgid "Deep Sampler" +msgstr "Muestreador de profundidad" + +msgid "Deep Holdout" +msgstr "Recorte de profundidad" + +msgid "Deep Recolor" +msgstr "Recoloreo de profundidad" + +msgid "Deep Slice" +msgstr "Corte de profundidad" + +msgid "MultiView" +msgstr "Multivista" + +msgid "Create Views" +msgstr "Crear vistas" + +msgid "Select View" +msgstr "Seleccionar vista" + +msgid "Anaglyph" +msgstr "Anaglifo" + +msgid "Code" +msgstr "Código" + +msgid "Local Dispatcher" +msgstr "Despachador local" + +msgid "Tractor Dispatcher" +msgstr "Despachador de Tractor" + +msgid "Python Command" +msgstr "Comando de Python" + +msgid "System Command" +msgstr "Comando de sistema" + +msgid "Frame Mask" +msgstr "Máscara de fotograma" + +msgid "Task List" +msgstr "Lista de tareas" + +msgid "Wedge" +msgstr "Cuña" + +msgid "Node" +msgstr "Nodo" + +msgid "Box" +msgstr "Caja" + +msgid "BoxIn" +msgstr "Entrada de caja" + +msgid "BoxOut" +msgstr "Salida de caja" + +msgid "Reference" +msgstr "Referencia" + +msgid "Edit Scope" +msgstr "Ámbito de edición" + +msgid "Dot" +msgstr "Punto" + +msgid "Expression" +msgstr "Expresión" + +msgid "Spreadsheet" +msgstr "Hoja de cálculo" + +msgid "Switch" +msgstr "Interruptor" + +msgid "Name Switch" +msgstr "Interruptor por nombre" + +msgid "Random" +msgstr "Aleatorio" + +msgid "RandomChoice" +msgstr "Elección aleatoria" + +msgid "Context Query" +msgstr "Consulta de contexto" + +msgid "Context Variable Tweaks" +msgstr "Ajustes de variables de contexto" + +msgid "Delete Context Variables" +msgstr "Eliminar variables de contexto" + +msgid "Time Warp" +msgstr "Deformación temporal" + +msgid "Pattern Match" +msgstr "Coincidencia de patrón" + +msgid "Layer Writer" +msgstr "Escritor de capas" + +msgid "Primitive" +msgstr "Primitiva" + +msgid "Level Set Offset" +msgstr "Desfase de conjunto de nivel" + +msgid "Level Set To Mesh" +msgstr "Conjunto de nivel a malla" + +msgid "Mesh To Level Set" +msgstr "Malla a conjunto de nivel" + +msgid "Sphere Level Set" +msgstr "Conjunto de nivel esférico" + +msgid "Points To Level Set" +msgstr "Puntos a conjunto de nivel" + +msgid "Points Grid To Points" +msgstr "Cuadrícula de puntos a puntos" + +msgid "Volume Scatter" +msgstr "Dispersión volumétrica" + +msgid "ML" +msgstr "ML" + +msgid "Inference" +msgstr "Inferencia" + +msgid "Data To Tensor" +msgstr "Datos a tensor" + +msgid "Image To Tensor" +msgstr "Imagen a tensor" + +msgid "Tensor To Image" +msgstr "Tensor a imagen" + +msgid "Tensor To Mesh" +msgstr "Tensor a malla" + +msgid "Background" +msgstr "Fondo" + +msgid "Promote Instances" +msgstr "Promover instancias" + +msgid "FocalBlur" +msgstr "Desenfoque focal" + +msgid "Location" +msgstr "Ubicación" + +msgid "Select a location to inspect" +msgstr "Seleccionar una ubicación para inspeccionar" + +msgid "Main" +msgstr "Principal" + +msgid "Contribution" +msgstr "Contribución" + +msgid "Visualisation" +msgstr "Visualización" + +msgid "Geometry" +msgstr "Geometría" + +msgid "Texture" +msgstr "Textura" + +msgid "Shaping" +msgstr "Forma" + +msgid "Shadow" +msgstr "Sombra" + +msgid "Gobo" +msgstr "Gobo" + +msgid "Barndoor" +msgstr "Visera" + +msgid "Blocker" +msgstr "Bloqueador" + +msgid "Decay" +msgstr "Decaimiento" + +msgid "Sampling" +msgstr "Muestreo" + +msgid "Shadows" +msgstr "Sombras" + +msgid "Intensity" +msgstr "Intensidad" + +msgid "Exposure" +msgstr "Exposición" + +msgid "Lightgroup" +msgstr "Grupo de luz" + +msgid "Color Temperature" +msgstr "Temperatura de color" + +msgid "Enable Color Temperature" +msgstr "Habilitar temperatura de color" + +msgid "Normalize" +msgstr "Normalizar" + +msgid "Diffuse" +msgstr "Difuso" + +msgid "Specular" +msgstr "Especular" + +msgid "Width" +msgstr "Ancho" + +msgid "Height" +msgstr "Alto" + +msgid "Radius" +msgstr "Radio" + +msgid "Treat As Point" +msgstr "Tratar como punto" + +msgid "Length" +msgstr "Longitud" + +msgid "Treat As Line" +msgstr "Tratar como línea" + +msgid "Angle" +msgstr "Ángulo" + +msgid "Cast Shadow" +msgstr "Proyectar sombra" + +msgid "Use Diffuse" +msgstr "Usar difuso" + +msgid "Use Glossy" +msgstr "Usar brillo" + +msgid "Use Transmission" +msgstr "Usar transmisión" + +msgid "Use Scatter" +msgstr "Usar dispersión" + +msgid "Max Bounces" +msgstr "Rebotes máximos" + +msgid "Spot Angle" +msgstr "Ángulo de foco" + +msgid "Spot Smooth" +msgstr "Suavizado de foco" + +msgid "Spread" +msgstr "Propagación" + +msgid "Is Sphere" +msgstr "Es esfera" + +msgid "Aov" +msgstr "VAS" + +msgid "Portal" +msgstr "Portal" + +msgid "Portal Mode" +msgstr "Modo de portal" + +msgid "Aov Indirect" +msgstr "VAS indirecto" + +msgid "Roundness" +msgstr "Redondez" + +msgid "Soft Edge" +msgstr "Borde suave" + +msgid "Lens Radius" +msgstr "Radio de lente" + +msgid "Cone Angle" +msgstr "Ángulo de cono" + +msgid "Penumbra Angle" +msgstr "Ángulo de penumbra" + +msgid "Cosine Power" +msgstr "Potencia de coseno" + +msgid "Aspect Ratio" +msgstr "Relación de aspecto" + +msgid "Filename" +msgstr "Nombre de archivo" + +msgid "Samples" +msgstr "Muestras" + +msgid "Volume Samples" +msgstr "Muestras de volumen" + +msgid "Sampling Mode" +msgstr "Modo de muestreo" + +msgid "Cast Shadows" +msgstr "Proyectar sombras" + +msgid "Cast Volumetric Shadows" +msgstr "Proyectar sombras volumétricas" + +msgid "Shadow Density" +msgstr "Densidad de sombra" + +msgid "Shadow Color" +msgstr "Color de sombra" + +msgid "Slidemap" +msgstr "Mapa de diapositiva" + +msgid "Transform Rotate" +msgstr "Rotación de transformación" + +msgid "Transform Offset" +msgstr "Desplazamiento de transformación" + +msgid "Density" +msgstr "Densidad" + +msgid "Filter Mode" +msgstr "Modo de filtro" + +msgid "UV Coordinates Wrap U" +msgstr "Coordenadas UV envolver U" + +msgid "UV Coordinates Wrap V" +msgstr "Coordenadas UV envolver V" + +msgid "UV Coordinates Scale U" +msgstr "Coordenadas UV escala U" + +msgid "UV Coordinates Scale V" +msgstr "Coordenadas UV escala V" + +msgid "Top Left" +msgstr "Superior izquierda" + +msgid "Top Right" +msgstr "Superior derecha" + +msgid "Top Edge" +msgstr "Borde superior" + +msgid "Right Top" +msgstr "Derecha superior" + +msgid "Right Bottom" +msgstr "Derecha inferior" + +msgid "Right Edge" +msgstr "Borde derecho" + +msgid "Bottom Left" +msgstr "Inferior izquierda" + +msgid "Bottom Right" +msgstr "Inferior derecha" + +msgid "Bottom Edge" +msgstr "Borde inferior" + +msgid "Left Top" +msgstr "Izquierda superior" + +msgid "Left Bottom" +msgstr "Izquierda inferior" + +msgid "Left Edge" +msgstr "Borde izquierdo" + +msgid "Geometry Type" +msgstr "Tipo de geometría" + +msgid "Falloff Width Edge" +msgstr "Borde de ancho de atenuación" + +msgid "Falloff Height Edge" +msgstr "Borde de alto de atenuación" + +msgid "Falloff Ramp" +msgstr "Rampa de atenuación" + +msgid "Falloff Axis" +msgstr "Eje de atenuación" + +msgid "Near Enable" +msgstr "Habilitar cercano" + +msgid "Far Enable" +msgstr "Habilitar lejano" + +msgid "Near Start" +msgstr "Inicio cercano" + +msgid "Near End" +msgstr "Fin cercano" + +msgid "Far Start" +msgstr "Inicio lejano" + +msgid "Far End" +msgstr "Fin lejano" + +msgid "Enable" +msgstr "Habilitar" + +msgid "Distance" +msgstr "Distancia" + +msgid "Falloff" +msgstr "Atenuación" + +msgid "Falloff Gamma" +msgstr "Gamma de atenuación" + +msgid "Softness" +msgstr "Suavidad" + +msgid "Focus Tint" +msgstr "Tinte de enfoque" + +msgid "Angle Scale" +msgstr "Escala de ángulo" + +msgid "Use Mis" +msgstr "Usar MIS" + +msgid "Use Camera" +msgstr "Usar cámara" + +msgid "Use Caustics" +msgstr "Usar cáusticas" + +msgid "Map Resolution" +msgstr "Resolución de mapa" + +msgid "Isolate Differences" +msgstr "Aislar diferencias" +# =========================================================================== +# Phase 14: Exhaustive node parameter labels, sections, and presets +# =========================================================================== + +msgid "Advanced" +msgstr "Avanzado" + +msgid "Borders" +msgstr "Bordes" + +msgid "Caustics" +msgstr "Cáusticas" + +msgid "Color Overrides" +msgstr "Sobrescrituras de color" + +msgid "Context Variations" +msgstr "Variaciones de contexto" + +msgid "Curves Primitives" +msgstr "Primitivas de curvas" + +msgid "DPX" +msgstr "DPX" + +msgid "Denoising" +msgstr "Eliminación de ruido" + +msgid "Depth" +msgstr "Profundidad" + +msgid "Depth of Field" +msgstr "Profundidad de campo" + +msgid "Drawing" +msgstr "Dibujo" + +msgid "Encapsulation" +msgstr "Encapsulación" + +msgid "Environment Variables" +msgstr "Variables de entorno" + +msgid "Extra" +msgstr "Extra" + +msgid "FITS" +msgstr "FITS" + +msgid "Field3D" +msgstr "Field3D" + +msgid "Film" +msgstr "Película" + +msgid "Font" +msgstr "Fuente" + +msgid "Frames" +msgstr "Fotogramas" + +msgid "General" +msgstr "General" + +msgid "IFF" +msgstr "IFF" + +msgid "Images" +msgstr "Imágenes" + +msgid "Inactive Ids" +msgstr "IDs inactivos" + +msgid "Instancing" +msgstr "Instanciación" + +msgid "Jpeg" +msgstr "JPEG" + +msgid "Jpeg2000" +msgstr "JPEG 2000" + +msgid "Labels" +msgstr "Etiquetas" + +msgid "Light Linking" +msgstr "Enlace de luces" + +msgid "Motion Blur" +msgstr "Desenfoque de movimiento" + +msgid "OpenEXR" +msgstr "OpenEXR" + +msgid "PNG" +msgstr "PNG" + +msgid "Path-Guiding" +msgstr "Guiado de trayectoria" + +msgid "Points Primitives" +msgstr "Primitivas de puntos" + +msgid "Prototypes" +msgstr "Prototipos" + +msgid "Queries" +msgstr "Consultas" + +msgid "RLA" +msgstr "RLA" + +msgid "Ray Depth" +msgstr "Profundidad de rayo" + +msgid "Render Manifest" +msgstr "Manifiesto de render" + +msgid "Render Overrides" +msgstr "Sobrescrituras de render" + +msgid "Render Set" +msgstr "Conjunto de render" + +msgid "Renderer" +msgstr "Renderizador" + +msgid "Results" +msgstr "Resultados" + +msgid "SGI" +msgstr "SGI" + +msgid "Session" +msgstr "Sesión" + +msgid "Source Locations" +msgstr "Ubicaciones de origen" + +msgid "Statistics" +msgstr "Estadísticas" + +msgid "Subdivision" +msgstr "Subdivisión" + +msgid "Substitutions" +msgstr "Sustituciones" + +msgid "TIFF" +msgstr "TIFF" + +msgid "Targa" +msgstr "Targa" + +msgid "Transforms" +msgstr "Transformaciones" + +msgid "Tweaks" +msgstr "Ajustes" + +msgid "Visibility" +msgstr "Visibilidad" + +msgid "Visibility Set" +msgstr "Conjunto de visibilidad" + +msgid "Visualisers" +msgstr "Visualizadores" + +msgid "Volume" +msgstr "Volumen" + +msgid "Volumes" +msgstr "Volúmenes" + +msgid "WebP" +msgstr "WebP" + +msgid "Active Row Index" +msgstr "Índice de fila activa" + +msgid "Adaptive Min Samples" +msgstr "Muestras mínimas adaptativas" + +msgid "Adaptive Sampling" +msgstr "Muestreo adaptativo" + +msgid "Adaptive Threshold" +msgstr "Umbral adaptativo" + +msgid "Adaptivity" +msgstr "Adaptatividad" + +msgid "Add Layer Prefix" +msgstr "Añadir prefijo de capa" + +msgid "Add Prefix" +msgstr "Añadir prefijo" + +msgid "Add Suffix" +msgstr "Añadir sufijo" + +msgid "Additional Lights" +msgstr "Luces adicionales" + +msgid "Adjust Bounds" +msgstr "Ajustar límites" + +msgid "Affect Data Window" +msgstr "Afectar ventana de datos" + +msgid "Affect Display Window" +msgstr "Afectar ventana de visualización" + +msgid "Aim" +msgstr "Objetivo" + +msgid "Alpha Channel" +msgstr "Canal alfa" + +msgid "Alpha Threshold" +msgstr "Umbral alfa" + +msgid "Ambient Occlusion" +msgstr "Oclusión ambiental" + +msgid "Ambient Occlusion Distance" +msgstr "Distancia de oclusión ambiental" + +msgid "Ambient Occlusion Factor" +msgstr "Factor de oclusión ambiental" + +msgid "Ancestor Match" +msgstr "Coincidencia de ancestro" + +msgid "Aperture" +msgstr "Apertura" + +msgid "Aperture Aspect Ratio" +msgstr "Relación de aspecto de apertura" + +msgid "Aperture Offset" +msgstr "Desplazamiento de apertura" + +msgid "Approximation Threshold" +msgstr "Umbral de aproximación" + +msgid "Area" +msgstr "Área" + +msgid "Area Source" +msgstr "Fuente de área" + +msgid "Asset Name" +msgstr "Nombre del recurso" + +msgid "Attribute" +msgstr "Atributo" + +msgid "Attribute Context Variable" +msgstr "Variable de contexto de atributo" + +msgid "Attribute Name" +msgstr "Nombre de atributo" + +msgid "Attribute Prefix" +msgstr "Prefijo de atributo" + +msgid "Attribute Suffix" +msgstr "Sufijo de atributo" + +msgid "Attributes Mode" +msgstr "Modo de atributos" + +msgid "Automatic Instancing" +msgstr "Instanciación automática" + +msgid "Available Frames" +msgstr "Fotogramas disponibles" + +msgid "Average" +msgstr "Promedio" + +msgid "Axis" +msgstr "Eje" + +msgid "BVH Layout" +msgstr "Disposición BVH" + +msgid "BVH Time Steps" +msgstr "Pasos de tiempo BVH" + +msgid "Background Depth Value" +msgstr "Valor de profundidad de fondo" + +msgid "Base Color" +msgstr "Color base" + +msgid "Batch Size" +msgstr "Tamaño de lote" + +msgid "Bi Tangent" +msgstr "Bitangente" + +msgid "Black Clamp" +msgstr "Limitación de negros" + +msgid "Black Point" +msgstr "Punto negro" + +msgid "Blur Multiplier" +msgstr "Multiplicador de desenfoque" + +msgid "Border Color" +msgstr "Color de borde" + +msgid "Border Color Metadata" +msgstr "Metadatos de color de borde" + +msgid "Border Pixel Width" +msgstr "Ancho de borde en píxeles" + +msgid "Bound" +msgstr "Límite" + +msgid "Bound Color" +msgstr "Color de límite" + +msgid "Bound Mode" +msgstr "Modo de límite" + +msgid "Bounding Mode" +msgstr "Modo de acotación" + +msgid "Calculate Normals" +msgstr "Calcular normales" + +msgid "Calculate Polygon Normals" +msgstr "Calcular normales de polígono" + +msgid "Camera Exclusions" +msgstr "Exclusiones de cámara" + +msgid "Camera Inclusions" +msgstr "Inclusiones de cámara" + +msgid "Camera Mode" +msgstr "Modo de cámara" + +msgid "Camera Path" +msgstr "Ruta de cámara" + +msgid "Camera Scene" +msgstr "Escena de cámara" + +msgid "Camera Visibility" +msgstr "Visibilidad de cámara" + +msgid "Camera Visible" +msgstr "Visible para cámara" + +msgid "Cells" +msgstr "Celdas" + +msgid "Center" +msgstr "Centro" + +msgid "Center Color" +msgstr "Color central" + +msgid "Center Pixel Width" +msgstr "Ancho de píxel central" + +msgid "Channel Data" +msgstr "Datos de canal" + +msgid "Channel Interpretation" +msgstr "Interpretación de canal" + +msgid "Channel Name" +msgstr "Nombre de canal" + +msgid "Channel Names" +msgstr "Nombres de canal" + +msgid "Check File Valid" +msgstr "Verificar archivo válido" + +msgid "Check Max" +msgstr "Verificar máximo" + +msgid "Check Min" +msgstr "Verificar mínimo" + +msgid "Check NaN" +msgstr "Verificar NaN" + +msgid "Child Bounds" +msgstr "Límites de secundario" + +msgid "Child Names" +msgstr "Nombres de secundario" + +msgid "Child0" +msgstr "Secundario0" + +msgid "Children" +msgstr "Secundarios" + +msgid "Choices" +msgstr "Opciones" + +msgid "Chroma Sub Sampling" +msgstr "Submuestreo de croma" + +msgid "Client" +msgstr "Cliente" + +msgid "Clipping" +msgstr "Recorte" + +msgid "Clipping Planes" +msgstr "Planos de recorte" + +msgid "Closest Ancestor" +msgstr "Ancestro más cercano" + +msgid "Color A" +msgstr "Color A" + +msgid "Color B" +msgstr "Color B" + +msgid "Color Mode" +msgstr "Modo de color" + +msgid "Color Source" +msgstr "Fuente de color" + +msgid "Color Space" +msgstr "Espacio de color" + +msgid "Command" +msgstr "Comando" + +msgid "Compression" +msgstr "Compresión" + +msgid "Compression Level" +msgstr "Nivel de compresión" + +msgid "Compression Quality" +msgstr "Calidad de compresión" + +msgid "Concatenate" +msgstr "Concatenar" + +msgid "Config" +msgstr "Configuración" + +msgid "Connected Inputs" +msgstr "Entradas conectadas" + +msgid "Connectivity" +msgstr "Conectividad" + +msgid "Context Values" +msgstr "Valores de contexto" + +msgid "Context Variable" +msgstr "Variable de contexto" + +msgid "Copies" +msgstr "Copias" + +msgid "Copy From" +msgstr "Copiar de" + +msgid "Copy Source Attributes" +msgstr "Copiar atributos de origen" + +msgid "Corner Radius" +msgstr "Radio de esquina" + +msgid "Crop Window" +msgstr "Ventana de recorte" + +msgid "Cryptomatte Depth" +msgstr "Profundidad Cryptomatte" + +msgid "Curve Index" +msgstr "Índice de curva" + +msgid "Curves" +msgstr "Curvas" + +msgid "Custom Format" +msgstr "Formato personalizado" + +msgid "Data Type" +msgstr "Tipo de datos" + +msgid "Data Window" +msgstr "Ventana de datos" + +msgid "Debug" +msgstr "Depuración" + +msgid "Deep State" +msgstr "Estado de profundidad" + +msgid "Default Light" +msgstr "Luz predeterminada" + +msgid "Default Renderer" +msgstr "Renderizador predeterminado" + +msgid "Deformation" +msgstr "Deformación" + +msgid "Deformation Blur" +msgstr "Desenfoque de deformación" + +msgid "Deformation Segments" +msgstr "Segmentos de deformación" + +msgid "Delete Existing" +msgstr "Eliminar existente" + +msgid "Delete Prefix" +msgstr "Eliminar prefijo" + +msgid "Delete Suffix" +msgstr "Eliminar sufijo" + +msgid "Denoise Device" +msgstr "Dispositivo de eliminación de ruido" + +msgid "Denoising Pre-Filter" +msgstr "Prefiltro de eliminación de ruido" + +msgid "Denoising Start Sample" +msgstr "Muestra inicial de eliminación de ruido" + +msgid "Denoising Type" +msgstr "Tipo de eliminación de ruido" + +msgid "Density Channel" +msgstr "Canal de densidad" + +msgid "Density Primitive Variable" +msgstr "Variable primitiva de densidad" + +msgid "Depth Channel" +msgstr "Canal de profundidad" + +msgid "Depth Data Type" +msgstr "Tipo de datos de profundidad" + +msgid "Depth Interpretation" +msgstr "Interpretación de profundidad" + +msgid "Depth Mode" +msgstr "Modo de profundidad" + +msgid "Depth Of Field" +msgstr "Profundidad de campo" + +msgid "Depth Plane Scaling Factor" +msgstr "Factor de escala del plano de profundidad" + +msgid "Descendant Match" +msgstr "Coincidencia de descendiente" + +msgid "Destination" +msgstr "Destino" + +msgid "Device(s)" +msgstr "Dispositivo(s)" + +msgid "Dicing Camera" +msgstr "Cámara de fragmentación" + +msgid "Dicing Scale" +msgstr "Escala de fragmentación" + +msgid "Diffuse Visible" +msgstr "Difuso visible" + +msgid "Dimensions" +msgstr "Dimensiones" + +msgid "Direction" +msgstr "Dirección" + +msgid "Directory" +msgstr "Directorio" + +msgid "Displacement Method" +msgstr "Método de desplazamiento" + +msgid "Display" +msgstr "Visualización" + +msgid "Display Color" +msgstr "Color de visualización" + +msgid "Display Pass" +msgstr "Pase de visualización" + +msgid "Display Window" +msgstr "Ventana de visualización" + +msgid "Distant Aperture" +msgstr "Apertura distante" + +msgid "Distortion" +msgstr "Distorsión" + +msgid "Divisions" +msgstr "Divisiones" + +msgid "Divisions Mode" +msgstr "Modo de divisiones" + +msgid "Double Sided" +msgstr "Doble cara" + +msgid "Dpx" +msgstr "DPX" + +msgid "Dwa Compression Level" +msgstr "Nivel de compresión DWA" + +msgid "Emission Sampling Method" +msgstr "Método de muestreo de emisión" + +msgid "Enabled Names" +msgstr "Nombres habilitados" + +msgid "Enabled Row Names" +msgstr "Nombres de fila habilitados" + +msgid "Enabled Values" +msgstr "Valores habilitados" + +msgid "End" +msgstr "Fin" + +msgid "End Position" +msgstr "Posición final" + +msgid "Environment" +msgstr "Entorno" + +msgid "Error Color" +msgstr "Color de error" + +msgid "Euler" +msgstr "Euler" + +msgid "Exact Match" +msgstr "Coincidencia exacta" + +msgid "Exclusions" +msgstr "Exclusiones" + +msgid "Execute In Background" +msgstr "Ejecutar en segundo plano" + +msgid "Exists" +msgstr "Existe" + +msgid "Expand Data Window" +msgstr "Expandir ventana de datos" + +msgid "Extend Far Clip" +msgstr "Extender recorte lejano" + +msgid "Exterior Bandwidth" +msgstr "Ancho de banda exterior" + +msgid "Extra Attributes" +msgstr "Atributos extra" + +msgid "Extra Metadata" +msgstr "Metadatos extra" + +msgid "Extra Options" +msgstr "Opciones extra" + +msgid "Extra Variables" +msgstr "Variables extra" + +msgid "F Stop" +msgstr "Diafragma" + +msgid "Face Varying Linear Interp.." +msgstr "Interpolación lineal por cara.." + +msgid "Faces" +msgstr "Caras" + +msgid "Far Clip" +msgstr "Recorte lejano" + +msgid "Field Of View" +msgstr "Campo de visión" + +msgid "Field3d" +msgstr "Field3D" + +msgid "File Path" +msgstr "Ruta de archivo" + +msgid "File Valid" +msgstr "Archivo válido" + +msgid "Film Fit" +msgstr "Ajuste de película" + +msgid "Filter Deep" +msgstr "Filtrar profundidad" + +msgid "Filter Glossy" +msgstr "Filtrar brillo" + +msgid "Filter Scale" +msgstr "Escala de filtro" + +msgid "Filter Type" +msgstr "Tipo de filtro" + +msgid "Filter Width" +msgstr "Ancho de filtro" + +msgid "Filtered Lights" +msgstr "Luces filtradas" + +msgid "First Match" +msgstr "Primera coincidencia" + +msgid "Fit Mode" +msgstr "Modo de ajuste" + +msgid "Fits" +msgstr "FITS" + +msgid "Flatten" +msgstr "Aplanar" + +msgid "Float Max" +msgstr "Máximo flotante" + +msgid "Float Min" +msgstr "Mínimo flotante" + +msgid "Float Range" +msgstr "Rango flotante" + +msgid "Float Steps" +msgstr "Pasos flotantes" + +msgid "Floats" +msgstr "Flotantes" + +msgid "Focal Length" +msgstr "Distancia focal" + +msgid "Focal Length World Scale" +msgstr "Escala mundial de distancia focal" + +msgid "Focus Distance" +msgstr "Distancia de enfoque" + +msgid "Font Color" +msgstr "Color de fuente" + +msgid "Font Size" +msgstr "Tamaño de fuente" + +msgid "Format" +msgstr "Formato" + +msgid "Format Center" +msgstr "Centro de formato" + +msgid "Frames Mode" +msgstr "Modo de fotogramas" + +msgid "From" +msgstr "Desde" + +msgid "Frustum" +msgstr "Frustum" + +msgid "GL Line Width" +msgstr "Ancho de línea GL" + +msgid "GL Point Width" +msgstr "Ancho de punto GL" + +msgid "Gain" +msgstr "Ganancia" + +msgid "Gamma" +msgstr "Gamma" + +msgid "Geometry Bound" +msgstr "Límite de geometría" + +msgid "Geometry Parameters" +msgstr "Parámetros de geometría" + +msgid "Global" +msgstr "Global" + +msgid "Globals Mode" +msgstr "Modo de globales" + +msgid "Glossy" +msgstr "Brillo" + +msgid "Glossy Visible" +msgstr "Brillo visible" + +msgid "Grid Color" +msgstr "Color de cuadrícula" + +msgid "Grid Pixel Width" +msgstr "Ancho de cuadrícula en píxeles" + +msgid "Guiding Training Samples" +msgstr "Muestras de entrenamiento de guiado" + +msgid "Hair Shape" +msgstr "Forma de cabello" + +msgid "Hair Subdivisions" +msgstr "Subdivisiones de cabello" + +msgid "Half Bandwidth" +msgstr "Medio ancho de banda" + +msgid "Half Width" +msgstr "Medio ancho" + +msgid "Heterogeneous Volume" +msgstr "Volumen heterogéneo" + +msgid "Holdout" +msgstr "Recorte" + +msgid "Horizontal" +msgstr "Horizontal" + +msgid "Horizontal Alignment" +msgstr "Alineación horizontal" + +msgid "Horizontal Aperture" +msgstr "Apertura horizontal" + +msgid "Hue" +msgstr "Tono" + +msgid "Id" +msgstr "ID" + +msgid "Id List" +msgstr "Lista de IDs" + +msgid "Id List Variable" +msgstr "Variable de lista de IDs" + +msgid "Iff" +msgstr "IFF" + +msgid "Ignore Basis" +msgstr "Ignorar base" + +msgid "Ignore Incompatible" +msgstr "Ignorar incompatibles" + +msgid "Ignore Missing" +msgstr "Ignorar faltantes" + +msgid "Ignore Missing Alpha" +msgstr "Ignorar alfa faltante" + +msgid "Ignore Missing Target" +msgstr "Ignorar objetivo faltante" + +msgid "Ignore Missing Variable" +msgstr "Ignorar variable faltante" + +msgid "Ignore Script Load Errors" +msgstr "Ignorar errores de carga de script" + +msgid "Ignore Transparent" +msgstr "Ignorar transparentes" + +msgid "Image Index" +msgstr "Índice de imagen" + +msgid "Image Name" +msgstr "Nombre de imagen" + +msgid "Image Names" +msgstr "Nombres de imagen" + +msgid "Immediate" +msgstr "Inmediato" + +msgid "In Mode" +msgstr "Modo de entrada" + +msgid "In0" +msgstr "Entrada0" + +msgid "In1" +msgstr "Entrada1" + +msgid "Include Global Attributes" +msgstr "Incluir atributos globales" + +msgid "Include Inherited" +msgstr "Incluir heredados" + +msgid "Include Root" +msgstr "Incluir raíz" + +msgid "Included Purposes" +msgstr "Propósitos incluidos" + +msgid "Inclusions" +msgstr "Inclusiones" + +msgid "Index" +msgstr "Índice" + +msgid "Index Context Variable" +msgstr "Variable de contexto de índice" + +msgid "Index Variable" +msgstr "Variable de índice" + +msgid "Infilling" +msgstr "Relleno" + +msgid "Inherit" +msgstr "Heredar" + +msgid "Inherit Attributes" +msgstr "Heredar atributos" + +msgid "Inherit Set Membership" +msgstr "Heredar pertenencia a conjunto" + +msgid "Inherit Transform" +msgstr "Heredar transformación" + +msgid "Input Color Space" +msgstr "Espacio de color de entrada" + +msgid "Input Space" +msgstr "Espacio de entrada" + +msgid "Int Max" +msgstr "Máximo entero" + +msgid "Int Min" +msgstr "Mínimo entero" + +msgid "Int Step" +msgstr "Paso entero" + +msgid "Interior Bandwidth" +msgstr "Ancho de banda interior" + +msgid "Interpolate" +msgstr "Interpolar" + +msgid "Interpolate Boundary" +msgstr "Interpolar límite" + +msgid "Ints" +msgstr "Enteros" + +msgid "Invert" +msgstr "Invertir" + +msgid "Invert Names" +msgstr "Invertir nombres" + +msgid "Invert Selection" +msgstr "Invertir selección" + +msgid "Is Caustics Caster" +msgstr "Emite cáusticas" + +msgid "Is Caustics Receiver" +msgstr "Recibe cáusticas" + +msgid "Is Shadow Catcher" +msgstr "Recibe sombras" + +msgid "Iso Value" +msgstr "Valor ISO" + +msgid "Isolated" +msgstr "Aislado" + +msgid "Item Format" +msgstr "Formato de elemento" + +msgid "Iterations" +msgstr "Iteraciones" + +msgid "Job Name" +msgstr "Nombre de trabajo" + +msgid "Jobs Directory" +msgstr "Directorio de trabajos" + +msgid "Keep Cameras" +msgstr "Conservar cámaras" + +msgid "Keep Lights" +msgstr "Conservar luces" + +msgid "Keep Reference Position" +msgstr "Conservar posición de referencia" + +msgid "Label" +msgstr "Etiqueta" + +msgid "Label Type" +msgstr "Tipo de etiqueta" + +msgid "Layer" +msgstr "Capa" + +msgid "Layer Boundaries" +msgstr "Límites de capa" + +msgid "Layer Variable" +msgstr "Variable de capa" + +msgid "Left Handed" +msgstr "Zurdo" + +msgid "Lift" +msgstr "Elevación" + +msgid "Light Frustum Scale" +msgstr "Escala de frustum de luz" + +msgid "Light Group" +msgstr "Grupo de luz" + +msgid "Light Sampling Threshold" +msgstr "Umbral de muestreo de luz" + +msgid "Line Width" +msgstr "Ancho de línea" + +msgid "Linked Lights" +msgstr "Luces vinculadas" + +msgid "Localise" +msgstr "Localizar" + +msgid "Log Level" +msgstr "Nivel de registro" + +msgid "Look" +msgstr "Aspecto" + +msgid "Look Through Aperture" +msgstr "Apertura de visualización" + +msgid "Look Through Clipping Planes" +msgstr "Planos de recorte de visualización" + +msgid "Manifest Directory" +msgstr "Directorio de manifiesto" + +msgid "Manifest Scene" +msgstr "Escena de manifiesto" + +msgid "Manifest Source" +msgstr "Fuente de manifiesto" + +msgid "Margin Bottom" +msgstr "Margen inferior" + +msgid "Margin Left" +msgstr "Margen izquierdo" + +msgid "Margin Right" +msgstr "Margen derecho" + +msgid "Margin Top" +msgstr "Margen superior" + +msgid "Mask" +msgstr "Máscara" + +msgid "Mask Channel" +msgstr "Canal de máscara" + +msgid "Mask Variable" +msgstr "Variable de máscara" + +msgid "Master Channel" +msgstr "Canal maestro" + +msgid "Match" +msgstr "Coincidencia" + +msgid "Match Data Windows" +msgstr "Coincidir ventanas de datos" + +msgid "Matches" +msgstr "Coincidencias" + +msgid "Matrix" +msgstr "Matriz" + +msgid "Matte Exclusions" +msgstr "Exclusiones de máscara" + +msgid "Matte Inclusions" +msgstr "Inclusiones de máscara" + +msgid "Matte Names" +msgstr "Nombres de máscara" + +msgid "Max Blur Radius" +msgstr "Radio máximo de desenfoque" + +msgid "Max Clamp To" +msgstr "Limitar máximo a" + +msgid "Max Clamp To Enabled" +msgstr "Limitación de máximo habilitada" + +msgid "Max Enabled" +msgstr "Máximo habilitado" + +msgid "Max Level" +msgstr "Nivel máximo" + +msgid "Max Radius" +msgstr "Radio máximo" + +msgid "Max Texture Resolution" +msgstr "Resolución máxima de textura" + +msgid "Max Transparency" +msgstr "Transparencia máxima" + +msgid "Merge Globals" +msgstr "Fusionar globales" + +msgid "Merge Metadata" +msgstr "Fusionar metadatos" + +msgid "Messages" +msgstr "Mensajes" + +msgid "Min Bounces" +msgstr "Rebotes mínimos" + +msgid "Min Clamp To" +msgstr "Limitar mínimo a" + +msgid "Min Clamp To Enabled" +msgstr "Limitación de mínimo habilitada" + +msgid "Min Enabled" +msgstr "Mínimo habilitado" + +msgid "Min Transparency" +msgstr "Transparencia mínima" + +msgid "Missing Frame Mode" +msgstr "Modo de fotograma faltante" + +msgid "Missing Source Mode" +msgstr "Modo de origen faltante" + +msgid "Mist Depth" +msgstr "Profundidad de niebla" + +msgid "Mist Falloff" +msgstr "Atenuación de niebla" + +msgid "Mist Start" +msgstr "Inicio de niebla" + +msgid "Mode" +msgstr "Modo" + +msgid "Multiply" +msgstr "Multiplicar" + +msgid "Name From Segment" +msgstr "Nombre desde segmento" + +msgid "Names" +msgstr "Nombres" + +msgid "Near Clip" +msgstr "Recorte cercano" + +msgid "Normal" +msgstr "Normal" + +msgid "Object Mode" +msgstr "Modo de objeto" + +msgid "Object Space" +msgstr "Espacio de objeto" + +msgid "Occluded Threshold" +msgstr "Umbral de oclusión" + +msgid "Omit Duplicate Ids" +msgstr "Omitir IDs duplicados" + +msgid "Openexr" +msgstr "OpenEXR" + +msgid "Operation" +msgstr "Operación" + +msgid "Order" +msgstr "Orden" + +msgid "Orthogonal" +msgstr "Ortogonal" + +msgid "Orthographic Aperture" +msgstr "Apertura ortográfica" + +msgid "Out Color" +msgstr "Color de salida" + +msgid "Out Float" +msgstr "Flotante de salida" + +msgid "Out Mode" +msgstr "Modo de salida" + +msgid "Out Strings" +msgstr "Cadenas de salida" + +msgid "Outline" +msgstr "Contorno" + +msgid "Outline Color" +msgstr "Color de contorno" + +msgid "Outline Width" +msgstr "Ancho de contorno" + +msgid "Output Channel" +msgstr "Canal de salida" + +msgid "Output Space" +msgstr "Espacio de salida" + +msgid "Overscan" +msgstr "Sobreescaneo" + +msgid "Overscan Bottom" +msgstr "Sobreescaneo inferior" + +msgid "Overscan Left" +msgstr "Sobreescaneo izquierdo" + +msgid "Overscan Right" +msgstr "Sobreescaneo derecho" + +msgid "Overscan Top" +msgstr "Sobreescaneo superior" + +msgid "Overwrite Existing Normals" +msgstr "Sobrescribir normales existentes" + +msgid "P0" +msgstr "P0" + +msgid "P1" +msgstr "P1" + +msgid "Padding" +msgstr "Relleno" + +msgid "Parent Variable" +msgstr "Variable de primario" + +msgid "Part Name" +msgstr "Nombre de parte" + +msgid "Pass Alpha Threshold" +msgstr "Umbral alfa de pase" + +msgid "Path Guiding" +msgstr "Guiado de trayectoria" + +msgid "Paths" +msgstr "Rutas" + +msgid "Performance Monitor" +msgstr "Monitor de rendimiento" + +msgid "Perspective Mode" +msgstr "Modo de perspectiva" + +msgid "Pivot" +msgstr "Pivote" + +msgid "Pixel" +msgstr "Píxel" + +msgid "Pixel Aspect Ratio" +msgstr "Proporción de píxel" + +msgid "Pixel Data" +msgstr "Datos de píxel" + +msgid "Pixel Size" +msgstr "Tamaño de píxel" + +msgid "Png" +msgstr "PNG" + +msgid "Point Color" +msgstr "Color de punto" + +msgid "Point Type" +msgstr "Tipo de punto" + +msgid "Point Width" +msgstr "Ancho de punto" + +msgid "Points" +msgstr "Puntos" + +msgid "Post Task0" +msgstr "Postarea0" + +msgid "Post Tasks" +msgstr "Postareas" + +msgid "Power" +msgstr "Potencia" + +msgid "Pre Task0" +msgstr "Pretarea0" + +msgid "Pre Tasks" +msgstr "Pretareas" + +msgid "Precise Bounds" +msgstr "Límites precisos" + +msgid "Precision" +msgstr "Precisión" + +msgid "Prefix" +msgstr "Prefijo" + +msgid "Primitive Variable" +msgstr "Variable primitiva" + +msgid "Process Unpremultiplied" +msgstr "Procesar sin premultiplicar" + +msgid "Projection" +msgstr "Proyección" + +msgid "Prototype Index" +msgstr "Índice de prototipo" + +msgid "Prototype Mode" +msgstr "Modo de prototipo" + +msgid "Prototype Roots" +msgstr "Raíces de prototipo" + +msgid "Prototype Roots List" +msgstr "Lista de raíces de prototipo" + +msgid "Prune Occluded" +msgstr "Podar ocluidos" + +msgid "Prune Transparent" +msgstr "Podar transparentes" + +msgid "Quantize" +msgstr "Cuantizar" + +msgid "Quaternion" +msgstr "Cuaternión" + +msgid "Radius Channel" +msgstr "Canal de radio" + +msgid "Raw Seed" +msgstr "Semilla sin procesar" + +msgid "Reference Frame" +msgstr "Fotograma de referencia" + +msgid "Reference Position" +msgstr "Posición de referencia" + +msgid "Reflective Caustics" +msgstr "Cáusticas reflectivas" + +msgid "Refractive Caustics" +msgstr "Cáusticas refractivas" + +msgid "Refresh Count" +msgstr "Contador de actualización" + +msgid "Relative Location" +msgstr "Ubicación relativa" + +msgid "Relative Transform" +msgstr "Transformación relativa" + +msgid "Render Setting Overrides" +msgstr "Sobrescrituras de ajustes de render" + +msgid "Require Variation" +msgstr "Requerir variación" + +msgid "Reset Origin" +msgstr "Restablecer origen" + +msgid "Resolution" +msgstr "Resolución" + +msgid "Resolution Multiplier" +msgstr "Multiplicador de resolución" + +msgid "Resolved Renderer" +msgstr "Renderizador resuelto" + +msgid "Resolved Rows" +msgstr "Filas resueltas" + +msgid "Rla" +msgstr "RLA" + +msgid "Root" +msgstr "Raíz" + +msgid "Root Layers" +msgstr "Capas raíz" + +msgid "Root Name Variable" +msgstr "Variable de nombre raíz" + +msgid "Root Names" +msgstr "Nombres raíz" + +msgid "Roots" +msgstr "Raíces" + +msgid "Rotate" +msgstr "Rotar" + +msgid "Roughness Threshold" +msgstr "Umbral de rugosidad" + +msgid "Rows" +msgstr "Filas" + +msgid "Sample Clamp Direct" +msgstr "Limitación de muestras directas" + +msgid "Sample Clamp Indirect" +msgstr "Limitación de muestras indirectas" + +msgid "Sample Motion" +msgstr "Muestreo de movimiento" + +msgid "Sample Offsets" +msgstr "Desplazamientos de muestra" + +msgid "Scale" +msgstr "Escala" + +msgid "Scatter Visible" +msgstr "Dispersión visible" + +msgid "Scheme" +msgstr "Esquema" + +msgid "Seed" +msgstr "Semilla" + +msgid "Seed Enabled" +msgstr "Semilla habilitada" + +msgid "Seed Permutation" +msgstr "Permutación de semilla" + +msgid "Seed Value" +msgstr "Valor de semilla" + +msgid "Seed Variable" +msgstr "Variable de semilla" + +msgid "Seeds" +msgstr "Semillas" + +msgid "Segment" +msgstr "Segmento" + +msgid "Selection Mode" +msgstr "Modo de selección" + +msgid "Selector" +msgstr "Selector" + +msgid "Sequence" +msgstr "Secuencia" + +msgid "Set Expression" +msgstr "Expresión de conjunto" + +msgid "Set Names" +msgstr "Nombres de conjunto" + +msgid "Set Variable" +msgstr "Variable de conjunto" + +msgid "Sets" +msgstr "Conjuntos" + +msgid "Sgi" +msgstr "SGI" + +msgid "Shaded" +msgstr "Sombreado" + +msgid "Shader Name" +msgstr "Nombre de shader" + +msgid "Shader Parameter" +msgstr "Parámetro de shader" + +msgid "Shader Type" +msgstr "Tipo de shader" + +msgid "Shading System" +msgstr "Sistema de sombreado" + +msgid "Shadow Blur" +msgstr "Desenfoque de sombra" + +msgid "Shadow Offset" +msgstr "Desplazamiento de sombra" + +msgid "Shadow Visible" +msgstr "Sombra visible" + +msgid "Shadowed Lights" +msgstr "Luces con sombra" + +msgid "Shell" +msgstr "Shell" + +msgid "Show Active Pixels" +msgstr "Mostrar píxeles activos" + +msgid "Shuffles" +msgstr "Reorganizaciones" + +msgid "Shutter" +msgstr "Obturador" + +msgid "Sidecar File" +msgstr "Archivo auxiliar" + +msgid "Source Location" +msgstr "Ubicación de origen" + +msgid "Source Root" +msgstr "Raíz de origen" + +msgid "Space" +msgstr "Espacio" + +msgid "Spacing" +msgstr "Espaciado" + +msgid "Speed" +msgstr "Velocidad" + +msgid "Start" +msgstr "Inicio" + +msgid "Start Position" +msgstr "Posición inicial" + +msgid "Start Sample" +msgstr "Muestra inicial" + +msgid "Step" +msgstr "Paso" + +msgid "Step Size" +msgstr "Tamaño de paso" + +msgid "Strength" +msgstr "Fuerza" + +msgid "String" +msgstr "Cadena" + +msgid "Strings" +msgstr "Cadenas" + +msgid "Stripe Width" +msgstr "Ancho de franja" + +msgid "Suffix Context Variable" +msgstr "Variable de contexto de sufijo" + +msgid "Suffixes" +msgstr "Sufijos" + +msgid "Tags" +msgstr "Etiquetas" + +msgid "Tangent" +msgstr "Tangente" + +msgid "Target" +msgstr "Objetivo" + +msgid "Target Frame" +msgstr "Fotograma objetivo" + +msgid "Target Mode" +msgstr "Modo objetivo" + +msgid "Target Offset" +msgstr "Desplazamiento de objetivo" + +msgid "Target Scene" +msgstr "Escena objetivo" + +msgid "Target Shader" +msgstr "Shader objetivo" + +msgid "Target UV" +msgstr "UV objetivo" + +msgid "Target Vertex" +msgstr "Vértice objetivo" + +msgid "Task" +msgstr "Tarea" + +msgid "Task0" +msgstr "Tarea0" + +msgid "Tasks" +msgstr "Tareas" + +msgid "Terminator Geometry Offset" +msgstr "Desfase terminador geom." + +msgid "Terminator Shading Offset" +msgstr "Desfase terminador sombra" + +msgid "Tessellate Polygons" +msgstr "Teselar polígonos" + +msgid "Texture Size Limit" +msgstr "Límite de tamaño de textura" + +msgid "Theta Max" +msgstr "Theta máximo" + +msgid "Thickness" +msgstr "Grosor" + +msgid "Threads" +msgstr "Hilos" + +msgid "Threshold Angle" +msgstr "Ángulo umbral" + +msgid "Tiff" +msgstr "TIFF" + +msgid "Tile Index Variable" +msgstr "Variable de índice de bloque" + +msgid "Tile Name Variable" +msgstr "Variable de nombre de bloque" + +msgid "Tile Names" +msgstr "Nombres de bloque" + +msgid "Tile Size" +msgstr "Tamaño de bloque" + +msgid "Tile Variable" +msgstr "Variable de bloque" + +msgid "Tiles" +msgstr "Bloques" + +msgid "Time Limit" +msgstr "Límite de tiempo" + +msgid "Time Offset" +msgstr "Desplazamiento de tiempo" + +msgid "Title" +msgstr "Título" + +msgid "Transform Blur" +msgstr "Desenfoque de transformación" + +msgid "Transform Mode" +msgstr "Modo de transformación" + +msgid "Transform Segments" +msgstr "Segmentos de transformación" + +msgid "Translate" +msgstr "Trasladar" + +msgid "Transmission" +msgstr "Transmisión" + +msgid "Transmission Visible" +msgstr "Transmisión visible" + +msgid "Transparent" +msgstr "Transparente" + +msgid "Transparent Shadow" +msgstr "Sombra transparente" + +msgid "Triangle Subdivision Rule" +msgstr "Regla de subdivisión de triángulo" + +msgid "Twist" +msgstr "Torsión" + +msgid "U Tangent" +msgstr "Tangente U" + +msgid "Udim" +msgstr "UDIM" + +msgid "Up" +msgstr "Arriba" + +msgid "Usage" +msgstr "Uso" + +msgid "Use Attributes" +msgstr "Usar atributos" + +msgid "Use Auto Tile" +msgstr "Usar bloque automático" + +msgid "Use Color Source Alpha" +msgstr "Usar alfa de fuente de color" + +msgid "Use Deep Visibility" +msgstr "Usar visibilidad de profundidad" + +msgid "Use Denoise Pass Albedo" +msgstr "Usar pase de albedo para eliminación de ruido" + +msgid "Use Denoise Pass Normal" +msgstr "Usar pase de normales para eliminación de ruido" + +msgid "Use Derivatives" +msgstr "Usar derivadas" + +msgid "Use GL Lines" +msgstr "Usar líneas GL" + +msgid "Use GL Points" +msgstr "Usar puntos GL" + +msgid "Use Hair BVH" +msgstr "Usar BVH de cabello" + +msgid "Use Holdout" +msgstr "Usar recorte" + +msgid "Use Light Tree" +msgstr "Usar árbol de luces" + +msgid "Use Profiling" +msgstr "Usar perfilado" + +msgid "Use Regular Expressions" +msgstr "Usar expresiones regulares" + +msgid "Use Shader" +msgstr "Usar shader" + +msgid "Use Spatial Splits" +msgstr "Usar divisiones espaciales" + +msgid "Use Surface Guiding" +msgstr "Usar guiado de superficie" + +msgid "Use Target Frame" +msgstr "Usar fotograma objetivo" + +msgid "Use Transform" +msgstr "Usar transformación" + +msgid "Use Velocity" +msgstr "Usar velocidad" + +msgid "Use Volume Guiding" +msgstr "Usar guiado de volumen" + +msgid "Uv" +msgstr "UV" + +msgid "Uv Distortion" +msgstr "Distorsión UV" + +msgid "Uv Set" +msgstr "Conjunto UV" + +msgid "V Tangent" +msgstr "Tangente V" + +msgid "Variable" +msgstr "Variable" + +msgid "Variations" +msgstr "Variaciones" + +msgid "Vector" +msgstr "Vector" + +msgid "Vector Mode" +msgstr "Modo de vector" + +msgid "Vector Units" +msgstr "Unidades de vector" + +msgid "Velocity" +msgstr "Velocidad" + +msgid "Velocity Scale" +msgstr "Escala de velocidad" + +msgid "Verrtical Alignment" +msgstr "Alineación vertical" + +msgid "Vertical" +msgstr "Vertical" + +msgid "Vertical Alignment" +msgstr "Alineación vertical" + +msgid "View" +msgstr "Vista" + +msgid "View Names" +msgstr "Nombres de vista" + +msgid "Views" +msgstr "Vistas" + +msgid "Visible" +msgstr "Visible" + +msgid "Visualiser Attributes" +msgstr "Atributos de visualizador" + +msgid "Volume Interpolation" +msgstr "Interpolación de volumen" + +msgid "Volume Max Steps" +msgstr "Pasos máximos de volumen" + +msgid "Volume Sampling" +msgstr "Muestreo de volumen" + +msgid "Volume Step Rate" +msgstr "Tasa de pasos de volumen" + +msgid "Volume Step Size" +msgstr "Tamaño de paso de volumen" + +msgid "Voxel Size" +msgstr "Tamaño de vóxel" + +msgid "Webp" +msgstr "WebP" + +msgid "Weighting" +msgstr "Ponderación" + +msgid "Weights" +msgstr "Pesos" + +msgid "White Clamp" +msgstr "Limitación de blancos" + +msgid "White Point" +msgstr "Punto blanco" + +msgid "Width Channel" +msgstr "Canal de ancho" + +msgid "Width Scale" +msgstr "Escala de ancho" + +msgid "Wireframe Color" +msgstr "Color de malla de alambre" + +msgid "Wireframe Width" +msgstr "Ancho de malla de alambre" + +msgid "Working Space" +msgstr "Espacio de trabajo" + +msgid "X Axis" +msgstr "Eje X" + +msgid "X Enabled" +msgstr "X habilitado" + +msgid "Y Axis" +msgstr "Eje Y" + +msgid "Y Enabled" +msgstr "Y habilitado" + +msgid "Z Axis" +msgstr "Eje Z" + +msgid "Z Back Channel" +msgstr "Canal Z trasero" + +msgid "Z Back Mode" +msgstr "Modo Z trasero" + +msgid "Z Channel" +msgstr "Canal Z" + +msgid "Z Enabled" +msgstr "Z habilitado" + +msgid "Z Max" +msgstr "Z máximo" + +msgid "Z Min" +msgstr "Z mínimo" + +msgid "Z Mode" +msgstr "Modo Z" + +msgid "3D Curves" +msgstr "Curvas 3D" + +msgid "Above" +msgstr "Arriba" + +msgid "Absolute" +msgstr "Absoluto" + +msgid "Accurate" +msgstr "Preciso" + +msgid "Any" +msgstr "Cualquiera" + +msgid "Ao" +msgstr "OA" + +msgid "Aov Color" +msgstr "Color VAS" + +msgid "Aov Value" +msgstr "Valor VAS" + +msgid "Aperture and Focal Length" +msgstr "Apertura y distancia focal" + +msgid "Atop" +msgstr "Encima" + +msgid "Auto" +msgstr "Automático" + +msgid "Automatic" +msgstr "Automático" + +msgid "Batch" +msgstr "Lote" + +msgid "Below" +msgstr "Abajo" + +msgid "Best" +msgstr "Mejor" + +msgid "Black" +msgstr "Negro" + +msgid "Black Outside" +msgstr "Negro exterior" + +msgid "Blobby" +msgstr "Globular" + +msgid "Both" +msgstr "Ambos" + +msgid "Bottom" +msgstr "Inferior" + +msgid "Boundaries" +msgstr "Límites" + +msgid "Bump" +msgstr "Relieve" + +msgid "Clamp to Range" +msgstr "Limitar al rango" + +msgid "Color Range" +msgstr "Rango de color" + +msgid "Combined" +msgstr "Combinado" + +msgid "Corners Only" +msgstr "Solo esquinas" + +msgid "Corners Plus 1" +msgstr "Esquinas más 1" + +msgid "Corners Plus 2" +msgstr "Esquinas más 2" + +msgid "Create" +msgstr "Crear" + +msgid "Current Frame" +msgstr "Fotograma actual" + +msgid "Custom Camera" +msgstr "Cámara personalizada" + +msgid "Custom Range" +msgstr "Rango personalizado" + +msgid "Denoising Albedo" +msgstr "Albedo de eliminación de ruido" + +msgid "Denoising Depth" +msgstr "Profundidad de eliminación de ruido" + +msgid "Denoising Normal" +msgstr "Normal de eliminación de ruido" + +msgid "Denoising Previous" +msgstr "Previa de eliminación de ruido" + +msgid "Depth Range" +msgstr "Rango de profundidad" + +msgid "Difference" +msgstr "Diferencia" + +msgid "Diffuse Color" +msgstr "Color difuso" + +msgid "Diffuse Direct" +msgstr "Difuso directo" + +msgid "Diffuse Indirect" +msgstr "Difuso indirecto" + +msgid "Disk" +msgstr "Disco" + +msgid "Distort" +msgstr "Distorsionar" + +msgid "Divide" +msgstr "Dividir" + +msgid "Double" +msgstr "Doble" + +msgid "Edge And Corner" +msgstr "Borde y esquina" + +msgid "Edge Only" +msgstr "Solo borde" + +msgid "Emission" +msgstr "Emisión" + +msgid "Equal" +msgstr "Igual" + +msgid "Error Check" +msgstr "Verificación de errores" + +msgid "Fast" +msgstr "Rápido" + +msgid "Fill" +msgstr "Rellenar" + +msgid "Filtered" +msgstr "Filtrado" + +msgid "Filtered Depth" +msgstr "Profundidad filtrada" + +msgid "Fit" +msgstr "Ajustar" + +msgid "Fixed" +msgstr "Fijo" + +msgid "Flat" +msgstr "Plano" + +msgid "Float" +msgstr "Flotante" + +msgid "Float List" +msgstr "Lista de flotantes" + +msgid "For All" +msgstr "Para todos" + +msgid "For GL Points" +msgstr "Para puntos GL" + +msgid "For Particles And Disks" +msgstr "Para partículas y discos" + +msgid "Forward" +msgstr "Adelante" + +msgid "From Mesh" +msgstr "Desde malla" + +msgid "Front" +msgstr "Frontal" + +msgid "Front-Back" +msgstr "Frontal-trasero" + +msgid "Full" +msgstr "Completo" + +msgid "Full Range" +msgstr "Rango completo" + +msgid "Glossy Color" +msgstr "Color de brillo" + +msgid "Glossy Direct" +msgstr "Brillo directo" + +msgid "Glossy Indirect" +msgstr "Brillo indirecto" + +msgid "Half" +msgstr "Medio" + +msgid "Half Float" +msgstr "Medio flotante" + +msgid "Hold" +msgstr "Mantener" + +msgid "Id List Primitive Variable" +msgstr "Variable primitiva de lista de IDs" + +msgid "Ignore" +msgstr "Ignorar" + +msgid "Indexed (Roots List)" +msgstr "Indexado (lista de raíces)" + +msgid "Indexed (Roots Variable)" +msgstr "Indexado (variable de raíces)" + +msgid "Int List" +msgstr "Lista de enteros" + +msgid "Int Range" +msgstr "Rango entero" + +msgid "Inverse" +msgstr "Inverso" + +msgid "Justified" +msgstr "Justificado" + +msgid "Keep" +msgstr "Conservar" + +msgid "Keys" +msgstr "Claves" + +msgid "Layers" +msgstr "Capas" + +msgid "Left" +msgstr "Izquierda" + +msgid "Legacy" +msgstr "Legado" + +msgid "Linear" +msgstr "Lineal" + +msgid "Local" +msgstr "Local" + +msgid "Loop" +msgstr "Bucle" + +msgid "Mask Primitive Variable" +msgstr "Variable primitiva de máscara" + +msgid "Material Id" +msgstr "ID de material" + +msgid "Mesh" +msgstr "Malla" + +msgid "Middle" +msgstr "Centro" + +msgid "Mist" +msgstr "Niebla" + +msgid "Motion" +msgstr "Movimiento" + +msgid "Motion Weight" +msgstr "Peso de movimiento" + +msgid "Multiple-Importance" +msgstr "Importancia múltiple" + +msgid "Nearest" +msgstr "Más cercano" + +msgid "No Limit" +msgstr "Sin límite" + +msgid "Object Id" +msgstr "ID de objeto" + +msgid "Off" +msgstr "Desactivado" + +msgid "On" +msgstr "Activado" + +msgid "Origin" +msgstr "Origen" + +msgid "Orthographic" +msgstr "Ortográfico" + +msgid "Over" +msgstr "Delante" + +msgid "Override to Float" +msgstr "Sobrescribir a flotante" + +msgid "Part per Layer" +msgstr "Parte por capa" + +msgid "Part per View" +msgstr "Parte por vista" + +msgid "Particle" +msgstr "Partícula" + +msgid "Patch" +msgstr "Parche" + +msgid "Perspective" +msgstr "Perspectiva" + +msgid "Pixels" +msgstr "Píxeles" + +msgid "Polygon" +msgstr "Polígono" + +msgid "Premultiplied" +msgstr "Premultiplicado" + +msgid "Raw" +msgstr "Sin procesar" + +msgid "Relative" +msgstr "Relativo" + +msgid "Render Camera" +msgstr "Cámara de render" + +msgid "Reset Local" +msgstr "Restablecer local" + +msgid "Reset World" +msgstr "Restablecer mundo" + +msgid "Right" +msgstr "Derecha" + +msgid "Root per Vertex" +msgstr "Raíz por vértice" + +msgid "Roughness" +msgstr "Rugosidad" + +msgid "Round Ribbons" +msgstr "Cintas redondas" + +msgid "Sample Count" +msgstr "Contador de muestras" + +msgid "Scanline" +msgstr "Barrido" + +msgid "Scene Camera" +msgstr "Cámara de escena" + +msgid "Scene Description" +msgstr "Descripción de escena" + +msgid "Scene Location" +msgstr "Ubicación de escena" + +msgid "Screen" +msgstr "Trama" + +msgid "Shader Node Color" +msgstr "Color de nodo de shader" + +msgid "Shadow Catcher" +msgstr "Receptor de sombras" + +msgid "Shadow Catcher Matte" +msgstr "Máscara de receptor de sombras" + +msgid "Shadow Catcher Sample Count" +msgstr "Muestras de receptor de sombras" + +msgid "Single" +msgstr "Único" + +msgid "Single Part" +msgstr "Parte única" + +msgid "Smooth" +msgstr "Suave" + +msgid "Sorted" +msgstr "Ordenado" + +msgid "Standard" +msgstr "Estándar" + +msgid "String List" +msgstr "Lista de cadenas" + +msgid "Subdivision Surface" +msgstr "Superficie de subdivisión" + +msgid "Subtract" +msgstr "Restar" + +msgid "Tile" +msgstr "Bloque" + +msgid "Time" +msgstr "Tiempo" + +msgid "Top" +msgstr "Superior" + +msgid "Transmission Color" +msgstr "Color de transmisión" + +msgid "Transmission Direct" +msgstr "Transmisión directa" + +msgid "Transmission Indirect" +msgstr "Transmisión indirecta" + +msgid "Triangle" +msgstr "Triángulo" + +msgid "True" +msgstr "Verdadero" + +msgid "Unchanged" +msgstr "Sin cambios" + +msgid "Under" +msgstr "Debajo" + +msgid "Uniform (Faceted)" +msgstr "Uniforme (facetado)" + +msgid "Unpremultiplied" +msgstr "Sin premultiplicar" + +msgid "Upstream Node Name" +msgstr "Nombre del nodo previo" + +msgid "Use Default" +msgstr "Usar predeterminado" + +msgid "Vertex (Smooth)" +msgstr "Vértice (suave)" + +msgid "Vertex Primitive Variable" +msgstr "Variable primitiva de vértice" + +msgid "Volume Direct" +msgstr "Volumen directo" + +msgid "Volume Indirect" +msgstr "Volumen indirecto" + +msgid "When Selected" +msgstr "Cuando esté seleccionado" + +msgid "World" +msgstr "Mundo" + +msgid "Absorption Coefficient" +msgstr "Coeficiente de absorción" + +msgid "Absorption Color" +msgstr "Color de absorción" + +msgid "Age" +msgstr "Edad" + +msgid "Air" +msgstr "Aire" + +msgid "Alpha" +msgstr "Alfa" + +msgid "Alpha Type" +msgstr "Tipo de alfa" + +msgid "Altitude" +msgstr "Altitud" + +msgid "Angular_velocity" +msgstr "Velocidad angular" + +msgid "Animated" +msgstr "Animado" + +msgid "Anisotropic" +msgstr "Anisotrópico" + +msgid "Anisotropic Rotation" +msgstr "Rotación anisotrópica" + +msgid "Anisotropy" +msgstr "Anisotropía" + +msgid "BSDF" +msgstr "BSDF" + +msgid "BSSRDF" +msgstr "BSSRDF" + +msgid "Backfacing" +msgstr "Cara posterior" + +msgid "Bands Direction" +msgstr "Dirección de bandas" + +msgid "Bias" +msgstr "Sesgo" + +msgid "Blackbody Intensity" +msgstr "Intensidad de cuerpo negro" + +msgid "Blackbody Tint" +msgstr "Tinte de cuerpo negro" + +msgid "Blend" +msgstr "Mezcla" + +msgid "Blending Mode" +msgstr "Modo de mezcla" + +msgid "Brick Width" +msgstr "Ancho de ladrillo" + +msgid "Clamp Type" +msgstr "Tipo de limitación" + +msgid "Closure" +msgstr "Cierre" + +msgid "Closure1" +msgstr "Cierre1" + +msgid "Closure2" +msgstr "Cierre2" + +msgid "Coat" +msgstr "Barniz" + +msgid "Color Attribute" +msgstr "Atributo de color" + +msgid "Color1" +msgstr "Color1" + +msgid "Color2" +msgstr "Color2" + +msgid "Colorspace" +msgstr "Espacio de color" + +msgid "Component" +msgstr "Componente" + +msgid "Density Attribute" +msgstr "Atributo de densidad" + +msgid "Detail" +msgstr "Detalle" + +msgid "Detail Roughness" +msgstr "Rugosidad de detalle" + +msgid "Detail Scale" +msgstr "Escala de detalle" + +msgid "Diffuse_depth" +msgstr "Profundidad de difuso" + +msgid "Distribution" +msgstr "Distribución" + +msgid "Dust" +msgstr "Polvo" + +msgid "Emission Color" +msgstr "Color de emisión" + +msgid "Emission Strength" +msgstr "Fuerza de emisión" + +msgid "Exponent" +msgstr "Exponente" + +msgid "Extension" +msgstr "Extensión" + +msgid "Extrapolate" +msgstr "Extrapolar" + +msgid "Fac" +msgstr "Factor" + +msgid "Facing" +msgstr "Orientación" + +msgid "Factor" +msgstr "Factor" + +msgid "Feature" +msgstr "Característica" + +msgid "Fresnel" +msgstr "Fresnel" + +msgid "From Dupli" +msgstr "Desde duplicado" + +msgid "From Max" +msgstr "Desde máximo" + +msgid "From Min" +msgstr "Desde mínimo" + +msgid "Generated" +msgstr "Generado" + +msgid "Glossy_depth" +msgstr "Profundidad de brillo" + +msgid "Gradient Type" +msgstr "Tipo de gradiente" + +msgid "Ground Albedo" +msgstr "Albedo del suelo" + +msgid "IOR" +msgstr "IOR" + +msgid "IOR Level" +msgstr "Nivel IOR" + +msgid "Incoming" +msgstr "Entrante" + +msgid "Intercept" +msgstr "Intercepción" + +msgid "Interpolation Type" +msgstr "Tipo de interpolación" + +msgid "Is_camera_ray" +msgstr "Es rayo de cámara" + +msgid "Is_diffuse_ray" +msgstr "Es rayo difuso" + +msgid "Is_glossy_ray" +msgstr "Es rayo de brillo" + +msgid "Is_reflection_ray" +msgstr "Es rayo de reflexión" + +msgid "Is_shadow_ray" +msgstr "Es rayo de sombra" + +msgid "Is_singular_ray" +msgstr "Es rayo singular" + +msgid "Is_strand" +msgstr "Es hebra" + +msgid "Is_transmission_ray" +msgstr "Es rayo de transmisión" + +msgid "Is_volume_scatter_ray" +msgstr "Es rayo de dispersión de volumen" + +msgid "Lacunarity" +msgstr "Lacunaridad" + +msgid "Lifetime" +msgstr "Vida útil" + +msgid "Material_index" +msgstr "Índice de material" + +msgid "Max X" +msgstr "X máximo" + +msgid "Melanin" +msgstr "Melanina" + +msgid "Melanin Redness" +msgstr "Rojez de melanina" + +msgid "Metallic" +msgstr "Metálico" + +msgid "Method" +msgstr "Método" + +msgid "Metric" +msgstr "Métrica" + +msgid "Midlevel" +msgstr "Nivel medio" + +msgid "Min X" +msgstr "X mínimo" + +msgid "Model" +msgstr "Modelo" + +msgid "Mortar" +msgstr "Mortero" + +msgid "Mortar Size" +msgstr "Tamaño de mortero" + +msgid "Mortar Smooth" +msgstr "Suavizado de mortero" + +msgid "Object Transform" +msgstr "Transformación de objeto" + +msgid "Object_index" +msgstr "Índice de objeto" + +msgid "Offset Frequency" +msgstr "Frecuencia de desplazamiento" + +msgid "Ozone" +msgstr "Ozono" + +msgid "Parametric" +msgstr "Paramétrico" + +msgid "Parametrization" +msgstr "Parametrización" + +msgid "Phase" +msgstr "Fase" + +msgid "Pointiness" +msgstr "Agudeza" + +msgid "Profile" +msgstr "Perfil" + +msgid "Projection Blend" +msgstr "Mezcla de proyección" + +msgid "Quadratic" +msgstr "Cuadrático" + +msgid "Radial Roughness" +msgstr "Rugosidad radial" + +msgid "Random Color" +msgstr "Color aleatorio" + +msgid "Random Roughness" +msgstr "Rugosidad aleatoria" + +msgid "Random_per_island" +msgstr "Aleatorio por isla" + +msgid "Randomness" +msgstr "Aleatoriedad" + +msgid "Ray_depth" +msgstr "Profundidad de rayo" + +msgid "Ray_length" +msgstr "Longitud de rayo" + +msgid "Reflection" +msgstr "Reflexión" + +msgid "Result" +msgstr "Resultado" + +msgid "Rings Direction" +msgstr "Dirección de anillos" + +msgid "Rotation" +msgstr "Rotación" + +msgid "Roughness U" +msgstr "Rugosidad U" + +msgid "Roughness V" +msgstr "Rugosidad V" + +msgid "Row_height" +msgstr "Altura de fila" + +msgid "Sample Center" +msgstr "Centro de muestra" + +msgid "Sample X" +msgstr "Muestra X" + +msgid "Sample Y" +msgstr "Muestra Y" + +msgid "Smoothness" +msgstr "Suavidad" + +msgid "Squash" +msgstr "Aplastamiento" + +msgid "Squash Frequency" +msgstr "Frecuencia de aplastamiento" + +msgid "Sun Direction" +msgstr "Dirección del sol" + +msgid "Sun Disc" +msgstr "Disco solar" + +msgid "Sun Elevation" +msgstr "Elevación del sol" + +msgid "Sun Intensity" +msgstr "Intensidad del sol" + +msgid "Sun Rotation" +msgstr "Rotación del sol" + +msgid "Sun Size" +msgstr "Tamaño del sol" + +msgid "TRT" +msgstr "TRT" + +msgid "TT" +msgstr "TT" + +msgid "Tangent_normal" +msgstr "Normal tangente" + +msgid "Temperature" +msgstr "Temperatura" + +msgid "Temperature Attribute" +msgstr "Atributo de temperatura" + +msgid "Tint" +msgstr "Tinte" + +msgid "To Max" +msgstr "Hasta máximo" + +msgid "To Min" +msgstr "Hasta mínimo" + +msgid "Translation" +msgstr "Traslación" + +msgid "Transmission_depth" +msgstr "Profundidad de transmisión" + +msgid "Transparent_depth" +msgstr "Profundidad de transparente" + +msgid "True_normal" +msgstr "Normal verdadera" + +msgid "Turbidity" +msgstr "Turbidez" + +msgid "UV" +msgstr "UV" + +msgid "Use Min Max" +msgstr "Usar mín/máx" + +msgid "Use Object Space" +msgstr "Usar espacio de objeto" + +msgid "Use Pixel Size" +msgstr "Usar tamaño de píxel" + +msgid "Val" +msgstr "Valor" + +msgid "Value1" +msgstr "Valor1" + +msgid "Value2" +msgstr "Valor2" + +msgid "Value3" +msgstr "Valor3" + +msgid "Vector1" +msgstr "Vector1" + +msgid "Vector2" +msgstr "Vector2" + +msgid "Vector3" +msgstr "Vector3" + +msgid "Wave Type" +msgstr "Tipo de onda" + +msgid "Wavelength" +msgstr "Longitud de onda" + +msgid "Weight" +msgstr "Peso" + +msgid "Window" +msgstr "Ventana" + +msgid "X Mapping" +msgstr "Mapeo X" + +msgid "Y Mapping" +msgstr "Mapeo Y" + +msgid "Z Mapping" +msgstr "Mapeo Z" + +msgid "Absorption coefficient" +msgstr "Coeficiente de absorción" + +msgid "Associated" +msgstr "Asociado" + +msgid "Bands" +msgstr "Bandas" + +msgid "Burn" +msgstr "Subexponer" + +msgid "Ceil" +msgstr "Techo" + +msgid "Channel packed" +msgstr "Canales empaquetados" + +msgid "Closest" +msgstr "Más cercano" + +msgid "Compare" +msgstr "Comparar" + +msgid "Cross product" +msgstr "Producto cruzado" + +msgid "Darken" +msgstr "Oscurecer" + +msgid "Degrees" +msgstr "Grados" + +msgid "Diagonal" +msgstr "Diagonal" + +msgid "Direct coloring" +msgstr "Coloración directa" + +msgid "Distance to edge" +msgstr "Distancia al borde" + +msgid "Dodge" +msgstr "Sobreexponer" + +msgid "Dot product" +msgstr "Producto punto" + +msgid "Exclusion" +msgstr "Exclusión" + +msgid "Floor" +msgstr "Piso" + +msgid "Floored modulo" +msgstr "Módulo con piso" + +msgid "Fraction" +msgstr "Fracción" + +msgid "Greater than" +msgstr "Mayor que" + +msgid "Less than" +msgstr "Menor que" + +msgid "Lighten" +msgstr "Aclarar" + +msgid "Linear light" +msgstr "Luz lineal" + +msgid "Maximum" +msgstr "Máximo" + +msgid "Melanin concentration" +msgstr "Concentración de melanina" + +msgid "Minimum" +msgstr "Mínimo" + +msgid "Mirror ball" +msgstr "Bola espejo" + +msgid "Modulo" +msgstr "Módulo" + +msgid "Multiply add" +msgstr "Multiplicar y sumar" + +msgid "Overlay" +msgstr "Superponer" + +msgid "Periodic" +msgstr "Periódico" + +msgid "Point" +msgstr "Punto" + +msgid "Radial" +msgstr "Radial" + +msgid "Radians" +msgstr "Radianes" + +msgid "Random walk" +msgstr "Caminata aleatoria" + +msgid "Random walk skin" +msgstr "Caminata aleatoria de piel" + +msgid "Range" +msgstr "Rango" + +msgid "Reflect" +msgstr "Reflejar" + +msgid "Refract" +msgstr "Refractar" + +msgid "Rings" +msgstr "Anillos" + +msgid "Round" +msgstr "Redondear" + +msgid "Saw" +msgstr "Sierra" + +msgid "Sign" +msgstr "Signo" + +msgid "Smart" +msgstr "Inteligente" + +msgid "Soft light" +msgstr "Luz suave" + +msgid "Spherical" +msgstr "Esférico" + +msgid "Stepped" +msgstr "Escalonado" + +msgid "Tube" +msgstr "Tubo" + +msgid "Unassociated" +msgstr "No asociado" + +msgid "Uv map" +msgstr "Mapa UV" + +msgid "Wrap" +msgstr "Envolver" + +msgid "Copy Path" +msgstr "Copiar ruta" + +msgid "Copy Paths" +msgstr "Copiar rutas" + +msgid "Frame Selection" +msgstr "Encuadrar selección" + +msgid "Replace existing bookmark?" +msgstr "¿Reemplazar marcador existente?" + +msgid "A bookmark named {} already exists. Do you want to replace it?" +msgstr "Ya existe un marcador llamado {}. ¿Desea reemplazarlo?" + +msgid "Querying Set Names" +msgstr "Consultando nombres de conjunto" + +msgid "Favourites" +msgstr "Favoritos" + +msgid "Favourite" +msgstr "Favorito" + +msgid "Remove All" +msgstr "Eliminar todos" + +msgid "Reset to Default" +msgstr "Restablecer a predeterminado" + +msgid "Save as Default" +msgstr "Guardar como predeterminado" + +msgid "Rename Selected Render Pass..." +msgstr "Renombrar pase de render seleccionado..." + +msgid "Delete Selected Render Passes" +msgstr "Eliminar pases de render seleccionados" + +msgid "

Renaming will only affect the current edit scope.

\nReferences elsewhere in the node graph may need to be updated manually." +msgstr "

Renombrar solo afectará al ámbito de edición actual.

\nLas referencias en otras partes del grafo de nodos pueden necesitar actualización manual." + +msgid "Disable Render Pass" +msgstr "Desactivar pase de render" + +msgid "Disable Render Passes" +msgstr "Desactivar pases de render" + +msgid "Click on the header to add columns." +msgstr "Hacer clic en la cabecera para añadir columnas." + +msgid "Click to add columns." +msgstr "Hacer clic para añadir columnas." + +msgid "Backdrop" +msgstr "Fondo" + +msgid "Arnold AOV Shader" +msgstr "Shader de VAS de Arnold" + +msgid "Arnold Atmosphere" +msgstr "Atmósfera de Arnold" + +msgid "Arnold Attributes" +msgstr "Atributos de Arnold" + +msgid "Arnold Background" +msgstr "Fondo de Arnold" + +msgid "Arnold Camera Shaders" +msgstr "Shaders de cámara de Arnold" + +msgid "Arnold Displacement" +msgstr "Desplazamiento de Arnold" + +msgid "Arnold Imager" +msgstr "Procesador de imagen de Arnold" + +msgid "Arnold Options" +msgstr "Opciones de Arnold" + +msgid "Arnold Procedural" +msgstr "Procedural de Arnold" + +msgid "Arnold Shader Ball" +msgstr "Esfera de shader de Arnold" + +msgid "Arnold VDB" +msgstr "VDB de Arnold" + +msgid "Cycles Attributes" +msgstr "Atributos de Cycles" + +msgid "Cycles Background" +msgstr "Fondo de Cycles" + +msgid "Cycles Options" +msgstr "Opciones de Cycles" + +msgid "Cycles Shader Ball" +msgstr "Esfera de shader de Cycles" + +msgid "Delight Attributes" +msgstr "Atributos de Delight" + +msgid "Delight Options" +msgstr "Opciones de Delight" + +msgid "Render Man Attributes" +msgstr "Atributos de RenderMan" + +msgid "Render Man Display Filter" +msgstr "Filtro de visualización de RenderMan" + +msgid "Render Man Integrator" +msgstr "Integrador de RenderMan" + +msgid "Render Man Options" +msgstr "Opciones de RenderMan" + +msgid "Render Man Sample Filter" +msgstr "Filtro de muestras de RenderMan" + +msgid "USD Attributes" +msgstr "Atributos USD" + +msgid "Kind" +msgstr "Tipo" + +msgid "Assembly" +msgstr "Ensamblaje" + +msgid "Sub Component" +msgstr "Subcomponente" + +msgid "Subcomponent" +msgstr "Subcomponente" + +msgid "Proxy" +msgstr "Proxy" + +msgid "Guide" +msgstr "Guía" + +msgid "USD Layer Writer" +msgstr "Escritor de capas" + +msgid "USD Shader" +msgstr "Shader USD" + +msgid "USD Light" +msgstr "Luz USD" + +msgid "Preview Surface" +msgstr "Superficie de vista previa" + +msgid "UV Texture" +msgstr "Textura UV" + +msgid "Transform 2D" +msgstr "Transformación 2D" + +msgid "Primvar Reader" +msgstr "Lector de primvar" + +msgid "Int" +msgstr "Entero" + +msgid "Float2" +msgstr "Flotante2" + +msgid "Float3" +msgstr "Flotante3" + +msgid "Float4" +msgstr "Flotante4" + +msgid "Usd Preview Surface" +msgstr "Superficie de vista previa USD" + +msgid "Usd UV Texture" +msgstr "Textura UV USD" + +msgid "Usd Transform2d" +msgstr "Transformación 2D USD" + +msgid "Usd Primvar Reader int" +msgstr "Primvar entero USD" + +msgid "Usd Primvar Reader float" +msgstr "Primvar flotante USD" + +msgid "Usd Primvar Reader float2" +msgstr "Primvar flotante2 USD" + +msgid "Usd Primvar Reader float3" +msgstr "Primvar flotante3 USD" + +msgid "Usd Primvar Reader float4" +msgstr "Primvar flotante4 USD" + +msgid "Usd Primvar Reader string" +msgstr "Primvar cadena USD" + +msgid "Usd Primvar Reader point" +msgstr "Primvar punto USD" + +msgid "Usd Primvar Reader vector" +msgstr "Primvar vector USD" + +msgid "Usd Primvar Reader normal" +msgstr "Primvar normal USD" + +msgid "Distant Light" +msgstr "Luz distante" + +msgid "Disk Light" +msgstr "Luz de disco" + +msgid "Rect Light" +msgstr "Luz rectangular" + +msgid "Sphere Light" +msgstr "Luz esférica" + +msgid "Cylinder Light" +msgstr "Luz cilíndrica" + +msgid "Dome Light" +msgstr "Luz de domo" + +msgid "Spot Light" +msgstr "Luz focal" + +msgid "Arnold Shader" +msgstr "Shader de Arnold" + +msgid "Arnold Light" +msgstr "Luz de Arnold" + +msgid "Cycles Shader" +msgstr "Shader de Cycles" + +msgid "Cycles Light" +msgstr "Luz de Cycles" + +msgid "Delight Shader" +msgstr "Shader de Delight" + +msgid "Delight Light" +msgstr "Luz de Delight" + +msgid "Open GL Attributes" +msgstr "Atributos de OpenGL" + +msgid "Image Reader" +msgstr "Cargar imagen" + +msgid "Image Writer" +msgstr "Exportar imagen" + +msgid "Image Transform" +msgstr "Transformar imagen" + +msgid "Image Metadata" +msgstr "Metadatos de imagen" + +msgid "Image Sampler" +msgstr "Muestreador de imagen" + +msgid "Image Stats" +msgstr "Estadísticas de imagen" + +msgid "Copy Image Metadata" +msgstr "Copiar metadatos de imagen" + +msgid "Delete Image Metadata" +msgstr "Eliminar metadatos de imagen" + +msgid "Shuffle Image Metadata" +msgstr "Reorganizar metadatos de imagen" + +msgid "Collect Images" +msgstr "Recopilar imágenes" + +msgid "Copy Channels" +msgstr "Copiar canales" + +msgid "Delete Channels" +msgstr "Eliminar canales" + +msgid "Deep Merge" +msgstr "Fusión profunda" + +msgid "Deep Sample Counts" +msgstr "Conteo de muestras profundas" + +msgid "Deep Tidy" +msgstr "Ordenar profundidad" + +msgid "Deep To Flat" +msgstr "Profundidad a plano" + +msgid "Flat To Deep" +msgstr "Plano a profundidad" + +msgid "Scene Reader" +msgstr "Cargar escena" + +msgid "Scene Writer" +msgstr "Exportar escena" + +msgid "Collect Scenes" +msgstr "Recopilar escenas" + +msgid "Merge Scenes" +msgstr "Fusionar escenas" + +msgid "Scene Transform" +msgstr "Transformar escena" + +msgid "Text 3D" +msgstr "Texto 3D" + +msgid "Text 2D" +msgstr "Texto 2D" + +msgid "Sub Tree" +msgstr "Subárbol" + +msgid "Mesh Tessellate" +msgstr "Teselar malla" + +msgid "OSL Code" +msgstr "Código OSL" + +msgid "OSL Image" +msgstr "Imagen OSL" + +msgid "OSL Object" +msgstr "Objeto OSL" + +msgid "Bleed Fill" +msgstr "Relleno por sangrado" + +msgid "Box In" +msgstr "Entrada de caja" + +msgid "Box Out" +msgstr "Salida de caja" + +msgid "Data Window Query" +msgstr "Consulta de ventana de datos" + +msgid "Disk Blur" +msgstr "Desenfoque de disco" + +msgid "Display Transform" +msgstr "Transformación de visualización" + +msgid "Focal Blur" +msgstr "Desenfoque focal" + +msgid "Format Query" +msgstr "Consulta de formato" + +msgid "Look Transform" +msgstr "Transformación de apariencia" + +msgid "Motion Path" +msgstr "Trayectoria de movimiento" + +msgid "Open Color IO Context" +msgstr "Contexto de OpenColorIO" + +msgid "Promote Point Instances" +msgstr "Promover instancias de puntos" + +msgid "Random Choice" +msgstr "Elección aleatoria" + +msgid "Vector Warp" +msgstr "Deformación vectorial" + +msgid "Conversion" +msgstr "Conversión" + +msgid "Image Processing" +msgstr "Procesamiento de imagen" + +msgid "Material X" +msgstr "Material X" + +msgid "Maths" +msgstr "Matemáticas" + +msgid "Object Processing" +msgstr "Procesamiento de objeto" + +msgid "3delight" +msgstr "3Delight" + +msgid "Surface" +msgstr "Superficie" + +msgid "Add Color" +msgstr "Sumar color" + +msgid "Add Float" +msgstr "Sumar flotante" + +msgid "Add Vector" +msgstr "Sumar vector" + +msgid "Cross Product" +msgstr "Producto cruzado" + +msgid "Divide Color" +msgstr "Dividir color" + +msgid "Divide Float" +msgstr "Dividir flotante" + +msgid "Divide Vector" +msgstr "Dividir vector" + +msgid "Dot Product" +msgstr "Producto punto" + +msgid "Invert Matrix" +msgstr "Invertir matriz" + +msgid "Matrix Transform" +msgstr "Transformación de matriz" + +msgid "Mix Color" +msgstr "Mezclar color" + +msgid "Mix Float" +msgstr "Mezclar flotante" + +msgid "Mix Vector" +msgstr "Mezclar vector" + +msgid "Multiply Color" +msgstr "Multiplicar color" + +msgid "Multiply Float" +msgstr "Multiplicar flotante" + +msgid "Multiply Vector" +msgstr "Multiplicar vector" + +msgid "Pow Float" +msgstr "Potencia flotante" + +msgid "Round Float" +msgstr "Redondear flotante" + +msgid "Scale Vector" +msgstr "Escalar vector" + +msgid "Sin Float" +msgstr "Seno flotante" + +msgid "Subtract Color" +msgstr "Restar color" + +msgid "Subtract Float" +msgstr "Restar flotante" + +msgid "Subtract Vector" +msgstr "Restar vector" + +msgid "Color To Float" +msgstr "Color a flotante" + +msgid "Color To Vector" +msgstr "Color a vector" + +msgid "Float To Color" +msgstr "Flotante a color" + +msgid "Float To Vector" +msgstr "Flotante a vector" + +msgid "Vector To Color" +msgstr "Vector a color" + +msgid "Vector To Float" +msgstr "Vector a flotante" + +msgid "In Channel" +msgstr "Entrada de canal" + +msgid "In Color" +msgstr "Entrada de color" + +msgid "In Float" +msgstr "Entrada de flotante" + +msgid "In Int" +msgstr "Entrada de entero" + +msgid "In Layer" +msgstr "Entrada de capa" + +msgid "In Matrix" +msgstr "Entrada de matriz" + +msgid "In Normal" +msgstr "Entrada de normal" + +msgid "In Point" +msgstr "Entrada de punto" + +msgid "In String" +msgstr "Entrada de cadena" + +msgid "In UV" +msgstr "Entrada UV" + +msgid "In Vector" +msgstr "Entrada de vector" + +msgid "Out Channel" +msgstr "Salida de canal" + +msgid "Out Image" +msgstr "Salida de imagen" + +msgid "Out Int" +msgstr "Salida de entero" + +msgid "Out Layer" +msgstr "Salida de capa" + +msgid "Out Matrix" +msgstr "Salida de matriz" + +msgid "Out Normal" +msgstr "Salida de normal" + +msgid "Out Object" +msgstr "Salida de objeto" + +msgid "Out Point" +msgstr "Salida de punto" + +msgid "Out String" +msgstr "Salida de cadena" + +msgid "Out UV" +msgstr "Salida UV" + +msgid "Out Vector" +msgstr "Salida de vector" + +msgid "Color Spline" +msgstr "Spline de color" + +msgid "Float Spline" +msgstr "Spline de flotante" + +msgid "Noise" +msgstr "Ruido" + +msgid "Point Noise" +msgstr "Ruido de punto" + +msgid "Compare Color" +msgstr "Comparar color" + +msgid "Compare Float" +msgstr "Comparar flotante" + +msgid "Compare Vector" +msgstr "Comparar vector" + +msgid "Coordinate System Matrix" +msgstr "Matriz de sistema de coordenadas" + +msgid "Coordinate System Transform" +msgstr "Transformación de sistema de coordenadas" + +msgid "Luminance" +msgstr "Luminancia" + +msgid "Remap Color" +msgstr "Remapear color" + +msgid "Remap Float" +msgstr "Remapear flotante" + +msgid "Remap Vector" +msgstr "Remapear vector" + +msgid "Switch Color" +msgstr "Cambiar color" + +msgid "Switch Float" +msgstr "Cambiar flotante" + +msgid "Switch Vector" +msgstr "Cambiar vector" + +msgid "dl AOV Group Four" +msgstr "dl grupo VAS cuatro" + +msgid "emitter" +msgstr "emisor" + +msgid "Emitter" +msgstr "Emisor" + +msgid "glass" +msgstr "vidrio" + +msgid "Glass" +msgstr "Vidrio" + +msgid "mandelbrot" +msgstr "mandelbrot" + +msgid "matte" +msgstr "máscara" + +msgid "metal" +msgstr "metal" + +msgid "ubersurface" +msgstr "ubersuperficie" + +msgid "image" +msgstr "imagen" + +msgid "mx_pack_color" +msgstr "mx_pack_color" + +msgid "Backups" +msgstr "Copias de seguridad" + +msgid "Frequency" +msgstr "Frecuencia" + +msgid "Files" +msgstr "Archivos" + +msgid "UI Language" +msgstr "Idioma de la interfaz" + +msgid "Use Translated Node Names" +msgstr "Traducir nombres de nodos" + +msgid "Use Translated Tooltips" +msgstr "Usar tooltips traducidos" + +msgid "Language Changed" +msgstr "Idioma cambiado" + +msgid "The language change will take effect after restarting Gaffer." +msgstr "Cambio de idioma tendrá efecto después de reiniciar Gaffer." + +msgid "Default Clipping Planes" +msgstr "Planos de recorte predeterminados" + +msgid "Default Distant Aperture" +msgstr "Apertura distante predeterminada" + +msgid "Expansion" +msgstr "Expansión" + +msgid "Purpose" +msgstr "Propósito" + +msgid "Select" +msgstr "Seleccionar" + +msgid "Show Lights" +msgstr "Mostrar luces" + +msgid "UI Display Transform" +msgstr "Transformación de visualización de UI" + +msgid "A descriptive name for the job." +msgstr "Nombre descriptivo para el trabajo." + +msgid "A directory to store temporary files used by the dispatcher." +msgstr "Directorio para almacenar archivos temporales usados por el despachador." + +msgid "A little test node" +msgstr "A little test node" + +msgid "Applies 3Delight attributes to objects in the scene." +msgstr "Aplica atributos de 3Delight a los objetos de la escena." + +msgid "Applies Cycles attributes to objects in the scene." +msgstr "Aplica atributos de Cycles a los objetos de la escena." + +msgid "Applies a gaussian blur to the image." +msgstr "Aplica un desenfoque gaussiano a la imagen." + +msgid "Deletes channels from an image." +msgstr "Elimina canales de una imagen." + +msgid "Deletes the alpha channel." +msgstr "Elimina el alfa channel." + +msgid "Depth for far clip." +msgstr "Profundidad del recorte lejano." + +msgid "Enables far clip." +msgstr "Habilita far clip." + +msgid "Enables near clip." +msgstr "Habilita near clip." + +msgid "Enables this view." +msgstr "Habilita this view." + +msgid "Outputs the input specified by the index." +msgstr "Emite la entrada specified by el índice." + +msgid "Renames locations in the scene." +msgstr "Renombra locations in la escena." + +msgid "Runs model inference." +msgstr "Ejecuta model inference." + +msgid "Runs python code." +msgstr "Ejecuta python code." + +msgid "Runs system commands via a shell." +msgstr "Ejecuta comandos de sistema a través de una terminal." + +msgid "Switches between upstream tasks, so that only one is chosen for execution." +msgstr "Cambia entre tareas anteriores, de modo que solo una se elige para ejecución." + +msgid "Test description" +msgstr "Test description" + +msgid "The A input." +msgstr "The A input." + +msgid "The B input." +msgstr "The B input." + +msgid "The colour of the image." +msgstr "Color de la imagen." + +msgid "The colour space of the input image." +msgstr "el espacio de color of la entrada image." + +msgid "The colour space of the output image." +msgstr "el espacio de color of la salida image." + +msgid "The data window of the image." +msgstr "la ventana de datos of la imagen." + +msgid "The direction to perform the color transformation." +msgstr "Dirección para realizar la transformación de color." + +msgid "The filter to query." +msgstr "el filtro to query." + +msgid "The first operand" +msgstr "The first operand" + +msgid "The image to query." +msgstr "la imagen to query." + +msgid "The input" +msgstr "la entrada" + +msgid "The input scene." +msgstr "Escena de entrada." + +msgid "The inputs to the model." +msgstr "la entradas to el modol." + +msgid "The name of the object in the output scene." +msgstr "el nombre of el objeto in la salida scene." + +msgid "The name of the option to query." +msgstr "Nombre de la opción que se consulta." + +msgid "The output" +msgstr "la salida" + +msgid "The output from the shader." +msgstr "la salida from el shader." + +msgid "The output image." +msgstr "Imagen de salida." + +msgid "The output mesh." +msgstr "la salida mesh." + +msgid "The output scene." +msgstr "Escena de salida." + +msgid "The output tensor." +msgstr "la salida tensor." + +msgid "The outputs from the model." +msgstr "la salidas from el modol." + +msgid "The processed output scene." +msgstr "Escena de salida procesada." + +msgid "The render type to assign." +msgstr "el render type to assign." + +msgid "The resolution and aspect ratio of the image." +msgstr "Resolución y relación de aspecto de la imagen." + +msgid "The resulting image." +msgstr "el resultadoing image." + +msgid "The sampled colour." +msgstr "The sampled colour." + +msgid "The scene to query." +msgstr "la escena to query." + +msgid "The shader to be assigned." +msgstr "Shader a asignar." + +msgid "The size of the data window of the image." +msgstr "el tamaño of la ventana de datos of la imagen." + +msgid "The tasks to be executed by this dispatcher." +msgstr "Tareas a ejecutar por este despachador." + +msgid "The transform applied to the object." +msgstr "la transformación applied to el objeto." + +msgid "The type of render to perform." +msgstr "el tipo of render to perform." + +msgid "The view to inspect" +msgstr "The view to inspect" + +msgid "The view to query." +msgstr "The view to query." + +msgid "Used to collect tasks for dispatching all at once." +msgstr "Se usa para recopilar tareas para despachar todas a la vez." + +msgid "Used to schedule the execution of a network of TaskNodes." +msgstr "Se usa para programar la ejecución de una red de nodos de tarea." + +msgid "otherValue" +msgstr "otherValue" + +msgid "plugValueWidget:type" +msgstr "plugValueWidget:type" + +msgid "preset:One" +msgstr "preset:One" + +msgid "testTarget1" +msgstr "testTarget1" + +msgid "1001" +msgstr "1001" + +msgid "1002" +msgstr "1002" + +msgid "Base" +msgstr "Base" + +msgid "Border Check Max" +msgstr "Borde Check máximo" + +msgid "Border Check Min" +msgstr "Borde Check mínimo" + +msgid "Border Check Na N" +msgstr "Borde Check Na N" + +msgid "Border Color Mode" +msgstr "Borde color modo" + +msgid "Border Error Color" +msgstr "Borde Error color" + +msgid "Border Max" +msgstr "Borde máximo" + +msgid "Border Min" +msgstr "Borde mínimo" + +msgid "Border Width" +msgstr "Borde ancho" + +msgid "Borders Enabled" +msgstr "Borders habilitado" + +msgid "Buttons" +msgstr "Botones" + +msgid "Color Field" +msgstr "Campo de color" + +msgid "Color Steps" +msgstr "Pasos de color" + +msgid "Computed F Stop" +msgstr "Diafragma calculado" + +msgid "Data" +msgstr "Datos" + +msgid "Data Name" +msgstr "Data nombre" + +msgid "Defaults" +msgstr "Predeterminados" + +msgid "Delete Inputs" +msgstr "Eliminar entradas" + +msgid "Device" +msgstr "Dispositivo" + +msgid "Drawing Mode" +msgstr "Modo de dibujo" + +msgid "Enabled Renderers" +msgstr "Motores de render habilitados" + +msgid "Env Key" +msgstr "Clave de entorno" + +msgid "Fps" +msgstr "Fps" + +msgid "Gnomon" +msgstr "Gnomon" + +msgid "In Angle" +msgstr "Entrada ángulo" + +msgid "In Axis" +msgstr "Entrada eje" + +msgid "In Euler" +msgstr "Entrada Euler" + +msgid "In Order" +msgstr "Entrada Order" + +msgid "In Quaternion" +msgstr "Entrada Quaternion" + +msgid "In X Axis" +msgstr "Entrada X eje" + +msgid "In Y Axis" +msgstr "Entrada Y eje" + +msgid "In Z Axis" +msgstr "Entrada Z eje" + +msgid "Inspector" +msgstr "Inspector" + +msgid "Inspectors" +msgstr "Inspectores" + +msgid "Interleave Channels" +msgstr "Interleave canales" + +msgid "Interleaved Channels" +msgstr "Interleaved canales" + +msgid "Label Color" +msgstr "Color de etiqueta" + +msgid "Label Format" +msgstr "Formato de etiqueta" + +msgid "Label Scale" +msgstr "Label escala" + +msgid "Label Shadow" +msgstr "Label sombra" + +msgid "Label Shadow Blur" +msgstr "Label sombra Blur" + +msgid "Label Shadow Color" +msgstr "Label sombra color" + +msgid "Label Shadow Offset" +msgstr "Label sombra desplazamiento" + +msgid "Labels Enabled" +msgstr "Labels habilitado" + +msgid "Lut GPU" +msgstr "LUT GPU" + +msgid "One" +msgstr "Uno" + +msgid "Opacity" +msgstr "Opacidad" + +msgid "Open Color IO" +msgstr "Open color IO" + +msgid "Out Angle" +msgstr "Salida ángulo" + +msgid "Out Axis" +msgstr "Salida eje" + +msgid "Out Divisions" +msgstr "Salida Divisions" + +msgid "Out Euler" +msgstr "Salida Euler" + +msgid "Out Order" +msgstr "Salida Order" + +msgid "Out Quaternion" +msgstr "Salida Quaternion" + +msgid "Out X Axis" +msgstr "Salida X eje" + +msgid "Out Y Axis" +msgstr "Salida Y eje" + +msgid "Out Z Axis" +msgstr "Salida Z eje" + +msgid "Pass Through" +msgstr "Paso directo" + +msgid "Plugs" +msgstr "Conectores" + +msgid "Port" +msgstr "Puerto" + +msgid "Property Filters" +msgstr "Propiedad Filters" + +msgid "Random Axis" +msgstr "Random eje" + +msgid "Random Enabled" +msgstr "Random habilitado" + +msgid "Random Space" +msgstr "Random espacio" + +msgid "Random Spread" +msgstr "Dispersión aleatoria" + +msgid "Random Twist" +msgstr "Torsión aleatoria" + +msgid "Select Mode" +msgstr "Modo de selección" + +msgid "Selection Mask" +msgstr "Selection máscara" + +msgid "Service" +msgstr "Servicio" + +msgid "Shading Mode" +msgstr "Modo de shading" + +msgid "Shape Mode" +msgstr "Forma modo" + +msgid "Show hidden" +msgstr "Mostrar ocultos" + +msgid "Sliders" +msgstr "Deslizadores" + +msgid "State" +msgstr "Estado" + +msgid "Tensor" +msgstr "Tensor" + +msgid "Tensor Element Type" +msgstr "Tensor Element tipo" + +msgid "TestNodeLabel" +msgstr "TestNodeLabel" + +msgid "Two" +msgstr "Dos" + +msgid "Unsaved Changes" +msgstr "Cambios sin guardar" + +msgid "Value Max" +msgstr "Valor máximo" + +msgid "Value Min" +msgstr "Valor mínimo" + +msgid "Vector Color" +msgstr "Vector color" + +msgid "Vector Scale" +msgstr "Vector escala" + +msgid "Vertex Ids" +msgstr "IDs de vértice" + +msgid "Visible Controls" +msgstr "Controles visibles" + +msgid "__ui Position" +msgstr "__ui posición" + +msgid "adaptivity" +msgstr "adaptivity" + +msgid "add Layer Prefix" +msgstr "agregar capa prefijo" + +msgid "add Prefix" +msgstr "agregar prefijo" + +msgid "add Suffix" +msgstr "agregar sufijo" + +msgid "adjust Bounds" +msgstr "ajustar límites" + +msgid "affect Data Window" +msgstr "affect Data Window" + +msgid "aim" +msgstr "aim" + +msgid "alpha Channel" +msgstr "alfa canal" + +msgid "alpha Threshold" +msgstr "alfa umbral" + +msgid "ancestor Match" +msgstr "ancestor Match" + +msgid "aperture" +msgstr "aperture" + +msgid "aperture Offset" +msgstr "aperture desplazamiento" + +msgid "approximation Threshold" +msgstr "approximation umbral" + +msgid "area" +msgstr "area" + +msgid "area Source" +msgstr "area fuente" + +msgid "attribute" +msgstr "attribute" + +msgid "attribute Context Variable" +msgstr "attribute contexto variable" + +msgid "attribute Name" +msgstr "attribute nombre" + +msgid "attribute Prefix" +msgstr "attribute prefijo" + +msgid "attribute Suffix" +msgstr "attribute sufijo" + +msgid "attributes" +msgstr "atributos" + +msgid "attributes Mode" +msgstr "atributos modo" + +msgid "available Frames" +msgstr "available Frames" + +msgid "average" +msgstr "average" + +msgid "background Depth Value" +msgstr "fondo profundidad valor" + +msgid "base" +msgstr "base" + +msgid "base Color" +msgstr "base color" + +msgid "bi Tangent" +msgstr "bi tangente" + +msgid "black Clamp" +msgstr "black limitar" + +msgid "black Point" +msgstr "punto negro" + +msgid "blur Multiplier" +msgstr "blur Multiplier" + +msgid "border Check Max" +msgstr "borde Check máximo" + +msgid "border Check Min" +msgstr "borde Check mínimo" + +msgid "border Check Na N" +msgstr "borde Check Na N" + +msgid "border Color" +msgstr "borde color" + +msgid "border Color Metadata" +msgstr "borde color metadatos" + +msgid "border Color Mode" +msgstr "borde color modo" + +msgid "border Error Color" +msgstr "borde Error color" + +msgid "border Max" +msgstr "borde máximo" + +msgid "border Min" +msgstr "borde mínimo" + +msgid "border Pixel Width" +msgstr "borde Pixel ancho" + +msgid "border Width" +msgstr "borde ancho" + +msgid "borders Enabled" +msgstr "borders habilitado" + +msgid "bound" +msgstr "bound" + +msgid "bound Mode" +msgstr "bound modo" + +msgid "bounding Mode" +msgstr "bounding modo" + +msgid "calculate Normals" +msgstr "calculate Normals" + +msgid "camera" +msgstr "camera" + +msgid "camera Mode" +msgstr "camera modo" + +msgid "camera Path" +msgstr "camera Path" + +msgid "camera Scene" +msgstr "camera escena" + +msgid "camera Visibility" +msgstr "camera visibilidad" + +msgid "center" +msgstr "center" + +msgid "center Color" +msgstr "center color" + +msgid "center Pixel Width" +msgstr "center Pixel ancho" + +msgid "channel Interpretation" +msgstr "canal Interpretation" + +msgid "channels" +msgstr "canales" + +msgid "children" +msgstr "secundarios" + +msgid "choices" +msgstr "choices" + +msgid "client" +msgstr "client" + +msgid "clipping Planes" +msgstr "clipping Planes" + +msgid "closest Ancestor" +msgstr "closest Ancestor" + +msgid "code" +msgstr "code" + +msgid "color" +msgstr "color" + +msgid "color A" +msgstr "color A" + +msgid "color B" +msgstr "color B" + +msgid "color Overrides" +msgstr "sobrescrituras de color" + +msgid "color Source" +msgstr "color fuente" + +msgid "color Space" +msgstr "espacio de color" + +msgid "color Steps" +msgstr "color Steps" + +msgid "compare" +msgstr "compare" + +msgid "computed F Stop" +msgstr "computed F Stop" + +msgid "concatenate" +msgstr "concatenate" + +msgid "config" +msgstr "config" + +msgid "connected Inputs" +msgstr "connected Inputs" + +msgid "connectivity" +msgstr "connectivity" + +msgid "context" +msgstr "contexto" + +msgid "context Values" +msgstr "contexto Values" + +msgid "context Variable" +msgstr "variable de contexto" + +msgid "context Variables" +msgstr "contexto variables" + +msgid "copies" +msgstr "copies" + +msgid "copy From" +msgstr "copy From" + +msgid "copy Source Attributes" +msgstr "copy fuente atributos" + +msgid "corner Radius" +msgstr "corner radio" + +msgid "curve Index" +msgstr "curve índice" + +msgid "curves" +msgstr "curves" + +msgid "custom Format" +msgstr "custom Format" + +msgid "data" +msgstr "data" + +msgid "data Name" +msgstr "data nombre" + +msgid "data Window" +msgstr "ventana de datos" + +msgid "debug" +msgstr "debug" + +msgid "deep State" +msgstr "profundo estado" + +msgid "default" +msgstr "default" + +msgid "default Format" +msgstr "default Format" + +msgid "default Light" +msgstr "default Light" + +msgid "delete Existing" +msgstr "delete Existing" + +msgid "delete Inputs" +msgstr "delete Inputs" + +msgid "delete Prefix" +msgstr "delete prefijo" + +msgid "delete Suffix" +msgstr "delete sufijo" + +msgid "density" +msgstr "densidad" + +msgid "density Channel" +msgstr "densidad canal" + +msgid "density Primitive Variable" +msgstr "densidad Primitive variable" + +msgid "depth" +msgstr "profundidad" + +msgid "depth Channel" +msgstr "profundidad canal" + +msgid "depth Interpretation" +msgstr "profundidad Interpretation" + +msgid "depth Mode" +msgstr "profundidad modo" + +msgid "descendant Match" +msgstr "descendant Match" + +msgid "destination" +msgstr "destino" + +msgid "device" +msgstr "device" + +msgid "dimensions" +msgstr "dimensions" + +msgid "direction" +msgstr "dirección" + +msgid "directory" +msgstr "directory" + +msgid "dispatcher" +msgstr "dispatcher" + +msgid "display" +msgstr "display" + +msgid "display Transform" +msgstr "display transformar" + +msgid "distant Aperture" +msgstr "distant Aperture" + +msgid "distortion" +msgstr "distortion" + +msgid "divisions" +msgstr "divisions" + +msgid "divisions Mode" +msgstr "divisions modo" + +msgid "dpx" +msgstr "dpx" + +msgid "drawing Mode" +msgstr "modo de dibujo" + +msgid "edit Scope" +msgstr "edit Scope" + +msgid "enabled" +msgstr "habilitado" + +msgid "enabled Names" +msgstr "habilitado Names" + +msgid "enabled Renderers" +msgstr "habilitado Renderers" + +msgid "enabled Values" +msgstr "habilitado Values" + +msgid "encapsulate" +msgstr "encapsulate" + +msgid "end" +msgstr "fin" + +msgid "end Position" +msgstr "fin posición" + +msgid "env Key" +msgstr "env Key" + +msgid "environment" +msgstr "environment" + +msgid "environment Command" +msgstr "environment Command" + +msgid "exact Match" +msgstr "exact Match" + +msgid "execute In Background" +msgstr "execute entrada fondo" + +msgid "exists" +msgstr "exists" + +msgid "expand Data Window" +msgstr "expand Data Window" + +msgid "extend Far Clip" +msgstr "extend Far Clip" + +msgid "exterior Bandwidth" +msgstr "exterior Bandwidth" + +msgid "extra Attributes" +msgstr "extra atributos" + +msgid "extra Metadata" +msgstr "extra metadatos" + +msgid "extra Options" +msgstr "extra opciones" + +msgid "extra Variables" +msgstr "extra variables" + +msgid "f Stop" +msgstr "número f" + +msgid "faces" +msgstr "faces" + +msgid "far Clip" +msgstr "recorte lejano" + +msgid "field Of View" +msgstr "campo de visión" + +msgid "field3d" +msgstr "field3d" + +msgid "file Name" +msgstr "nombre de archivo" + +msgid "file Valid" +msgstr "file Valid" + +msgid "film Fit" +msgstr "film Fit" + +msgid "filter" +msgstr "filtro" + +msgid "filter Deep" +msgstr "filtro profundo" + +msgid "filter Scale" +msgstr "filtro escala" + +msgid "filtered Lights" +msgstr "filtered Lights" + +msgid "find" +msgstr "find" + +msgid "first Match" +msgstr "first Match" + +msgid "fit Mode" +msgstr "fit modo" + +msgid "fits" +msgstr "fits" + +msgid "flatten" +msgstr "flatten" + +msgid "float Max" +msgstr "float máximo" + +msgid "float Min" +msgstr "float mínimo" + +msgid "float Range" +msgstr "float Range" + +msgid "float Steps" +msgstr "float Steps" + +msgid "floats" +msgstr "floats" + +msgid "focal Length" +msgstr "distancia focal" + +msgid "focus Distance" +msgstr "distancia de enfoque" + +msgid "font" +msgstr "font" + +msgid "font Color" +msgstr "font color" + +msgid "font Size" +msgstr "font tamaño" + +msgid "format" +msgstr "format" + +msgid "format Center" +msgstr "format Center" + +msgid "fps" +msgstr "fps" + +msgid "frame" +msgstr "frame" + +msgid "frame Range" +msgstr "rango de fotogramas" + +msgid "frames" +msgstr "frames" + +msgid "frames Mode" +msgstr "frames modo" + +msgid "frames Per Second" +msgstr "frames Per Second" + +msgid "from" +msgstr "from" + +msgid "gain" +msgstr "gain" + +msgid "gamma" +msgstr "gamma" + +msgid "geometry Bound" +msgstr "geometry Bound" + +msgid "geometry Parameters" +msgstr "geometry parámetros" + +msgid "geometry Type" +msgstr "geometry tipo" + +msgid "global" +msgstr "global" + +msgid "globals Mode" +msgstr "globals modo" + +msgid "gnomon" +msgstr "gnomon" + +msgid "grid" +msgstr "grid" + +msgid "grid Color" +msgstr "grid color" + +msgid "grid Pixel Width" +msgstr "grid Pixel ancho" + +msgid "half Bandwidth" +msgstr "half Bandwidth" + +msgid "half Width" +msgstr "medio ancho" + +msgid "holdout" +msgstr "recorte" + +msgid "horizontal" +msgstr "horizontal" + +msgid "horizontal Alignment" +msgstr "horizontal Alignment" + +msgid "horizontal Aperture" +msgstr "horizontal Aperture" + +msgid "hue" +msgstr "tono" + +msgid "id" +msgstr "ID" + +msgid "id List" +msgstr "ID List" + +msgid "id List Variable" +msgstr "ID List variable" + +msgid "iff" +msgstr "iff" + +msgid "ignore Incompatible" +msgstr "ignore Incompatible" + +msgid "ignore Missing" +msgstr "ignorar faltantes" + +msgid "ignore Missing Alpha" +msgstr "ignore Missing alfa" + +msgid "ignore Transparent" +msgstr "ignore Transparent" + +msgid "image Index" +msgstr "imagen índice" + +msgid "image Name" +msgstr "imagen nombre" + +msgid "image Names" +msgstr "imagen Names" + +msgid "images" +msgstr "images" + +msgid "in" +msgstr "entrada" + +msgid "in Angle" +msgstr "entrada ángulo" + +msgid "in Axis" +msgstr "entrada eje" + +msgid "in Euler" +msgstr "entrada Euler" + +msgid "in Matrix" +msgstr "entrada matriz" + +msgid "in Mode" +msgstr "entrada modo" + +msgid "in Order" +msgstr "entrada Order" + +msgid "in Quaternion" +msgstr "entrada Quaternion" + +msgid "in X Axis" +msgstr "entrada X eje" + +msgid "in Y Axis" +msgstr "entrada Y eje" + +msgid "in Z Axis" +msgstr "entrada Z eje" + +msgid "inactive Ids" +msgstr "inactive Ids" + +msgid "include Global Attributes" +msgstr "include Global atributos" + +msgid "include Inherited" +msgstr "incluir heredados" + +msgid "include Root" +msgstr "incluir raíz" + +msgid "index" +msgstr "índice" + +msgid "index Context Variable" +msgstr "índice contexto variable" + +msgid "index Variable" +msgstr "variable de índice" + +msgid "infilling" +msgstr "infilling" + +msgid "inherit" +msgstr "inherit" + +msgid "inherit Attributes" +msgstr "heredar atributos" + +msgid "inherit Set Membership" +msgstr "heredar pertenencia a conjuntos" + +msgid "inherit Transform" +msgstr "heredar transformación" + +msgid "input Color Space" +msgstr "espacio de color de entrada" + +msgid "input Space" +msgstr "espacio de entrada" + +msgid "inspector" +msgstr "inspector" + +msgid "inspectors" +msgstr "inspectors" + +msgid "int Max" +msgstr "int máximo" + +msgid "int Min" +msgstr "int mínimo" + +msgid "int Step" +msgstr "int paso" + +msgid "interior Bandwidth" +msgstr "interior Bandwidth" + +msgid "interleave Channels" +msgstr "interleave canales" + +msgid "interleaved Channels" +msgstr "interleaved canales" + +msgid "interpolate" +msgstr "interpolate" + +msgid "interpolate Boundary" +msgstr "interpolate Boundary" + +msgid "interpolation" +msgstr "interpolación" + +msgid "ints" +msgstr "enteros" + +msgid "invert" +msgstr "invertir" + +msgid "invert Names" +msgstr "invertir nombres" + +msgid "invert Selection" +msgstr "invertir selección" + +msgid "iso Value" +msgstr "valor ISO" + +msgid "item Format" +msgstr "item Format" + +msgid "iterations" +msgstr "iteraciones" + +msgid "job Name" +msgstr "nombre de trabajo" + +msgid "jobs Directory" +msgstr "directorio de trabajos" + +msgid "jpeg" +msgstr "jpeg" + +msgid "jpeg2000" +msgstr "jpeg2000" + +msgid "keep Cameras" +msgstr "keep Cameras" + +msgid "keep Lights" +msgstr "keep Lights" + +msgid "label Color" +msgstr "color de etiqueta" + +msgid "label Format" +msgstr "label Format" + +msgid "label Scale" +msgstr "label escala" + +msgid "label Shadow" +msgstr "label sombra" + +msgid "label Shadow Blur" +msgstr "label sombra Blur" + +msgid "label Shadow Color" +msgstr "label sombra color" + +msgid "label Shadow Offset" +msgstr "label sombra desplazamiento" + +msgid "label Type" +msgstr "label tipo" + +msgid "labels Enabled" +msgstr "labels habilitado" + +msgid "layer" +msgstr "capa" + +msgid "layer Boundaries" +msgstr "capa Boundaries" + +msgid "layer Variable" +msgstr "variable de capa" + +msgid "left Handed" +msgstr "left Handed" + +msgid "lift" +msgstr "elevar" + +msgid "light Group" +msgstr "grupo de luces" + +msgid "line Width" +msgstr "ancho de línea" + +msgid "localise" +msgstr "localise" + +msgid "location" +msgstr "ubicación" + +msgid "look" +msgstr "apariencia" + +msgid "lut GPU" +msgstr "lut GPU" + +msgid "manifest Directory" +msgstr "manifest Directory" + +msgid "manifest Scene" +msgstr "manifest escena" + +msgid "manifest Source" +msgstr "manifest fuente" + +msgid "margin Bottom" +msgstr "margen Bottom" + +msgid "margin Left" +msgstr "margen Left" + +msgid "margin Right" +msgstr "margen Right" + +msgid "margin Top" +msgstr "margen Top" + +msgid "mask" +msgstr "máscara" + +msgid "mask Channel" +msgstr "canal de máscara" + +msgid "mask Variable" +msgstr "máscara variable" + +msgid "master Channel" +msgstr "master canal" + +msgid "match" +msgstr "match" + +msgid "match Data Windows" +msgstr "match Data Windows" + +msgid "matches" +msgstr "matches" + +msgid "matrix" +msgstr "matriz" + +msgid "matte Names" +msgstr "matte Names" + +msgid "max" +msgstr "máximo" + +msgid "max Blur Radius" +msgstr "máximo Blur radio" + +msgid "max Clamp To" +msgstr "máximo limitar To" + +msgid "max Clamp To Enabled" +msgstr "máximo limitar To habilitado" + +msgid "max Enabled" +msgstr "máximo habilitado" + +msgid "max Radius" +msgstr "radio máximo" + +msgid "merge Globals" +msgstr "fusionar Globals" + +msgid "merge Metadata" +msgstr "fusionar metadatos" + +msgid "mesh Type" +msgstr "tipo de malla" + +msgid "messages" +msgstr "mensajes" + +msgid "metadata" +msgstr "metadatos" + +msgid "min" +msgstr "mínimo" + +msgid "min Clamp To" +msgstr "mínimo limitar To" + +msgid "min Clamp To Enabled" +msgstr "mínimo limitar To habilitado" + +msgid "min Enabled" +msgstr "mínimo habilitado" + +msgid "missing Frame Mode" +msgstr "missing Frame modo" + +msgid "missing Source Mode" +msgstr "missing fuente modo" + +msgid "mix" +msgstr "mezcla" + +msgid "mode" +msgstr "modo" + +msgid "model" +msgstr "modelo" + +msgid "multiply" +msgstr "multiplicar" + +msgid "mute" +msgstr "silenciar" + +msgid "name" +msgstr "nombre" + +msgid "name From Segment" +msgstr "nombre From segmento" + +msgid "names" +msgstr "names" + +msgid "near Clip" +msgstr "recorte cercano" + +msgid "next" +msgstr "siguiente" + +msgid "normal" +msgstr "normal" + +msgid "object" +msgstr "objeto" + +msgid "object Mode" +msgstr "modo de objeto" + +msgid "occluded Threshold" +msgstr "occluded umbral" + +msgid "offset" +msgstr "desplazamiento" + +msgid "omit Duplicate Ids" +msgstr "omit Duplicate Ids" + +msgid "opacity" +msgstr "opacidad" + +msgid "open Color IO" +msgstr "open color IO" + +msgid "openexr" +msgstr "openexr" + +msgid "operation" +msgstr "operación" + +msgid "options" +msgstr "opciones" + +msgid "orientation" +msgstr "orientación" + +msgid "orthogonal" +msgstr "ortogonal" + +msgid "out" +msgstr "salida" + +msgid "out Angle" +msgstr "salida ángulo" + +msgid "out Axis" +msgstr "salida eje" + +msgid "out Color" +msgstr "salida color" + +msgid "out Divisions" +msgstr "salida Divisions" + +msgid "out Euler" +msgstr "salida Euler" + +msgid "out Float" +msgstr "salida Float" + +msgid "out Matrix" +msgstr "salida matriz" + +msgid "out Mode" +msgstr "salida modo" + +msgid "out Order" +msgstr "salida Order" + +msgid "out Quaternion" +msgstr "salida Quaternion" + +msgid "out Strings" +msgstr "salida cadenas" + +msgid "out X Axis" +msgstr "salida X eje" + +msgid "out Y Axis" +msgstr "salida Y eje" + +msgid "out Z Axis" +msgstr "salida Z eje" + +msgid "output Channel" +msgstr "canal de salida" + +msgid "output Space" +msgstr "espacio de salida" + +msgid "outputs" +msgstr "salidas" + +msgid "padding" +msgstr "relleno" + +msgid "parameters" +msgstr "parámetros" + +msgid "parent" +msgstr "primario" + +msgid "parent Variable" +msgstr "primario variable" + +msgid "pass Through" +msgstr "paso directo" + +msgid "paths" +msgstr "rutas" + +msgid "pattern" +msgstr "patrón" + +msgid "perspective Mode" +msgstr "perspective modo" + +msgid "pixel" +msgstr "pixel" + +msgid "pixel Data" +msgstr "pixel Data" + +msgid "png" +msgstr "png" + +msgid "point Type" +msgstr "tipo de punto" + +msgid "points" +msgstr "puntos" + +msgid "port" +msgstr "puerto" + +msgid "position" +msgstr "posición" + +msgid "post Tasks" +msgstr "tareas posteriores" + +msgid "power" +msgstr "potencia" + +msgid "pre Tasks" +msgstr "tareas previas" + +msgid "precise Bounds" +msgstr "precise Bounds" + +msgid "prefix" +msgstr "prefijo" + +msgid "previous" +msgstr "anterior" + +msgid "primitive Variable" +msgstr "variable primitiva" + +msgid "primitive Variables" +msgstr "variables primitivas" + +msgid "projection" +msgstr "projection" + +msgid "property" +msgstr "propiedad" + +msgid "property Filters" +msgstr "propiedad Filters" + +msgid "prototype Index" +msgstr "índice de prototipo" + +msgid "prototype Mode" +msgstr "modo de prototipo" + +msgid "prototype Roots" +msgstr "raíces de prototipo" + +msgid "prototype Roots List" +msgstr "prototype Roots List" + +msgid "prototypes" +msgstr "prototipos" + +msgid "prune Occluded" +msgstr "prune Occluded" + +msgid "prune Transparent" +msgstr "prune Transparent" + +msgid "queries" +msgstr "consultas" + +msgid "radius" +msgstr "radio" + +msgid "radius Channel" +msgstr "radio canal" + +msgid "ramp" +msgstr "rampa" + +msgid "random Axis" +msgstr "random eje" + +msgid "random Enabled" +msgstr "random habilitado" + +msgid "random Space" +msgstr "random espacio" + +msgid "random Spread" +msgstr "dispersión aleatoria" + +msgid "random Twist" +msgstr "torsión aleatoria" + +msgid "raw Seed" +msgstr "raw semilla" + +msgid "reference Frame" +msgstr "fotograma de referencia" + +msgid "reference Position" +msgstr "posición de referencia" + +msgid "refresh Count" +msgstr "contador de actualización" + +msgid "relative Location" +msgstr "relative ubicación" + +msgid "relative Transform" +msgstr "transformación relativa" + +msgid "renderer" +msgstr "renderizador" + +msgid "replace" +msgstr "reemplazar" + +msgid "require Variation" +msgstr "require Variation" + +msgid "reset Origin" +msgstr "reset Origin" + +msgid "resolution" +msgstr "resolución" + +msgid "resolved Renderer" +msgstr "resolved renderizador" + +msgid "rla" +msgstr "rla" + +msgid "root" +msgstr "raíz" + +msgid "root Layers" +msgstr "raíz capas" + +msgid "root Name Variable" +msgstr "variable de nombre de raíz" + +msgid "root Names" +msgstr "nombres de raíz" + +msgid "roots" +msgstr "roots" + +msgid "rotate" +msgstr "rotar" + +msgid "samples" +msgstr "muestras" + +msgid "sampling Mode" +msgstr "modo de muestreo" + +msgid "saturation" +msgstr "saturación" + +msgid "scale" +msgstr "escala" + +msgid "scene" +msgstr "escena" + +msgid "scheme" +msgstr "esquema" + +msgid "seed" +msgstr "semilla" + +msgid "seed Enabled" +msgstr "semilla habilitado" + +msgid "seed Permutation" +msgstr "semilla Permutation" + +msgid "seed Variable" +msgstr "variable de semilla" + +msgid "seeds" +msgstr "seeds" + +msgid "segment" +msgstr "segmento" + +msgid "select Mode" +msgstr "modo de selección" + +msgid "selection Mask" +msgstr "selection máscara" + +msgid "selection Mode" +msgstr "modo de selección" + +msgid "selector" +msgstr "selector" + +msgid "sequence" +msgstr "secuencia" + +msgid "service" +msgstr "servicio" + +msgid "set Expression" +msgstr "expresión de conjunto" + +msgid "set Variable" +msgstr "variable de conjunto" + +msgid "sets" +msgstr "conjuntos" + +msgid "sgi" +msgstr "sgi" + +msgid "shader" +msgstr "shader" + +msgid "shader Name" +msgstr "nombre de shader" + +msgid "shader Parameter" +msgstr "parámetro de shader" + +msgid "shader Type" +msgstr "tipo de shader" + +msgid "shading Mode" +msgstr "modo de shading" + +msgid "shadow" +msgstr "sombra" + +msgid "shadow Blur" +msgstr "desenfoque de sombra" + +msgid "shadow Color" +msgstr "color de sombra" + +msgid "shadow Offset" +msgstr "desplazamiento de sombra" + +msgid "shape" +msgstr "forma" + +msgid "shape Mode" +msgstr "forma modo" + +msgid "shell" +msgstr "shell" + +msgid "shuffles" +msgstr "reorganización" + +msgid "sidecar File" +msgstr "sidecar File" + +msgid "size" +msgstr "tamaño" + +msgid "slope" +msgstr "slope" + +msgid "source" +msgstr "fuente" + +msgid "source Location" +msgstr "ubicación de origen" + +msgid "source Locations" +msgstr "ubicaciones de origen" + +msgid "source Root" +msgstr "raíz de origen" + +msgid "space" +msgstr "espacio" + +msgid "spacing" +msgstr "espaciado" + +msgid "speed" +msgstr "velocidad" + +msgid "start" +msgstr "inicio" + +msgid "start Position" +msgstr "inicio posición" + +msgid "state" +msgstr "estado" + +msgid "status" +msgstr "estado" + +msgid "step" +msgstr "paso" + +msgid "string" +msgstr "cadena" + +msgid "strings" +msgstr "cadenas" + +msgid "stripe Width" +msgstr "ancho de franja" + +msgid "substitutions" +msgstr "substitutions" + +msgid "suffix Context Variable" +msgstr "sufijo contexto variable" + +msgid "suffixes" +msgstr "suffixes" + +msgid "tags" +msgstr "etiquetas" + +msgid "tangent" +msgstr "tangente" + +msgid "targa" +msgstr "targa" + +msgid "target" +msgstr "objetivo" + +msgid "target Frame" +msgstr "objetivo Frame" + +msgid "target Mode" +msgstr "modo de objetivo" + +msgid "target Offset" +msgstr "objetivo desplazamiento" + +msgid "target Scene" +msgstr "objetivo escena" + +msgid "target UV" +msgstr "objetivo UV" + +msgid "target Vertex" +msgstr "objetivo Vertex" + +msgid "task" +msgstr "tarea" + +msgid "tasks" +msgstr "tareas" + +msgid "tensor" +msgstr "tensor" + +msgid "tensor Element Type" +msgstr "tensor Element tipo" + +msgid "tessellate Polygons" +msgstr "tessellate Polygons" + +msgid "text" +msgstr "texto" + +msgid "theta Max" +msgstr "theta máximo" + +msgid "thickness" +msgstr "grosor" + +msgid "threads" +msgstr "threads" + +msgid "threshold Angle" +msgstr "umbral ángulo" + +msgid "tiff" +msgstr "tiff" + +msgid "tile Index Variable" +msgstr "tile índice variable" + +msgid "tile Name Variable" +msgstr "tile nombre variable" + +msgid "tile Names" +msgstr "tile Names" + +msgid "tile Variable" +msgstr "variable de bloque" + +msgid "tiles" +msgstr "tiles" + +msgid "time Offset" +msgstr "time desplazamiento" + +msgid "title" +msgstr "título" + +msgid "transform" +msgstr "transformar" + +msgid "transform Mode" +msgstr "modo de transformación" + +msgid "transforms" +msgstr "transformaciones" + +msgid "translate" +msgstr "trasladar" + +msgid "tweaks" +msgstr "ajustes" + +msgid "type" +msgstr "tipo" + +msgid "u Tangent" +msgstr "u tangente" + +msgid "udim" +msgstr "UDIM" + +msgid "unsaved Changes" +msgstr "unsaved Changes" + +msgid "up" +msgstr "arriba" + +msgid "usage" +msgstr "uso" + +msgid "use Attributes" +msgstr "use atributos" + +msgid "use Color Source Alpha" +msgstr "use color fuente alfa" + +msgid "use Deep Visibility" +msgstr "use profundo visibilidad" + +msgid "use Derivatives" +msgstr "usar derivadas" + +msgid "use Target Frame" +msgstr "use objetivo Frame" + +msgid "use Transform" +msgstr "usar transformación" + +msgid "use Velocity" +msgstr "usar velocidad" + +msgid "user" +msgstr "usuario" + +msgid "uv" +msgstr "UV" + +msgid "uv Distortion" +msgstr "UV Distortion" + +msgid "uv Set" +msgstr "UV Set" + +msgid "v Tangent" +msgstr "v tangente" + +msgid "value" +msgstr "valor" + +msgid "value Max" +msgstr "valor máximo" + +msgid "value Min" +msgstr "valor mínimo" + +msgid "variable" +msgstr "variable" + +msgid "variables" +msgstr "variables" + +msgid "variations" +msgstr "variations" + +msgid "vector" +msgstr "vector" + +msgid "vector Color" +msgstr "vector color" + +msgid "vector Mode" +msgstr "vector modo" + +msgid "vector Scale" +msgstr "vector escala" + +msgid "vector Units" +msgstr "vector Units" + +msgid "velocity" +msgstr "velocidad" + +msgid "velocity Scale" +msgstr "escala de velocidad" + +msgid "vertex Ids" +msgstr "vertex Ids" + +msgid "vertical" +msgstr "vertical" + +msgid "vertical Alignment" +msgstr "vertical Alignment" + +msgid "view" +msgstr "vista" + +msgid "views" +msgstr "vistas" + +msgid "visualiser Attributes" +msgstr "visualiser atributos" + +msgid "voxel Size" +msgstr "tamaño de vóxel" + +msgid "webp" +msgstr "webp" + +msgid "weighting" +msgstr "ponderación" + +msgid "white Clamp" +msgstr "white limitar" + +msgid "white Point" +msgstr "punto blanco" + +msgid "width" +msgstr "ancho" + +msgid "width Channel" +msgstr "canal de ancho" + +msgid "width Scale" +msgstr "escala de ancho" + +msgid "working Space" +msgstr "espacio de trabajo" + +msgid "x Enabled" +msgstr "x habilitado" + +msgid "y Enabled" +msgstr "y habilitado" + +msgid "z Back Channel" +msgstr "z Back canal" + +msgid "z Back Mode" +msgstr "z Back modo" + +msgid "z Channel" +msgstr "canal Z" + +msgid "z Enabled" +msgstr "z habilitado" + +msgid "z Max" +msgstr "z máximo" + +msgid "z Min" +msgstr "z mínimo" + +msgid "z Mode" +msgstr "z modo" + +msgid "Colour" +msgstr "Color" + +msgid "Controls which input is passed through to the output." +msgstr "Controla qué entrada se pasa a la salida." + +msgid "Reads scenes from cache files on disk." +msgstr "Lee escenas desde archivos de caché en disco." + +msgid "The input image" +msgstr "Imagen de entrada" + +msgid "The input image." +msgstr "Imagen de entrada." + +msgid "The input scene" +msgstr "Escena de entrada" + +msgid "The output image" +msgstr "Imagen de salida" + +msgid "The output scene" +msgstr "Escena de salida" + +msgid "Whether or not the node is enabled. When disabled, the node passes through the input scene unchanged." +msgstr "Indica si el nodo está habilitado o no. Cuando está deshabilitado, el nodo pasa la escena de entrada sin cambios." + +msgid "colour" +msgstr "color" + +msgid "height" +msgstr "altura" + +msgid "alpha" +msgstr "alfa" + +msgid "Used to schedule the execution of a network\nof TaskNodes." +msgstr "Se usa para programar la ejecución de una red de nodos de tarea." + +msgid "Switches between upstream tasks, so that only\none is chosen for execution." +msgstr "Cambia entre tareas anteriores, de modo que solo una se elige para ejecución." + +msgid "OSL Shader" +msgstr "Shader OSL" + +msgid "OSL Light" +msgstr "Luz OSL" + +msgid "Arnold Mesh Light" +msgstr "Luz de malla Arnold" + +msgid "Arnold Color Manager" +msgstr "Gestor de color Arnold" + +msgid "Cycles Mesh Light" +msgstr "Luz de malla Cycles" + +msgid "Loads OSL shaders for use in supported renderers. Use the ShaderAssignment node to assign shaders to objects in the scene." +msgstr "Carga shaders OSL para su uso en renderers compatibles. Usar el nodo ShaderAssignment para asignar shaders a los objetos en la escena." + +msgid "Loads OSL shaders for use as lights in supported renderers." +msgstr "Carga shaders OSL para su uso como luces en renderers compatibles." + +msgid "Loads an OSL shader and uses it to define an image. This is similar to an ImagePrimitive in other renderers." +msgstr "Carga un shader OSL y lo usa para definir una imagen. Es similar a un ImagePrimitive en otros renderers." + +msgid "Loads an OSL shader and uses it to modify objects in the scene." +msgstr "Carga un shader OSL y lo usa para modificar objetos en la escena." + +msgid "Writes scenes to cache files on disk." +msgstr "Escribe escenas en archivos de caché en disco." + +msgid "Assigns a shader to objects in the scene." +msgstr "Asigna un shader a objetos en la escena." + +msgid "Applies shader parameter tweaks to shaders in the scene." +msgstr "Aplica ajustes de parámetros de shader a shaders en la escena." + +msgid "Filters scene locations using wildcards and set expressions." +msgstr "Filtra ubicaciones de la escena usando comodines y expresiones de conjuntos." + +msgid "Merges two or more input scenes together." +msgstr "Fusiona dos o más escenas de entrada." + +msgid "Groups several input scenes together, placing them below a new parent location." +msgstr "Agrupa varias escenas de entrada, colocándolas bajo una nueva ubicación primaria." + +msgid "A utility node that isolates a specific part of the scene, discarding the rest." +msgstr "Un nodo de utilidad que aísla una parte específica de la escena, descartando el resto." + +msgid "Sets a transform on the filtered locations." +msgstr "Establece una transformación en las ubicaciones filtradas." + +msgid "Creates custom attributes on the filtered locations." +msgstr "Crea atributos personalizados en las ubicaciones filtradas." + +msgid "Creates custom options for the scene globals." +msgstr "Crea opciones personalizadas para las variables globales de la escena." + +msgid "Creates custom render options." +msgstr "Crea opciones de render personalizadas." + +msgid "Reads image files from disk using OpenImageIO. All file types supported by OpenImageIO are supported by the ImageReader." +msgstr "Lee archivos de imagen desde disco usando OpenImageIO. Todos los tipos de archivo soportados por OpenImageIO son soportados por el ImageReader." + +msgid "Writes image files to disk using OpenImageIO. All file types supported by OpenImageIO are supported by the ImageWriter." +msgstr "Escribe archivos de imagen en disco usando OpenImageIO. Todos los tipos de archivo soportados por OpenImageIO son soportados por el ImageWriter." + +msgid "Provides a means of switching between different input connections." +msgstr "Proporciona un medio para alternar entre diferentes conexiones de entrada." + +msgid "Selects an input based on the value of a context variable." +msgstr "Selecciona una entrada basándose en el valor de una variable de contexto." + +msgid "A loop that repeatedly applies its child nodes." +msgstr "Un bucle que aplica repetidamente sus nodos secundarios." + +msgid "Generates context variations for downstream nodes, so that tasks can be dispatched in parallel." +msgstr "Genera variaciones de contexto para nodos posteriores, permitiendo despachar tareas en paralelo." + +msgid "A container holding a network of child nodes." +msgstr "Un contenedor que alberga una red de nodos secundarios." + +msgid "A dot that can be used to tidy connection spaghetti. It has no effect on the scene." +msgstr "Un punto que se puede usar para ordenar conexiones. No tiene efecto en la escena." + +msgid "Provides a convenient means of setting plug values using the OSL shading language." +msgstr "Proporciona un medio conveniente para establecer valores de conector usando el lenguaje de sombreado OSL." + +msgid "Creates a wireframe representation of a mesh." +msgstr "Crea una representación de malla de alambre de una malla." + +msgid "Documentation URL" +msgstr "URL de documentación" + +msgid "Icon" +msgstr "Icono" + +msgid "Plug Creators" +msgstr "Creadores de conectores" + +msgid "Widget" +msgstr "Componente" + +msgid "Gadget" +msgstr "Grafeto" + +msgid "Connection Color" +msgstr "Color de conexión" + +msgid "Widget Settings" +msgstr "Configuración del componente" + +msgid "Presets" +msgstr "Preajustes" + +msgid "Convert Float to Int" +msgstr "Convertir flotante a entero" + +msgid "Convert Float to Color" +msgstr "Convertir flotante a color" + +msgid "Convert Float to Vector" +msgstr "Convertir flotante a vector" + +msgid "Convert Float to Normal" +msgstr "Convertir flotante a normal" + +msgid "Convert Float to Point" +msgstr "Convertir flotante a punto" + +msgid "Convert Float to String" +msgstr "Convertir flotante a cadena" + +msgid "Convert Float to Closure" +msgstr "Convertir flotante a cierre" + +msgid "Convert Color to Float" +msgstr "Convertir color a flotante" + +msgid "Convert Color to Color" +msgstr "Convertir color a color" + +msgid "Convert Color to Vector" +msgstr "Convertir color a vector" + +msgid "Convert Color to Normal" +msgstr "Convertir color a normal" + +msgid "Convert Color to Point" +msgstr "Convertir color a punto" + +msgid "Convert Color to String" +msgstr "Convertir color a cadena" + +msgid "Convert Color to Closure" +msgstr "Convertir color a cierre" + +msgid "Convert Closure to Closure" +msgstr "Convertir cierre a cierre" + +msgid "Convert Closure to Color" +msgstr "Convertir cierre a color" + +msgid "Convert Closure to Float" +msgstr "Convertir cierre a flotante" + +msgid "Convert Closure to Int" +msgstr "Convertir cierre a entero" + +msgid "Convert Closure to Normal" +msgstr "Convertir cierre a normal" + +msgid "Convert Closure to Point" +msgstr "Convertir cierre a punto" + +msgid "Convert Closure to String" +msgstr "Convertir cierre a cadena" + +msgid "Convert Closure to Vector" +msgstr "Convertir cierre a vector" + +msgid "Convert Normal to Int" +msgstr "Convertir normal a entero" + +msgid "Convert Normal to Point" +msgstr "Convertir normal a punto" + +msgid "Convert Normal to String" +msgstr "Convertir normal a cadena" + +msgid "Point Density Texture" +msgstr "Textura de densidad de puntos" + +msgid "Osl Coordinate System Matrix" +msgstr "Matriz de sistema de coordenadas OSL" + +msgid "Converter" +msgstr "Convertidor" + +msgid "Misc" +msgstr "Varios" + +msgid "AOV Output" +msgstr "Salida de VAS" + +msgid "Absorption Volume" +msgstr "Volumen de absorción" + +msgid "Add Closure" +msgstr "Añadir cierre" + +msgid "Background Light" +msgstr "Luz de fondo" + +msgid "Background Shader" +msgstr "Shader de fondo" + +msgid "Bevel" +msgstr "Bisel" + +msgid "Blackbody" +msgstr "Cuerpo negro" + +msgid "Brick Texture" +msgstr "Textura de ladrillo" + +msgid "Brightness Contrast" +msgstr "Brillo y contraste" + +msgid "Camera Info" +msgstr "Información de cámara" + +msgid "Checker Texture" +msgstr "Textura de cuadros" + +msgid "Combine Color" +msgstr "Combinar color" + +msgid "Combine HSV" +msgstr "Combinar TSV" + +msgid "Combine RGB" +msgstr "Combinar RVA" + +msgid "Combine XYZ" +msgstr "Combinar XYZ" + +msgid "Convert Color to Int" +msgstr "Convertir color a entero" + +msgid "Convert Float to Float" +msgstr "Convertir flotante a flotante" + +msgid "Convert Int to Closure" +msgstr "Convertir entero a cierre" + +msgid "Convert Int to Color" +msgstr "Convertir entero a color" + +msgid "Convert Int to Float" +msgstr "Convertir entero a flotante" + +msgid "Convert Int to Int" +msgstr "Convertir entero a entero" + +msgid "Convert Int to Normal" +msgstr "Convertir entero a normal" + +msgid "Convert Int to Point" +msgstr "Convertir entero a punto" + +msgid "Convert Int to String" +msgstr "Convertir entero a cadena" + +msgid "Convert Int to Vector" +msgstr "Convertir entero a vector" + +msgid "Convert Normal to Closure" +msgstr "Convertir normal a cierre" + +msgid "Convert Normal to Color" +msgstr "Convertir normal a color" + +msgid "Convert Normal to Float" +msgstr "Convertir normal a flotante" + +msgid "Convert Normal to Normal" +msgstr "Convertir normal a normal" + +msgid "Convert Normal to Vector" +msgstr "Convertir normal a vector" + +msgid "Convert Point to Closure" +msgstr "Convertir punto a cierre" + +msgid "Convert Point to Color" +msgstr "Convertir punto a color" + +msgid "Convert Point to Float" +msgstr "Convertir punto a flotante" + +msgid "Convert Point to Int" +msgstr "Convertir punto a entero" + +msgid "Convert Point to Normal" +msgstr "Convertir punto a normal" + +msgid "Convert Point to Point" +msgstr "Convertir punto a punto" + +msgid "Convert Point to String" +msgstr "Convertir punto a cadena" + +msgid "Convert Point to Vector" +msgstr "Convertir punto a vector" + +msgid "Convert String to Closure" +msgstr "Convertir cadena a cierre" + +msgid "Convert String to Color" +msgstr "Convertir cadena a color" + +msgid "Convert String to Float" +msgstr "Convertir cadena a flotante" + +msgid "Convert String to Int" +msgstr "Convertir cadena a entero" + +msgid "Convert String to Normal" +msgstr "Convertir cadena a normal" + +msgid "Convert String to Point" +msgstr "Convertir cadena a punto" + +msgid "Convert String to String" +msgstr "Convertir cadena a cadena" + +msgid "Convert String to Vector" +msgstr "Convertir cadena a vector" + +msgid "Convert Vector to Closure" +msgstr "Convertir vector a cierre" + +msgid "Convert Vector to Color" +msgstr "Convertir vector a color" + +msgid "Convert Vector to Float" +msgstr "Convertir vector a flotante" + +msgid "Convert Vector to Int" +msgstr "Convertir vector a entero" + +msgid "Convert Vector to Normal" +msgstr "Convertir vector a normal" + +msgid "Convert Vector to Point" +msgstr "Convertir vector a punto" + +msgid "Convert Vector to String" +msgstr "Convertir vector a cadena" + +msgid "Convert Vector to Vector" +msgstr "Convertir vector a vector" + +msgid "Diffuse BSDF" +msgstr "BSDF difuso" + +msgid "Glass BSDF" +msgstr "BSDF de vidrio" + +msgid "Glossy BSDF" +msgstr "BSDF brillante" + +msgid "Hair BSDF" +msgstr "BSDF de cabello" + +msgid "Metallic BSDF" +msgstr "BSDF metálico" + +msgid "Principled BSDF" +msgstr "BSDF principal" + +msgid "Principled Hair BSDF" +msgstr "BSDF principal de cabello" + +msgid "Ray Portal BSDF" +msgstr "BSDF de portal de rayo" + +msgid "Refraction BSDF" +msgstr "BSDF de refracción" + +msgid "Sheen BSDF" +msgstr "BSDF de brillo" + +msgid "Toon BSDF" +msgstr "BSDF toon" + +msgid "Translucent BSDF" +msgstr "BSDF translúcido" + +msgid "Transparent BSDF" +msgstr "BSDF transparente" + +msgid "Environment Texture" +msgstr "Textura de entorno" + +msgid "Gabor Texture" +msgstr "Textura Gabor" + +msgid "Gradient Texture" +msgstr "Textura de gradiente" + +msgid "Image Texture" +msgstr "Textura de imagen" + +msgid "Magic Texture" +msgstr "Textura mágica" + +msgid "Noise Texture" +msgstr "Textura de ruido" + +msgid "Sky Texture" +msgstr "Textura de cielo" + +msgid "Voronoi Texture" +msgstr "Textura Voronoi" + +msgid "Wave Texture" +msgstr "Textura de onda" + +msgid "White Noise Texture" +msgstr "Textura de ruido blanco" + +msgid "Principled Volume" +msgstr "Volumen principal" + +msgid "Scatter Volume" +msgstr "Volumen de dispersión" + +msgid "Subsurface Scattering" +msgstr "Dispersión subsuperficial" + +msgid "Float Curve" +msgstr "Curva de flotante" + +msgid "RGB Curves" +msgstr "Curvas RVA" + +msgid "RGB Ramp" +msgstr "Rampa RVA" + +msgid "RGB to BW" +msgstr "RVA a BN" + +msgid "Vector Curves" +msgstr "Curvas de vector" + +msgid "HSV" +msgstr "TSV" + +msgid "Separate Color" +msgstr "Separar color" + +msgid "Separate HSV" +msgstr "Separar TSV" + +msgid "Separate RGB" +msgstr "Separar RVA" + +msgid "Separate XYZ" +msgstr "Separar XYZ" + +msgid "Hair Info" +msgstr "Información de cabello" + +msgid "Layer Weight" +msgstr "Peso de capa" + +msgid "Light Path" +msgstr "Ruta de luz" + +msgid "Object Info" +msgstr "Información de objeto" + +msgid "Particle Info" +msgstr "Información de partícula" + +msgid "Point Info" +msgstr "Información de punto" + +msgid "Texture Coordinate" +msgstr "Coordenada de textura" + +msgid "UV Map" +msgstr "Mapa UV" + +msgid "Vertex Color" +msgstr "Color de vértice" + +msgid "Volume Info" +msgstr "Información de volumen" + +msgid "Light Falloff" +msgstr "Atenuación de luz" + +msgid "Map Range" +msgstr "Rango de mapa" + +msgid "Mapping" +msgstr "Mapeo" + +msgid "Math" +msgstr "Matemáticas" + +msgid "Mix Closure" +msgstr "Mezclar cierre" + +msgid "Mix Closure Weight" +msgstr "Peso de mezcla de cierre" + +msgid "Mix Vector Nonuniform" +msgstr "Mezclar vector no uniforme" + +msgid "Normal Map" +msgstr "Mapa de normales" + +msgid "Set Normal" +msgstr "Establecer normal" + +msgid "Vector Displacement" +msgstr "Desplazamiento vectorial" + +msgid "Vector Map Range" +msgstr "Rango de mapa vectorial" + +msgid "Vector Math" +msgstr "Matemáticas vectoriales" + +msgid "Vector Rotate" +msgstr "Rotación vectorial" + +msgid "Vector Transform" +msgstr "Transformación vectorial" + +msgid "IES Light" +msgstr "Luz IES" + +msgid "Mesh Light" +msgstr "Luz de malla" + +msgid "Point Light" +msgstr "Luz puntual" + +msgid "Quad Light" +msgstr "Luz cuádruple" + +msgid "Generates keyframed animation to be applied to plugs\non other nodes." +msgstr "Genera animacion por fotogramas clave para aplicar a conectores\nen otros nodos." + +msgid "A utility node which allows the positioning of other nodes on a\ncoloured backdrop with optional text. Selecting a backdrop in the\nui selects all the nodes positioned on it, and moving it moves\nthem with it." +msgstr "Un nodo utilitario que permite posicionar otros nodos sobre un\nfondo de color con texto opcional. Seleccionar un fondo en la\ninterfaz selecciona todos los nodos posicionados sobre el, y\nmoverlo los mueve con el." + +msgid "A container for \"subgraphs\" - node networks which exist inside the\nBox and can be exposed by promoting selected internal plugs onto the\noutside of the Box." +msgstr "Un contenedor para \"subgrafos\" - redes de nodos que existen dentro de la\ncaja y pueden exponerse promoviendo conectores internos seleccionados hacia\nel exterior de la caja." + +msgid "Boxes can be used as an organisational tool for simplifying large\ngraphs by collapsing them into sections which perform distinct tasks.\nThey are also used for authoring files to be used with the Reference\nnode." +msgstr "Las cajas pueden usarse como herramienta organizativa para simplificar\ngrafos grandes colapsandolos en secciones que realizan tareas distintas.\nTambien se usan para crear archivos para usar con el nodo Reference." + +msgid "Convenience node for representing input plugs\nvisually in the internal node graph of a Box." +msgstr "Nodo de conveniencia para representar conectores de entrada\nvisualmente en el grafo de nodos interno de una caja." + +msgid "Convenience node for representing output plugs\nvisually in the internal node graph of a Box." +msgstr "Nodo de conveniencia para representar conectores de salida\nvisualmente en el grafo de nodos interno de una caja." + +msgid "Collects arbitrary input values across a range of contexts, outputting\narrays containing the values collected across that range." +msgstr "Recopila valores de entrada arbitrarios a traves de un rango de contextos,\nproduciendo matrices con los valores recopilados en ese rango." + +msgid "Base class for nodes which can compute the values\nof output plugs based on the values of input plugs." +msgstr "Clase base para nodos que pueden calcular los valores\nde conectores de salida basandose en los valores de conectores de entrada." + +msgid "Queries variables from the current context, creating outputs for each variable." +msgstr "Consulta variables del contexto actual, creando salidas para cada variable." + +msgid "Makes modifications to context variables. Tweaks are applied to context variables coming\nfrom downstream nodes, resulting in different values given to upstream nodes." +msgstr "Realiza modificaciones a variables de contexto. Los ajustes se aplican a las variables de contexto\nprovenientes de nodos posteriores, resultando en valores diferentes dados a los nodos anteriores." + +msgid "Adds variables which can be referenced by upstream expressions\nand string substitutions." +msgstr "Agrega variables que pueden ser referenciadas por expresiones anteriores\ny sustituciones de cadena." + +msgid "Removes variables from the Context so that they won't be visible to upstream nodes." +msgstr "Elimina variables del contexto para que no sean visibles para los nodos anteriores." + +msgid "Base class for nodes where input plugs have an\neffect on output plugs." +msgstr "Clase base para nodos donde los conectores de entrada\ntienen efecto en los conectores de salida." + +msgid "A utility node which can be used for organising large graphs." +msgstr "Un nodo utilitario que puede usarse para organizar grafos grandes." + +msgid "A container that interactive tools may make nodes in\nas necessary." +msgstr "Un contenedor en el que las herramientas interactivas pueden\ncrear nodos segun sea necesario." + +msgid "Utility node for computing values via\nscripted expressions." +msgstr "Nodo utilitario para calcular valores mediante\nexpresiones programadas." + +msgid "Applies a node network to an input iteratively." +msgstr "Aplica una red de nodos a una entrada de forma iterativa." + +msgid "> Caution : This should _not_ be your first choice of tool.\n> For many use cases the Instancer, CollectScenes and CollectImages\n> nodes are more suitable and offer _significantly_ better performance." +msgstr "> Precaucion: Esta _no_ deberia ser tu primera opcion de herramienta.\n> Para muchos casos de uso, los nodos Instancer, CollectScenes y CollectImages\n> son mas adecuados y ofrecen un rendimiento _significativamente_ mejor." + +msgid "Switches between multiple input connections, passing through the\nchosen input to the output. Each input has a \"name\" as well\nas a value, and switching is performed by comparing the names against\nthe value of `selector` as follows :" +msgstr "Conmuta entre multiples conexiones de entrada, pasando la entrada\nelegida a la salida. Cada entrada tiene un \"nombre\" asi como\nun valor, y la conmutacion se realiza comparando los nombres contra\nel valor de `selector` de la siguiente manera:" + +msgid "- Matching starts with the second input and considers all subsequent\n inputs one by one until a match is found. The first matching input\n is the one that is chosen.\n- Matching is performed using Gaffer's standard wildcard matching.\n Each \"name\" may contain several individual patterns each separated\n by spaces.\n- The first input is used as a default, and is chosen only if no other\n input matches." +msgstr "- La coincidencia comienza con la segunda entrada y considera todas las\n entradas siguientes una por una hasta encontrar una coincidencia. La primera\n entrada que coincida es la elegida.\n- La coincidencia se realiza usando el emparejamiento estandar con comodines de Gaffer.\n Cada \"nombre\" puede contener varios patrones individuales separados\n por espacios.\n- La primera entrada se usa como predeterminada, y se elige solo si ninguna otra\n entrada coincide." + +msgid "A container for plugs." +msgstr "Un contenedor para conectores." + +msgid "Tests an input string against a pattern, outputting true if the string\nmatches." +msgstr "Prueba una cadena de entrada contra un patron, produciendo verdadero si la cadena\ncoincide." + +msgid "A container for application preferences." +msgstr "Un contenedor para las preferencias de la aplicacion." + +msgid "Generates repeatable random values from a seed. This can be\nvery useful for the procedural generation of variation.\nNumeric or colour values may be generated." +msgstr "Genera valores aleatorios repetibles a partir de una semilla. Esto puede ser\nmuy util para la generacion procedural de variacion.\nSe pueden generar valores numericos o de color." + +msgid "The random values are generated from a seed and a Context\nVariable - to get useful variation either the seed or the\nvalue of the Context Variable must be varied too." +msgstr "Los valores aleatorios se generan a partir de una semilla y una\nvariable de contexto - para obtener variacion util, la semilla o el\nvalor de la variable de contexto tambien debe variar." + +msgid "Chooses random values from a list of choices, with optional weights\nto specify the relative probability of each choice." +msgstr "Elige valores aleatorios de una lista de opciones, con pesos opcionales\npara especificar la probabilidad relativa de cada opcion." + +msgid "The randomness is generated from a seed and a context\nvariable; to get useful variation either the seed or the\nvalue of the context variable must be varied too." +msgstr "La aleatoriedad se genera a partir de una semilla y una variable\nde contexto; para obtener variacion util, la semilla o el\nvalor de la variable de contexto tambien debe variar." + +msgid "References a node network stored in another file. This can be used\nto share resources among scripts, build powerful non-linear workflows,\nand as the basis for custom asset management." +msgstr "Referencia una red de nodos almacenada en otro archivo. Puede usarse\npara compartir recursos entre scripts, construir flujogramas no lineales\npoderosos y como base para la gestion personalizada de activos." + +msgid "To generate a file to be referenced, build a network inside a Box\nnode and then export it for referencing." +msgstr "Para generar un archivo que se pueda referenciar, construye una red dentro de un nodo\ncaja y luego exportalo para referencia." + +msgid "Defines a \"script\" - a Gaffer node network which can be\nsaved to disk as a \".gfr\" file and reloaded." +msgstr "Define un \"script\" - una red de nodos de Gaffer que puede\nguardarse en disco como archivo \".gfr\" y recargarse." + +msgid "Provides a spreadsheet designed for easy management of sets of\nassociated plug values. Each column of the spreadsheet corresponds\nto an output value that can be connected to drive a plug on another\nnode. Each row of the spreadsheet provides candidate values for each\noutput, along with a row name and enabled status. Row names are matched\nagainst a selector to determine which row is passed through to the output.\nRow matching is performed as follows :" +msgstr "Proporciona una hoja de calculo disenada para la gestion facil de conjuntos de\nvalores de conectores asociados. Cada columna corresponde a un valor de salida\nque puede conectarse para controlar un conector en otro nodo. Cada fila proporciona\nvalores candidatos para cada salida, junto con un nombre de fila y estado habilitado.\nLos nombres de fila se comparan contra un selector para determinar que fila se pasa\na la salida. La coincidencia de filas se realiza de la siguiente manera:" + +msgid "- Matching starts with the second row and considers all subsequent\n rows one by one until a match is found. The first matching row\n is the one that is chosen.\n- Matching is performed using Gaffer's standard wildcard matching.\n Each \"name\" may contain several individual patterns each separated\n by spaces.\n- The first row is used as a default, and is chosen only if no other\n row matches." +msgstr "- La coincidencia comienza con la segunda fila y considera todas las\n filas siguientes una por una hasta encontrar una coincidencia. La primera\n fila que coincida es la elegida.\n- La coincidencia se realiza usando el emparejamiento estandar con comodines de Gaffer.\n Cada \"nombre\" puede contener varios patrones individuales separados\n por espacios.\n- La primera fila se usa como predeterminada, y se elige solo si ninguna otra\n fila coincide." + +msgid "> Note : The matching rules are identical to the ones used by the\n> NameSwitch node." +msgstr "> Nota: Las reglas de coincidencia son identicas a las usadas por el\n> nodo NameSwitch." + +msgid "## Keyboard Shortcuts" +msgstr "## Atajos de teclado" + +msgid "- **Return**/**Double Click** Toggle/Edit selected cells.\n- **D** Toggle Enabled state of selected cells.\n- **Ctrl + C**/**V** Copy/Paste selected cells or rows.\n- **Up**, **Down**, **Left**, **Right** Move cell selection.\n- **Shift + Up**, **Down**, **Left**, **Right** Extend cell selection.\n- **Ctrl + Up**, **Down**, **Left**, **Right** Move keyboard focus.\n- **Space** Toggle selection state of cell with keyboard focus." +msgstr "- **Intro**/**Doble clic** Alternar/Editar celdas seleccionadas.\n- **D** Alternar estado habilitado de celdas seleccionadas.\n- **Ctrl + C**/**V** Copiar/Pegar celdas o filas seleccionadas.\n- **Arriba**, **Abajo**, **Izquierda**, **Derecha** Mover seleccion de celda.\n- **Shift + Arriba**, **Abajo**, **Izquierda**, **Derecha** Extender seleccion de celda.\n- **Ctrl + Arriba**, **Abajo**, **Izquierda**, **Derecha** Mover foco del teclado.\n- **Espacio** Alternar estado de seleccion de celda con foco del teclado." + +msgid "Holds a nested node graph of its own." +msgstr "Contiene un grafo de nodos anidado propio." + +msgid "Chooses between multiple input connections, passing through the\nchosen input to the output." +msgstr "Elige entre multiples conexiones de entrada, pasando la entrada\nelegida a la salida." + +msgid "Changes the time at which upstream nodes are evaluated using\nthe following formula :" +msgstr "Cambia el tiempo en el que se evaluan los nodos anteriores usando\nla siguiente formula:" + +msgid "`upstreamFrame = frame * speed + offset`" +msgstr "`fotogramaAnterior = fotograma * velocidad + desplazamiento`" + +msgid "Assigns global shaders such as background and atmosphere shaders.\nThis node is an abstract base class, so it can not be used directly -\ninstead use the nodes derived from it." +msgstr "Asigna shaders globales como shaders de fondo y atmosfera.\nEste nodo es una clase base abstracta, por lo que no puede usarse directamente -\nen su lugar usar los nodos derivados de el." + +msgid "Loads an Cycles light shader and uses it to output a scene with a single light." +msgstr "Carga un shader de luz de Cycles y lo usa para producir una escena con una sola luz." + +msgid "Turns mesh primitives into Cycles mesh lights by assigning\nan emission shader, turning off all visibility except for camera rays,\nand adding the meshes to the default lights set." +msgstr "Convierte primitivas de malla en luces de malla de Cycles asignando\nun shader de emision, desactivando toda visibilidad excepto para rayos de camara,\ny agregando las mallas al conjunto de luces predeterminado." + +msgid "Sets global scene options applicable to the Cycles\nrenderer. Use the StandardOptions node to set\nglobal options applicable to all renderers." +msgstr "Establece opciones globales de la escena aplicables al\nrenderizador Cycles. Usar el nodo StandardOptions para establecer\nopciones globales aplicables a todos los renderizadores." + +msgid "Loads shaders for use in Cycles renders. Use the ShaderAssignment node to assign shaders to objects in the scene." +msgstr "Carga shaders para su uso en renders de Cycles. Usar el nodo ShaderAssignment para asignar shaders a objetos en la escena." + +msgid "Generates scenes suitable for rendering shader balls with Cycles." +msgstr "Genera escenas adecuadas para renderizar bolas de shader con Cycles." + +msgid "Masks upstream tasks so that they will only be executed for\na subset of the Dispatcher's frame range." +msgstr "Enmascara tareas anteriores para que solo se ejecuten para\nun subconjunto del rango de fotogramas del despachador." + +msgid "Schedules execution of task graphs on the local machine. Tasks\nmay be dispatched in the background to keep the UI responsive." +msgstr "Programa la ejecucion de grafos de tareas en la maquina local. Las tareas\npueden despacharse en segundo plano para mantener la interfaz responsiva." + +msgid "Base class for nodes which modify the Context in which\nupstream tasks are dispatched." +msgstr "Clase base para nodos que modifican el contexto en el que\nse despachan las tareas anteriores." + +msgid "Adds variables which can be referenced by upstream expressions." +msgstr "Agrega variables que pueden ser referenciadas por expresiones anteriores." + +msgid "Base class for nodes which have external side effects - generating\nfiles on disk for instance. Can be connected with other task\nnodes to define an order of execution based on dependencies between\nnodes. A Dispatcher can then be used to actually perform the execution\nof the tasks generated by such a network." +msgstr "Clase base para nodos que tienen efectos secundarios externos - generando\narchivos en disco por ejemplo. Puede conectarse con otros nodos\nde tarea para definir un orden de ejecucion basado en dependencias entre\nnodos. Un despachador puede usarse entonces para realizar la ejecucion\nde las tareas generadas por dicha red." + +msgid "Causes upstream nodes to be dispatched multiple times in a range\nof Contexts, each time with a different value for a specified variable.\nThis variable should be referenced in upstream expressions to apply\nvariation to the tasks being performed. For instance, it could be\nused to drive a shader parameter to perform a series of \"wedges\" to\ndemonstrate the results of a range of possible parameter values." +msgstr "Causa que los nodos anteriores se despachen multiples veces en un rango\nde contextos, cada vez con un valor diferente para una variable especificada.\nEsta variable debe referenciarse en expresiones anteriores para aplicar\nvariacion a las tareas que se realizan. Por ejemplo, podria usarse\npara controlar un parametro de shader y realizar una serie de \"cunas\" para\ndemostrar los resultados de un rango de posibles valores de parametros." + +msgid "Converts a multi-view image with \"left\" and \"right\" views into a single view image with the two views combined in different colors, suitable for viewing through red-blue anaglyph glasses." +msgstr "Convierte una imagen multivista con vistas \"izquierda\" y \"derecha\" en una imagen de vista unica con las dos vistas combinadas en diferentes colores, adecuada para ver con gafas anaglif rojo-azul." + +msgid "Fills in areas of low alpha in the image by blurring in contributions from nearby pixels." +msgstr "Rellena las areas de alfa bajo en la imagen difuminando contribuciones de pixeles cercanos." + +msgid "Applies color transformations provided by\nOpenColorIO via an OCIO CDLTransform." +msgstr "Aplica transformaciones de color proporcionadas por\nOpenColorIO mediante un OCIO CDLTransform." + +msgid "Outputs an image of a checkerboard pattern." +msgstr "Produce una imagen con un patron de tablero de ajedrez." + +msgid "Clamps channel values so that they fit within a specified\nrange. Clamping is performed for each channel individually,\nand out-of-range colours may be highlighted by setting them\nto a value different to the clamp threshold itself." +msgstr "Restringe los valores de canal para que se ajusten dentro de un rango\nespecificado. La restriccion se realiza para cada canal individualmente,\ny los colores fuera de rango pueden resaltarse estableciendolos\na un valor diferente al umbral de restriccion." + +msgid "Forms a series of image layers by repeatedly evaluating the input with different Contexts.\nUseful for networks that need to dynamically build an unknown number of image layers." +msgstr "Forma una serie de capas de imagen evaluando repetidamente la entrada con diferentes contextos.\nUtil para redes que necesitan construir dinamicamente un numero desconocido de capas de imagen." + +msgid "Applies colour transformations provided by\nOpenColorIO. Configs are loaded from the\nconfiguration specified by the OCIO environment\nvariable." +msgstr "Aplica transformaciones de color proporcionadas por\nOpenColorIO. Las configuraciones se cargan desde la\nconfiguracion especificada por la variable de entorno\nOCIO." + +msgid "Outputs an image of a constant flat colour." +msgstr "Produce una imagen de un color plano constante." + +msgid "Assembles multiple input images into a tiled grid, with customisable layout, labels and borders." +msgstr "Ensambla multiples imagenes de entrada en una cuadricula de bloques, con disposicion, etiquetas y bordes personalizables." + +msgid "Collects multiple input images, transforming them into tiles within\nthe output image. Provides the core functionality of the ContactSheet\nnode, and may be reused for making similar nodes." +msgstr "Recopila multiples imagenes de entrada, transformandolas en bloques dentro\nde la imagen de salida. Proporciona la funcionalidad central del nodo\nContactSheet, y puede reutilizarse para crear nodos similares." + +msgid "Copies channels from the secondary input images\nonto the primary input image and outputs the result." +msgstr "Copia canales de las imagenes de entrada secundarias\nsobre la imagen de entrada primaria y produce el resultado." + +msgid "Copies metadata entries from the second image to the first image\nbased on name. If those entries already exist in the incoming\nimage metadata, their values will be overwritten." +msgstr "Copia entradas de metadatos de la segunda imagen a la primera imagen\nbasandose en el nombre. Si esas entradas ya existen en los metadatos\nde la imagen entrante, sus valores seran sobrescritos." + +msgid "Copies views from the secondary input images onto the primary input image.\nOnly works with multi-view images." +msgstr "Copia vistas de las imagenes de entrada secundarias a la imagen de entrada primaria.\nSolo funciona con imagenes multivista." + +msgid "Creates a multi-view image by combining multiple input images." +msgstr "Crea una imagen multivista combinando multiples imagenes de entrada." + +msgid "Modifies the Data and/or Display Window, in a way that is\neither user-defined, or can be driven by the existing Data\nor Display Window." +msgstr "Modifica la ventana de datos y/o de visualizacion, de una manera\ndefinida por el usuario, o que puede ser controlada por la ventana\nde datos o de visualizacion existente." + +msgid "Queries the data window of an image as well as the center and size of the data window." +msgstr "Consulta la ventana de datos de una imagen, asi como el centro y tamano de la ventana de datos." + +msgid "Flattens the part of the input which is not hidden by the holdout input." +msgstr "Aplana la parte de la entrada que no está oculta por la entrada de recorte." + +msgid "Merges the samples from two or more images into a single deep image.\nThe source images may be deep or flat." +msgstr "Fusiona las muestras de dos o mas imagenes en una sola imagen profunda.\nLas imagenes de origen pueden ser profundas o planas." + +msgid "Recolors deep data so that the flattened image will match the color of a provided flat image.\nKeeps the same depth data, and mostly the same alpha ( with a small adjustment if you select\nuseColorSourceAlpha )." +msgstr "Recolorea datos profundos para que la imagen aplanada coincida con el color de una imagen plana proporcionada.\nMantiene los mismos datos de profundidad, y mayormente el mismo alfa (con un pequeno ajuste si se selecciona\nuseColorSourceAlpha)." + +msgid "Outputs an image showing the deep sample counts for each pixel." +msgstr "Produce una imagen mostrando los conteos de muestras profundas para cada pixel." + +msgid "Samples the full channel data of an image at a specified pixel location,\nincluding all deep samples." +msgstr "Muestrea los datos completos de canal de una imagen en una ubicacion de pixel especificada,\nincluyendo todas las muestras profundas." + +msgid "Takes a slice out of an image with depth defined by Z ( and optionally ZBack ) channels by\ndiscarding everything outside of a clipping range. The range is half open, including point samples\nexactly at the near clip, but excluding point samples exactly at the far clip. This means that if\nyou split an image into a front and back with two DeepSlices, they will composite back together to\nmatch the original. Optionally also flattens the image." +msgstr "Toma una rodaja de una imagen con profundidad definida por canales Z (y opcionalmente ZBack)\ndescartando todo fuera de un rango de recorte. El rango es semi-abierto, incluyendo muestras puntuales\nexactamente en el recorte cercano, pero excluyendo muestras puntuales exactamente en el recorte lejano.\nEsto significa que si se divide una imagen en frente y atras con dos DeepSlice, se componen de vuelta\npara coincidir con la original. Opcionalmente tambien aplana la imagen." + +msgid "Modifies the samples of a deep image so that the composited result\nstays the same, but there are additional desirable properties,\nsuch as being sorted, non-overlapping, or being combined into a\nsingle sample." +msgstr "Modifica las muestras de una imagen profunda para que el resultado compuesto\npermanezca igual, pero con propiedades adicionales deseables,\ncomo estar ordenadas, sin superposicion, o combinadas en una\nsola muestra." + +msgid "Ensures deep samples are sorted and non-overlapping, and optionally\ndiscards samples that are completely transparent, or covered by other\nsamples." +msgstr "Asegura que las muestras profundas esten ordenadas y sin superposicion,\ny opcionalmente descarta muestras que son completamente transparentes,\no cubiertas por otras muestras." + +msgid "Converts a deep image into a \"flat\" image, by compositing all samples in\neach pixel, resulting in an image with 1 sample for every pixel." +msgstr "Convierte una imagen profunda en una imagen \"plana\", componiendo todas las muestras en\ncada pixel, resultando en una imagen con 1 muestra por cada pixel." + +msgid "Deletes metadata entries from an image based on name." +msgstr "Elimina entradas de metadatos de una imagen basandose en el nombre." + +msgid "Deletes views from an image." +msgstr "Elimina vistas de una imagen." + +msgid "Applies a dilate filter to the image. This can be useful for\nexpanding mask." +msgstr "Aplica un filtro de dilatacion a la imagen. Esto puede ser util para\nexpandir las mascaras." + +msgid "A special disk blur node which efficiently supports large radius blurs, and allows for a\nvariable radius. Works by rendering each input pixel as a disk in the output, using special\nacceleration structures that make rendering large disks fast. Suitable as a building block\nfor focal blur." +msgstr "Un nodo especial de desenfoque de disco que soporta eficientemente desenfoques de gran radio,\ny permite un radio variable. Funciona renderizando cada pixel de entrada como un disco en la salida,\nusando estructuras de aceleracion especiales que hacen rapido el renderizado de discos grandes.\nAdecuado como bloque de construccion para desenfoque focal." + +msgid "Applies an OpenColorIO display transform to an image." +msgstr "Aplica una transformacion de visualizacion de OpenColorIO a una imagen." + +msgid "Outputs an empty deep image with 0 samples per pixel." +msgstr "Produce una imagen profunda vacia con 0 muestras por pixel." + +msgid "Applies an erode filter to the image. This can be useful for\nshrinking mask." +msgstr "Aplica un filtro de erosion a la imagen. Esto puede ser util para\nreducir las mascaras." + +msgid "Base class for nodes which process only flat image data\nand so will error on non-flat data." +msgstr "Clase base para nodos que procesan solo datos de imagen plana\ny por lo tanto daran error con datos no planos." + +msgid "Base class for nodes which create a flat image." +msgstr "Clase base para nodos que crean una imagen plana." + +msgid "Sets the deep flag on a flat image, and makes sure that it has a Z channel ( and optionally a ZBack channel )\nso that it can be used in deep compositing." +msgstr "Establece la marca de profundidad en una imagen plana, y asegura que tenga un canal Z (y opcionalmente un canal ZBack)\npara que pueda usarse en composicion profunda." + +msgid "Extracts the format of an input image, for driving the format input of another image node, or\ndriving expressions." +msgstr "Extrae el formato de una imagen de entrada, para controlar la entrada de formato de otro nodo de imagen,\no controlar expresiones." + +msgid "Performs a simple per-channel colour grading operation\nas follows :" +msgstr "Realiza una operacion simple de etalonaje de color por canal\nde la siguiente manera:" + +msgid "A = multiply * (gain - lift) / (whitePoint - blackPoint)\nB = offset + lift - A * blackPoint\nresult = pow( A * input + B, 1/gamma )" +msgstr "A = multiplicar * (ganancia - elevacion) / (puntoBlanco - puntoNegro)\nB = desplazamiento + elevacion - A * puntoNegro\nresultado = pow( A * entrada + B, 1/gamma )" + +msgid "See the descriptions for individual plug for a slightly\nmore practical explanation of the formula." +msgstr "Consulta las descripciones de cada conector individual para una explicacion\nligeramente mas practica de la formula." + +msgid "Adds arbitrary metadata entires to an image. If those entries\nalready exist in the incoming image metadata, their values\nwill be overwritten." +msgstr "Agrega entradas de metadatos arbitrarias a una imagen. Si esas entradas\nya existen en los metadatos de la imagen entrante, sus valores\nseran sobrescritos." + +msgid "Base class for nodes which generate images." +msgstr "Clase base para nodos que generan imagenes." + +msgid "Base class for nodes which process an input image to\nto generate an output image." +msgstr "Clase base para nodos que procesan una imagen de entrada\npara generar una imagen de salida." + +msgid "Reads image files from disk using OpenImageIO. All file\ntypes supported by OpenImageIO are supported by the ImageReader\nand all channel data will be converted to linear using OpenColorIO." +msgstr "Lee archivos de imagen desde disco usando OpenImageIO. Todos los tipos de\narchivo soportados por OpenImageIO son soportados por el ImageReader\ny todos los datos de canal seran convertidos a lineal usando OpenColorIO." + +msgid "Samples image colour at a specified pixel location." +msgstr "Muestrea el color de la imagen en una ubicacion de pixel especificada." + +msgid "Calculates minimum, maximum and average colours for a region of\nan image. These outputs can then be used to drive other plugs\nwithin the node graph." +msgstr "Calcula colores minimos, maximos y promedio para una region de\nuna imagen. Estas salidas pueden usarse para controlar otros conectores\ndentro del grafo de nodos." + +msgid "Scales, rotates and translates an image within its display window.\nNote that although the format is not changed, the data window is\nexpanded to include the portions of the image which have been\ntransformed outside of the display window, and these out-of-frame\npixels can still be used by downstream nodes." +msgstr "Escala, rota y traslada una imagen dentro de su ventana de visualizacion.\nNota que aunque el formato no cambia, la ventana de datos se\nexpande para incluir las porciones de la imagen que han sido\ntransformadas fuera de la ventana de visualizacion, y estos pixeles\nfuera de cuadro aun pueden ser usados por nodos posteriores." + +msgid "Writes image files to disk using OpenImageIO. All file\ntypes supported by OpenImageIO are supported by the\nImageWriter." +msgstr "Escribe archivos de imagen a disco usando OpenImageIO. Todos los tipos de\narchivo soportados por OpenImageIO son soportados por el\nImageWriter." + +msgid "Applies color transformations provided by\nOpenColorIO via a LUT file and OCIO FileTransform." +msgstr "Aplica transformaciones de color proporcionadas por\nOpenColorIO mediante un archivo LUT y OCIO FileTransform." + +msgid "Applies OpenColorIO \"looks\" to an image." +msgstr "Aplica \"looks\" de OpenColorIO a una imagen." + +msgid "A 'look' is a named color transform, intended to modify the look of an\nimage in a 'creative' manner (as opposed to a colorspace definition which\ntends to be technically/mathematically defined)." +msgstr "Un 'look' es una transformacion de color con nombre, destinada a modificar el aspecto de una\nimagen de manera 'creativa' (a diferencia de una definicion de espacio de color que\ntiende a estar definida tecnica/matematicamente)." + +msgid "Examples of looks may be a neutral grade, to be applied to film scans\nprior to VFX work, or a per-shot DI grade decided on by the director,\nto be applied just before the viewing transform." +msgstr "Ejemplos de looks pueden ser un etalonaje neutral, aplicado a los escaneos de película\nantes del trabajo de VFX, o un etalonaje DI por plano decidido por el director,\naplicado justo antes de la transformación de visualización." + +msgid "OCIOLooks must be predefined in the OpenColorIO configuration before usage,\noften reference per-shot/sequence LUTs/CCs and are applied in scene linear colorspace." +msgstr "Los OCIOLooks deben estar predefinidos en la configuracion de OpenColorIO antes de usarse,\na menudo referencian LUTs/CCs por plano/secuencia y se aplican en espacio de color lineal de escena." + +msgid "See the look plug for further syntax details." +msgstr "Consultar el conector look para mas detalles de sintaxis." + +msgid "See opencolorio.org for look configuration customization examples." +msgstr "Consultar opencolorio.org para ejemplos de personalizacion de configuracion de looks." + +msgid "Applies a median filter to the image. This can be useful for\nremoving noise." +msgstr "Aplica un filtro de mediana a la imagen. Esto puede ser util para\neliminar ruido." + +msgid "Composites two or more images together. The following operations\nare available :" +msgstr "Compone dos o mas imagenes juntas. Las siguientes operaciones\nestan disponibles:" + +msgid "- Add : A + B\n - Atop : Ab + B(1-a)\n - Divide : A / B\n - In : Ab\n - Out : A(1-b)\n - Mask : Ba\n - Matte : Aa + B(1.-a)\n - Multiply : AB\n - Over : A + B(1-a)\n - Subtract : A - B\n - Difference : fabs( A - B )\n - Under : A(1-b) + B\n - Min : min( A, B )\n - Max : max( A, B )" +msgstr " - Sumar: A + B\n - Encima: Ab + B(1-a)\n - Dividir: A / B\n - Interior: Ab\n - Exterior: A(1-b)\n - Máscara: Ba\n - Troquel: Aa + B(1.-a)\n - Multiplicar: AB\n - Delante: A + B(1-a)\n - Restar: A - B\n - Diferencia: fabs( A - B )\n - Debajo: A(1-b) + B\n - Minimo: min( A, B )\n - Maximo: max( A, B )" + +msgid "Formats metadata into a text overlay on top of the image. Provides control over formatting, font, layout and a drop shadow." +msgstr "Formatea metadatos como una superposicion de texto sobre la imagen. Proporciona control sobre formato, fuente, disposicion y sombra." + +msgid "Mirrors the image, flipping it in the horizontal and/or\nvertical directions. Unlike the ImageTransform node, this\nperforms no filtering, so pixel values are not changed." +msgstr "Refleja la imagen, voltandola en la direccion horizontal y/o\nvertical. A diferencia del nodo ImageTransform, este\nno realiza filtrado, por lo que los valores de pixel no cambian." + +msgid "Blends two images together based on a mask.\nIf the mask is 0 you get the first input, if it is 1 you get the second." +msgstr "Mezcla dos imagenes juntas basandose en una mascara.\nSi la mascara es 0 se obtiene la primera entrada, si es 1 se obtiene la segunda." + +msgid "Offsets (translates) the image in integer increments. Because\nthe increments may only be whole numbers, no filtering is necessary,\nand this node has improved performance compared to the equivalent\nImageTransform." +msgstr "Desplaza (traslada) la imagen en incrementos enteros. Debido a que\nlos incrementos solo pueden ser numeros enteros, no es necesario filtrado,\ny este nodo tiene mejor rendimiento comparado con el ImageTransform\nequivalente." + +msgid "Creates Gaffer context variables which define the OpenColorIO config\nto be used by upstream nodes. This allows different configs to be used\nin different contexts." +msgstr "Crea variables de contexto de Gaffer que definen la configuracion de OpenColorIO\na usar por los nodos anteriores. Esto permite usar diferentes configuraciones\nen diferentes contextos." + +msgid "Utility node which reads image files from disk using OpenImageIO.\nAll file types supported by OpenImageIO are supported by the\nOpenImageIOReader." +msgstr "Nodo utilitario que lee archivos de imagen desde disco usando OpenImageIO.\nTodos los tipos de archivo soportados por OpenImageIO son soportados por el\nOpenImageIOReader." + +msgid "Multiplies selected channels by a specified alpha channel." +msgstr "Multiplica los canales seleccionados por un canal alfa especificado." + +msgid "Outputs an image of a color gradient interpolated using the ramp plug." +msgstr "Produce una imagen de un gradiente de color interpolado usando el conector de rampa." + +msgid "Renders a rectangle with adjustable line width, corner radius,\ndrop shadow and transform." +msgstr "Renderiza un rectangulo con ancho de linea ajustable, radio de esquina,\nsombra y transformacion." + +msgid "Utility node used internally within GafferImage, but\nnot intended to be used directly by end users." +msgstr "Nodo utilitario usado internamente dentro de GafferImage, pero\nno destinado a ser usado directamente por usuarios finales." + +msgid "Resizes the image to a new resolution, scaling the\ncontents to fit the new size." +msgstr "Redimensiona la imagen a una nueva resolucion, escalando\nel contenido para ajustarse al nuevo tamano." + +msgid "Increases or decreases the saturation of an image. Saturation is calculated relative\nto a standard luminance measure using the RGB coefficients `0.2126, 0.7152, 0.0722`." +msgstr "Aumenta o disminuye la saturacion de una imagen. La saturacion se calcula relativa\na una medida de luminancia estandar usando los coeficientes RVA `0.2126, 0.7152, 0.0722`." + +msgid "Picks one view from a multi-view image. Outputs it as an image with a single, default view." +msgstr "Selecciona una vista de una imagen multivista. La produce como una imagen con una sola vista predeterminada." + +msgid "Shuffles data between image channels, for instance by copying R\ninto G or a constant white into A." +msgstr "Redistribuye datos entre canales de imagen, por ejemplo copiando R\nen G o un blanco constante en A." + +msgid "Shuffles image metadata, allowing entries to be copied and/or renamed." +msgstr "Redistribuye los metadatos de la imagen, permitiendo que las entradas se copien y/o renombren." + +msgid "Renders text over an input image." +msgstr "Renderiza texto sobre una imagen de entrada." + +msgid "Warps an input image onto a set of UVs provided\nby a second image, effectively applying a texture\nmap to the UV image." +msgstr "Deforma una imagen de entrada sobre un conjunto de UVs proporcionado\npor una segunda imagen, aplicando efectivamente un mapa de textura\na la imagen UV." + +msgid "Divides selected channels by a specified alpha channel.\nIf the alpha channel on a pixel is 0, then that pixel will remain\nthe same as the input." +msgstr "Divide los canales seleccionados por un canal alfa especificado.\nSi el canal alfa en un pixel es 0, entonces ese pixel permanecera\nigual que la entrada." + +msgid "Renders depth of field effects based on a 2D image with a depth channel ( by default, \"Z\" )." +msgstr "Renderiza efectos de profundidad de campo basandose en una imagen 2D con un canal de profundidad (por defecto, \"Z\")." + +msgid "The depth of field parameters can be driven by a camera from a 3D scene, or entered manually." +msgstr "Los parametros de profundidad de campo pueden ser controlados por una camara de una escena 3D, o ingresados manualmente." + +msgid "Applying this node to an image rendered with DOF disabled should result in a similar amount of blur to an actual 3D render done with DOF enabled ( though the edge quality will not be quite as good, since there is information lost due to occlusion in the 2D image )." +msgstr "Aplicar este nodo a una imagen renderizada con DOF deshabilitado deberia resultar en una cantidad similar de desenfoque a un render 3D real hecho con DOF habilitado (aunque la calidad de los bordes no sera tan buena, ya que hay informacion perdida debido a la oclusion en la imagen 2D)." + +msgid "Allows arbitrary OSL shaders to be written directly within\nGaffer." +msgstr "Permite escribir shaders OSL arbitrarios directamente dentro de\nGaffer." + +msgid "Executes OSL shaders to perform image processing. Use the shaders from\nthe OSL/ImageProcessing menu to read values from the input image and\nthen write values back to it." +msgstr "Ejecuta shaders OSL para realizar procesamiento de imagen. Usar los shaders del\nmenu OSL/ImageProcessing para leer valores de la imagen de entrada y\nluego escribir valores de vuelta." + +msgid "Creates lights by assigning an emissive OSL shader to some simple geometry." +msgstr "Crea luces asignando un shader OSL emisivo a alguna geometria simple." + +msgid "Executes OSL shaders to perform object processing. Use the shaders from\nthe OSL/ObjectProcessing menu to read primitive variables from the input\nobject and then write primitive variables back to it." +msgstr "Ejecuta shaders OSL para realizar procesamiento de objetos. Usar los shaders del\nmenu OSL/ObjectProcessing para leer variables primitivas del objeto de\nentrada y luego escribir variables primitivas de vuelta." + +msgid "Transforms objects so that they are aimed at\na specified target." +msgstr "Transforma objetos para que apunten hacia\nun objetivo especificado." + +msgid "Query a particular location in a scene and outputs attribute." +msgstr "Consulta una ubicacion particular en una escena y produce el atributo." + +msgid "Makes modifications to attributes." +msgstr "Realiza modificaciones a los atributos." + +msgid "Visualises attribute values by applying a constant\nshader to display them as a colour." +msgstr "Visualiza valores de atributos aplicando un shader\nconstante para mostrarlos como un color." + +msgid "The base type for nodes that apply attributes to the scene." +msgstr "El tipo base para nodos que aplican atributos a la escena." + +msgid "Queries a particular location in a scene and outputs the bound." +msgstr "Consulta una ubicacion particular en una escena y produce los limites." + +msgid "Produces scenes containing a camera. To choose which camera is\nused for rendering, use a StandardOptions node." +msgstr "Produce escenas que contienen una camara. Para elegir que camara se\nusa para renderizar, usa un nodo StandardOptions." + +msgid "Queries parameters from a camera, creating an output for each query." +msgstr "Consulta parametros de una camara, creando una salida para cada consulta." + +msgid "Applies modifications, also known as \"tweaks\" to camera\nparameters or render options in the scene. Supports any number\nof tweaks, and custom camera parameters. Tweaks to camera\nparameters apply to every camera specified by the filter." +msgstr "Aplica modificaciones, tambien conocidas como \"ajustes\", a parametros\nde camara u opciones de render en la escena. Soporta cualquier numero\nde ajustes y parametros de camara personalizados. Los ajustes a parametros\nde camara se aplican a toda camara especificada por el filtro." + +msgid "Can add new camera parameters or render options." +msgstr "Puede agregar nuevos parametros de camara u opciones de render." + +msgid "Any existing parameters/options can be replaced or removed.\nNumeric parameters/options can also be added to, subtracted\nfrom, or multiplied." +msgstr "Cualquier parametro/opcion existente puede ser reemplazado o eliminado.\nLos parametros/opciones numericos tambien pueden sumarse, restarse\no multiplicarse." + +msgid "Tweaks are applied in order, so if there is more than one tweak\nto the same parameter/option, the first tweak will be applied\nfirst, then the second, etc." +msgstr "Los ajustes se aplican en orden, asi que si hay mas de un ajuste\nal mismo parametro/opcion, el primer ajuste se aplicara\nprimero, luego el segundo, etc." + +msgid "Stores a catalogue of images to be browsed. Images can either be loaded\nfrom files or rendered directly into the catalogue." +msgstr "Almacena un catalogo de imagenes para explorar. Las imagenes pueden cargarse\ndesde archivos o renderizarse directamente en el catalogo." + +msgid "To send a live render to a Catalogue, an \"ieDisplay\" output definition\nshould be used with the following parameters :" +msgstr "Para enviar un render en vivo a un catalogo, se debe usar una definicion\nde salida \"ieDisplay\" con los siguientes parametros:" + +msgid "- driverType : \"ClientDisplayDriver\"\n- displayHost : host name (\"localhost\" is sufficient for local renders)\n- displayPort : `GafferScene.Catalogue.displayDriverServer().portNumber()`\n- remoteDisplayType : \"GafferScene::GafferDisplayDriver\"\n- catalogue:name : The name of the catalogue to render to (optional)" +msgstr "- driverType: \"ClientDisplayDriver\"\n- displayHost: nombre del host (\"localhost\" es suficiente para renders locales)\n- displayPort: `GafferScene.Catalogue.displayDriverServer().portNumber()`\n- remoteDisplayType: \"GafferScene::GafferDisplayDriver\"\n- catalogue:name: El nombre del catalogo donde renderizar (opcional)" + +msgid "Finds an image in a directly connected Catalogue by name." +msgstr "Encuentra una imagen en un catalogo directamente conectado por su nombre." + +msgid "Creates an arbitrary clipping plane. This is like the near\nand far clipping planes provided by the Camera node, but\ncan be positioned arbitrarily in space. All geometry on\nthe positive Z side of the plane is clipped away." +msgstr "Crea un plano de recorte arbitrario. Esto es similar a los planos\nde recorte cercano y lejano proporcionados por el nodo de camara, pero\npuede posicionarse arbitrariamente en el espacio. Toda la geometria en\nel lado Z positivo del plano se recorta." + +msgid "Samples primitive variables from the closest point on\nthe surface of a source primitive, and transfers the\nvalues onto new primitive variable on the sampling objects." +msgstr "Muestrea variables primitivas del punto mas cercano en\nla superficie de una primitiva de origen, y transfiere los\nvalores a nuevas variables primitivas en los objetos de muestreo." + +msgid "Make copies of target primitive variables with different suffixes,\nwhere the new suffixed copies come from different Contexts." +msgstr "Crea copias de variables primitivas objetivo con diferentes sufijos,\ndonde las nuevas copias con sufijo provienen de diferentes contextos." + +msgid "By combining this with a TimeWarp, you can create copies of\nprimitive variables at different times, useful for creating trail\neffects." +msgstr "Combinando esto con un TimeWarp, puedes crear copias de\nvariables primitivas en diferentes tiempos, util para crear efectos\nde estela." + +msgid "Builds a scene by bundling multiple input scenes together, each\nunder their own root location. Instead of using an array of inputs\nlike the Group node, a single input is used instead, and a Context\nVariable is provided so that a different hierarchy can be generated\nunder each root location. This is especially powerful for building\ndynamic scenes where the number of inputs is not known prior to\nbuilding the node graph." +msgstr "Construye una escena agrupando multiples escenas de entrada juntas, cada\nuna bajo su propia ubicacion raiz. En lugar de usar un arreglo de entradas\ncomo el nodo Group, se usa una sola entrada, y se proporciona una variable\nde contexto para que se pueda generar una jerarquia diferente\nbajo cada ubicacion raiz. Esto es especialmente poderoso para construir\nescenas dinamicas donde el numero de entradas no se conoce antes de\nconstruir el grafo de nodos." + +msgid "Since merging globals from multiple scenes often doesn't make sense,\nthe output globals are taken directly from the scene corresponding to\n`rootNames[0]`." +msgstr "Ya que fusionar globales de multiples escenas a menudo no tiene sentido,\nlos globales de salida se toman directamente de la escena correspondiente a\n`rootNames[0]`." + +msgid "Collects transforms in different Contexts, storing the results as attributes. The\nnames of the attributes being collected are provided as a Context Variable,\nwhich can be used to vary the transforms that are collected." +msgstr "Recopila transformaciones en diferentes contextos, almacenando los resultados como atributos.\nLos nombres de los atributos recopilados se proporcionan como una variable de contexto,\nque puede usarse para variar las transformaciones que se recopilan." + +msgid "By combining this with a TimeWarp, you can create copies of\nthe transform at different times, useful for creating trail\neffects." +msgstr "Combinando esto con un TimeWarp, puedes crear copias de\nla transformacion en diferentes tiempos, util para crear efectos\nde estela." + +msgid "Produces scenes containing a coordinate system. Coordinate systems\nhave two main uses :" +msgstr "Produce escenas que contienen un sistema de coordenadas. Los sistemas de\ncoordenadas tienen dos usos principales:" + +msgid "- To visualise the transform at a particular location. In this\n respect they're similar to locators or nulls in other packages.\n- To define a named coordinate system to be used in shaders at\n render time. This is useful for defining projections or procedural\n solid textures. The full path to the location of the coordinate\n system should be used to refer to it within shaders." +msgstr "- Para visualizar la transformacion en una ubicacion particular. En este\n aspecto son similares a localizadores o nulos en otros paquetes.\n- Para definir un sistema de coordenadas con nombre a usar en shaders durante\n el render. Esto es util para definir proyecciones o texturas solidas\n procedurales. La ruta completa a la ubicacion del sistema de coordenadas\n debe usarse para referenciarlo dentro de los shaders." + +msgid "Copies attributes from a source scene, adding them to the attributes\nof the main input scene." +msgstr "Copia atributos de una escena de origen, agregandolos a los atributos\nde la escena de entrada principal." + +msgid "A node which copies options from a source scene." +msgstr "Un nodo que copia opciones de una escena de origen." + +msgid "Copies primitive variables from a source scene, adding them to the objects\nof the main input scene." +msgstr "Copia variables primitivas de una escena de origen, agregandolas a los objetos\nde la escena de entrada principal." + +msgid "Outputs a matte channel generated from IDs selected from Cryptomatte AOVs." +msgstr "Produce un canal de máscara generado a partir de IDs seleccionados de AOV de Cryptomatte." + +msgid "Produces scenes containing a cube." +msgstr "Produce escenas que contienen un cubo." + +msgid "Samples primitive variables from parametric positions on some\nsource curves. The positions are specified using the index of\nthe curve and its `v` parameter." +msgstr "Muestrea variables primitivas de posiciones parametricas en algunas\ncurvas de origen. Las posiciones se especifican usando el indice de\nla curva y su parametro `v`." + +msgid "Applies arbitrary user-defined attributes to locations in the scene. Note\nthat for most common cases the StandardAttributes or renderer-specific\nattributes nodes should be preferred, as they provide predefined sets of\nattributes with customised user interfaces. The CustomAttributes node is\nof most use when needing to set an attribute not supported by the\nspecialised nodes." +msgstr "Aplica atributos arbitrarios definidos por el usuario a ubicaciones en la escena.\nNota que para los casos mas comunes se deben preferir los nodos StandardAttributes\no de atributos especificos del renderizador, ya que proporcionan conjuntos predefinidos\nde atributos con interfaces de usuario personalizadas. El nodo CustomAttributes es\nmas util cuando se necesita establecer un atributo no soportado por los\nnodos especializados." + +msgid "Applies arbitrary user-defined options to the root of the scene. Note\nthat for most common cases the StandardOptions or renderer-specific options\nnodes should be preferred, as they provide predefined sets of options with customised\nuser interfaces. The CustomOptions node is of most use when needing to set am\noption not supported by the specialised nodes." +msgstr "Aplica opciones arbitrarias definidas por el usuario a la raiz de la escena.\nNota que para los casos mas comunes se deben preferir los nodos StandardOptions\no de opciones especificas del renderizador, ya que proporcionan conjuntos predefinidos\nde opciones con interfaces de usuario personalizadas. El nodo CustomOptions es\nmas util cuando se necesita establecer una opcion no soportada por los nodos especializados." + +msgid "Deletes attributes from locations within the scene.\nThose locations will then inherit the attribute\nvalues from ancestor locations instead, or will fall\nback to using the default attribute value." +msgstr "Elimina atributos de ubicaciones dentro de la escena.\nEsas ubicaciones entonces heredaran los valores de atributos\nde ubicaciones ancestrales, o recurriran a usar\nel valor de atributo predeterminado." + +msgid "Delete curves from a curves primitive using a primitive variable to choose the curves." +msgstr "Elimina curvas de una primitiva de curvas usando una variable primitiva para elegir las curvas." + +msgid "Deletes faces from a mesh using a primitive variable to choose the faces." +msgstr "Elimina caras de una malla usando una variable primitiva para elegir las caras." + +msgid "A node which removes named items from the globals.\nTo delete outputs or options specifically, prefer\nthe DeleteOutputs and DeleteOptions nodes respectively,\nas they provide improved interfaces for their specific\ntasks." +msgstr "Un nodo que elimina elementos con nombre de los globales.\nPara eliminar salidas u opciones especificamente, prefiere\nlos nodos DeleteOutputs y DeleteOptions respectivamente,\nya que proporcionan interfaces mejoradas para sus tareas\nespecificas." + +msgid "Deletes the object at a location, keeping the location itself\nintact. This is most useful when a location contains an unwanted object,\nbut the location also has children which need to be preserved." +msgstr "Elimina el objeto en una ubicacion, manteniendo la ubicacion misma\nintacta. Esto es mas util cuando una ubicacion contiene un objeto no deseado,\npero la ubicacion tambien tiene secundarios que necesitan preservarse." + +msgid "A node which removes options from the globals." +msgstr "Un nodo que elimina opciones de los globales." + +msgid "A node which removes outputs from the globals." +msgstr "Un nodo que elimina salidas de los globales." + +msgid "Deletes points from a points primitive using a primitive variable or id list to choose the points." +msgstr "Elimina puntos de una primitiva de puntos usando una variable primitiva o lista de IDs para elegir los puntos." + +msgid "Deletes primitive variables from objects. The primitive\nvariables to be deleted are chosen based on name." +msgstr "Elimina variables primitivas de objetos. Las variables\nprimitivas a eliminar se eligen basandose en el nombre." + +msgid "Deletes render passes from the scene globals." +msgstr "Elimina pases de render de los globales de la escena." + +msgid "A node which removes object sets." +msgstr "Un nodo que elimina conjuntos de objetos." + +msgid "Interactively displays images as they are rendered." +msgstr "Muestra imagenes interactivamente mientras se renderizan." + +msgid "This node runs a server on a background thread,\nallowing it to receive images from both local and\nremote render processes. To set up a render to\noutput to the Display node, use an Outputs node with\nan Interactive output configured to render to the\nsame port as is specified on the Display node." +msgstr "Este nodo ejecuta un servidor en un hilo en segundo plano,\npermitiendo recibir imagenes de procesos de render tanto locales\ncomo remotos. Para configurar un render que envie\nla salida al nodo Display, usa un nodo Outputs con\nuna salida interactiva configurada para renderizar al\nmismo puerto especificado en el nodo Display." + +msgid "Duplicates a part of the scene. The duplicates\nare parented alongside the original, and have\na transform applied to them." +msgstr "Duplica una parte de la escena. Los duplicados\nse colocan como hermanos del original, y tienen\nuna transformacion aplicada." + +msgid "Encapsulates a portion of the scene by collapsing the hierarchy\nand replacing it with a procedural which will be evaluated at\nrender time." +msgstr "Encapsula una porcion de la escena colapsando la jerarquia\ny reemplazandola con un procedural que sera evaluado en\ntiempo de render." + +msgid "This has two primary uses :" +msgstr "Esto tiene dos usos principales:" + +msgid "- To optimise scene generation. Downstream nodes do not see\n the encapsulated locations, so do not spend time processing\n them.\n- To enable high-level instancing of hierarchies. If multiple\n copies of the encapsulated procedural are made by the\n downstream network, then the procedural itself can be instanced\n at render time. This works no matter how the copies are\n made, but typically the Instancer or Duplicate nodes would\n be the most common method of copying the procedural." +msgstr "- Para optimizar la generacion de la escena. Los nodos posteriores no ven\n las ubicaciones encapsuladas, asi que no gastan tiempo procesandolas.\n- Para habilitar instanciacion de alto nivel de jerarquias. Si se hacen multiples\n copias del procedural encapsulado por la red posterior, entonces el procedural\n mismo puede instanciarse en tiempo de render. Esto funciona sin importar como\n se hagan las copias, pero tipicamente los nodos Instancer o Duplicate serian\n el metodo mas comun para copiar el procedural." + +msgid "> Note : Encapsulation currently has some limitations\n>\n> - Motion blur attributes are not inherited - only\n> attributes within the encapsulated hierarchy are\n> considered.\n> - The `usd:purpose` attribute is not inherited - only\n> attributes within the encapsulated hierarchy are\n> considered." +msgstr "> Nota: La encapsulacion actualmente tiene algunas limitaciones\n>\n> - Los atributos de desenfoque de movimiento no se heredan - solo\n> se consideran los atributos dentro de la jerarquia encapsulada.\n> - El atributo `usd:purpose` no se hereda - solo se consideran\n> los atributos dentro de la jerarquia encapsulada." + +msgid "Queries the existence of a specified location in a scene." +msgstr "Consulta la existencia de una ubicacion especificada en una escena." + +msgid "References external geometry procedurals and archives." +msgstr "Referencia procedurales de geometria externos y archivos." + +msgid "The base type for all nodes which are capable of choosing which\nscene locations a FilteredSceneProcessor applies to." +msgstr "El tipo base para todos los nodos capaces de elegir a que\nubicaciones de la escena se aplica un FilteredSceneProcessor." + +msgid "The base type for all filters which operate using one or more input filters." +msgstr "El tipo base para todos los filtros que operan usando uno o mas filtros de entrada." + +msgid "Queries a filter for a particular location in a scene\nand outputs the results." +msgstr "Consulta un filtro para una ubicacion particular en una escena\ny produce los resultados." + +msgid "Searches an input scene for all locations matched\nby a filter." +msgstr "Busca en una escena de entrada todas las ubicaciones que coincidan\ncon un filtro." + +msgid "> Caution : This can be an arbitrarily expensive operation\ndepending on the size of the input scene and the filter\nused. In particular it should be noted that the usage of\n`...` in a PathFilter will cause the entire input scene to\nbe searched even if there are no matches to be found." +msgstr "> Precaucion: Esta puede ser una operacion arbitrariamente costosa\ndependiendo del tamano de la escena de entrada y el filtro\nusado. En particular debe notarse que el uso de\n`...` en un PathFilter causara que toda la escena de entrada sea\nbuscada incluso si no hay coincidencias por encontrar." + +msgid "The base type for scene processors which use a Filter node to control\nwhich part of the scene is affected." +msgstr "El tipo base para procesadores de escena que usan un nodo de filtro para controlar\nque parte de la escena se ve afectada." + +msgid "Position a camera so that all of a target is visible." +msgstr "Posiciona una camara para que todo un objetivo sea visible." + +msgid "Resets the transforms at the specified scene locations,\nbaking the old transforms into the vertices of any child objects\nso that they remain the same in world space. Essentially this\nturns transforms in the hierarchy into rigid deformations of\nthe objects." +msgstr "Restablece las transformaciones en las ubicaciones de escena especificadas,\nhorneando las transformaciones antiguas en los vertices de cualquier objeto secundario\npara que permanezcan iguales en el espacio mundial. Esencialmente esto\nconvierte transformaciones en la jerarquia en deformaciones rigidas de\nlos objetos." + +msgid "\"\nA grid. This is used to draw the grid in the viewer,\nbut is also included as a node in case it might be\nuseful, perhaps for placing a grid in renders done\nusing the OpenGLRender node." +msgstr "\"\nUna cuadricula. Se usa para dibujar la cuadricula en el visor,\npero tambien se incluye como nodo en caso de que pueda ser\nutil, quizas para colocar una cuadricula en renders hechos\nusando el nodo OpenGLRender." + +msgid "Groups together several input scenes under a new parent.\nIf the input scenes contain locations with identical names,\nthey are automatically renamed to make them unique in the\noutput scene." +msgstr "Agrupa varias escenas de entrada bajo un primario nuevo.\nSi las escenas de entrada contienen ubicaciones con nombres identicos,\nse renombran automaticamente para hacerlas unicas en la\nescena de salida." + +msgid "Scatters points across an image, using pixel values to control the density\nof the points. Arbitrary image channels may be converted to additional\nprimitive variables on the points, and point width may also be driven by an\nimage channel." +msgstr "Dispersa puntos a traves de una imagen, usando valores de pixel para controlar la densidad\nde los puntos. Canales de imagen arbitrarios pueden convertirse a variables\nprimitivas adicionales en los puntos, y el ancho de punto tambien puede ser controlado por un\ncanal de imagen." + +msgid "> Note : Only the area of the `displayWindow` is considered. To\n> include overscan pixels, use a Crop node to extend the display\n> window." +msgstr "> Nota: Solo se considera el area del `displayWindow`. Para\n> incluir pixeles de overscan, usa un nodo Crop para extender la ventana\n> de visualizacion." + +msgid "Converts an image into a points primitive, with a point for each pixel\nin the image. Point positions may be defined either by the original\npixel coordinates or an image layer providing position data.\nArbitrary image channels may be converted to additional primitive\nvariables on the points, and transparent pixels may be omitted\nfrom the conversion." +msgstr "Convierte una imagen en una primitiva de puntos, con un punto por cada pixel\nen la imagen. Las posiciones de los puntos pueden definirse por las coordenadas\nde pixel originales o por una capa de imagen que proporcione datos de posicion.\nCanales de imagen arbitrarios pueden convertirse a variables primitivas\nadicionales en los puntos, y los pixeles transparentes pueden omitirse\nde la conversion." + +msgid "> Note : Only pixels within the display window are converted. To\n> include overscan pixels, use a Crop node to extend the display\n> window." +msgstr "> Nota: Solo se convierten los pixeles dentro de la ventana de visualizacion. Para\n> incluir pixeles de overscan, usa un nodo Crop para extender la ventana\n> de visualizacion." + +msgid "Copies from an input scene onto the vertices of a target\nobject, making one copy per vertex. Additional vertex primitive\nvariables on the target object can be used to choose between\nmultiple prototypes, to specify their orientation, scale\nand attributes, and to modify the context in which the\nprototypes are evaluated." +msgstr "Copia desde una escena de entrada sobre los vertices de un objeto\nobjetivo, haciendo una copia por vertice. Variables primitivas de vertice\nadicionales en el objeto objetivo pueden usarse para elegir entre\nmultiples prototipos, para especificar su orientacion, escala\ny atributos, y para modificar el contexto en el que se\nevaluan los prototipos." + +msgid "> Note : The target object will be removed from the scene." +msgstr "> Nota: El objeto objetivo sera eliminado de la escena." + +msgid "> Tip : Primitive variables with `Varying` interpolation are\n> supported wherever a variable with `Vertex` interpolation\n> is expected, provided that the primitive variable has the\n> same size as the equivalent `Vertex` variable." +msgstr "> Consejo: Las variables primitivas con interpolacion `Varying` son\n> soportadas donde se espera una variable con interpolacion `Vertex`,\n> siempre que la variable primitiva tenga el mismo tamano que la\n> variable `Vertex` equivalente." + +msgid "Performs interactive renders, updating the render on the fly\nwhenever the input scene changes." +msgstr "Realiza renders interactivos, actualizando el render sobre la marcha\ncada vez que la escena de entrada cambia." + +msgid "Isolates objects by removing paths not matching a filter from the scene." +msgstr "Aisla objetos eliminando de la escena las rutas que no coincidan con un filtro." + +msgid "> Caution : The Isolate node does not work well with the `...` wildcard in\n> PathFilters. Because of the way Gaffer generates scenes progressively\n> from the root, the Isolate node needs to know if the filter matches any\n> descendants (children, grandchildren etc) of the current location; if there\n> are any matches then the current location is kept, otherwise it is removed.\n> When faced with `...`, the Isolate node assumes that there will always be a\n> descendant match because `...` matches anything. This can cause it to keep\n> locations where in fact there may be no true descendant match. The only\n> alternative would be to search the scene recursively looking for a true\n> match, but this would defeat the goal of lazy evaluation and could cause\n> poor performance." +msgstr "> Precaucion: El nodo Isolate no funciona bien con el comodin `...` en\n> PathFilters. Debido a como Gaffer genera escenas progresivamente\n> desde la raiz, el nodo Isolate necesita saber si el filtro coincide con algun\n> descendiente (secundarios, nietos, etc.) de la ubicacion actual; si hay\n> coincidencias entonces la ubicacion actual se mantiene, de lo contrario se elimina.\n> Cuando se encuentra con `...`, el nodo Isolate asume que siempre habra una\n> coincidencia descendiente porque `...` coincide con todo. Esto puede causar que mantenga\n> ubicaciones donde de hecho no hay una coincidencia descendiente real. La unica\n> alternativa seria buscar en la escena recursivamente buscando una coincidencia\n> real, pero esto iria en contra del objetivo de evaluacion perezosa y podria causar\n> bajo rendimiento." + +msgid "Converts lights into cameras. Spotlights are converted to a perspective\ncamera with the field of view matching the cone angle, and distant lights are\nconverted to an orthographic camera." +msgstr "Convierte luces en camaras. Los focos se convierten en una camara\nperspectiva con el campo de vision coincidiendo con el angulo del cono, y las luces\ndistantes se convierten en una camara ortografica." + +msgid "Makes modifications to shader parameter values.\n\n\tShader parameters are identified by name, and can optionally be filtered by the name and type of the shader they belong to. Examples :\n\n\t- `intensity` : Chooses a parameter called `intensity` on the final shader in the network. Particularly convenient for lights, which often include only one shader.\n\t- `diffuseTexture.filename`: Chooses a parameter called `filename` on a shader called `diffuseTexture`.\n\t- `dustLayer*.alpha` : Chooses all parameters called `alpha`, on shaders whose name matches `dustLayer*` (any of Gaffer's other standard wildcards may also be used to match the shader name).\n\t- `{shaderType=image}.mipmap_bias` : Chooses all parameters called `mipmap_bias` on shaders whose type is `image`.\n\t- `diffuseTexture*{shaderType=image}.mipmap_bias` : Chooses all parameters called `mipmap_bias` on shaders whose type is `image` and whose name matches `diffuseTexture*`.\n\n\t> Tip : Parameters can be dragged from the SceneInspector and dropped into the text field to fill the name automatically.\n\t" +msgstr "Realiza modificaciones a los valores de los parámetros de shader.\n\n\tLos parámetros de shader se identifican por nombre, y opcionalmente pueden filtrarse por el nombre y tipo del shader al que pertenecen. Ejemplos:\n\n\t- `intensity` : Elige un parámetro llamado `intensity` en el shader final de la red. Especialmente conveniente para luces, que a menudo incluyen un solo shader.\n\t- `diffuseTexture.filename`: Elige un parámetro llamado `filename` en un shader llamado `diffuseTexture`.\n\t- `dustLayer*.alpha` : Elige todos los parámetros llamados `alpha`, en shaders cuyo nombre coincida con `dustLayer*` (también pueden usarse otros comodines estándar de Gaffer para coincidir con el nombre del shader).\n\t- `{shaderType=image}.mipmap_bias` : Elige todos los parámetros llamados `mipmap_bias` en shaders cuyo tipo sea `image`.\n\t- `diffuseTexture*{shaderType=image}.mipmap_bias` : Elige todos los parámetros llamados `mipmap_bias` en shaders cuyo tipo sea `image` y cuyo nombre coincida con `diffuseTexture*`.\n\n\t> Consejo: Los parámetros pueden arrastrarse desde el inspector de escena y soltarse en el campo de texto para rellenar el nombre automáticamente.\n\t" + +msgid "Copies inherited attributes into local attributes." +msgstr "Copia atributos heredados a atributos locales." + +msgid "Adds an offset to object texture coordinates. This provides a convenient way of\nlooking at specific texture UDIMs." +msgstr "Agrega un desplazamiento a las coordenadas de textura del objeto. Esto proporciona una forma\nconveniente de ver UDIMs de textura especificos." + +msgid "Applies texture coordinates to meshes via a camera projection.\nIn Gaffer, texture coordinates (commonly referred to as UVs)\nare represented as primitive variables." +msgstr "Aplica coordenadas de textura a mallas mediante una proyeccion de camara.\nEn Gaffer, las coordenadas de textura (comunmente referidas como UVs)\nse representan como variables primitivas." + +msgid "Merge curves from all filtered location into a single curves primitive, or into\nmultiple destinations." +msgstr "Fusiona curvas de todas las ubicaciones filtradas en una sola primitiva de curvas, o en\nmultiples destinos." + +msgid "Merge meshes from all filtered location into a single mesh, or into\nmultiple destinations." +msgstr "Fusiona mallas de todas las ubicaciones filtradas en una sola malla, o en\nmultiples destinos." + +msgid "For primitive variables that are only present on some input locations\nthe missing values will be filled with zeros. This can produce\nunexpected results when some inputs are missing normals, Cs, or uvs." +msgstr "Para variables primitivas que solo estan presentes en algunas ubicaciones de entrada,\nlos valores faltantes se rellenaran con ceros. Esto puede producir\nresultados inesperados cuando a algunas entradas les faltan normales, Cs o UVs." + +msgid "Merge points from all filtered location into a single points primitive, or into\nmultiple destinations." +msgstr "Fusiona puntos de todas las ubicaciones filtradas en una sola primitiva de puntos, o en\nmultiples destinos." + +msgid "Merges multiple input scenes into a single output scene.\nMerging is performed left to right, starting with `in[0]`." +msgstr "Fusiona multiples escenas de entrada en una sola escena de salida.\nLa fusion se realiza de izquierda a derecha, comenzando con `in[0]`." + +msgid "By default, when more than one input contains the same\nscene location, the location's properties from the leftmost\ninput are kept. In this mode, only _new_ locations are merged\nin from the additional inputs. Optionally, the properties\ncan be replaced by or merged with the properties of the\nsubsequent inputs." +msgstr "Por defecto, cuando mas de una entrada contiene la misma\nubicacion de escena, las propiedades de la ubicacion de la entrada\nmas a la izquierda se mantienen. En este modo, solo las ubicaciones _nuevas_\nse fusionan desde las entradas adicionales. Opcionalmente, las propiedades\npueden ser reemplazadas por o fusionadas con las propiedades de las\nentradas subsiguientes." + +msgid "Sets are always merged from all inputs. Where multiple inputs\nhave sets with the same name, the sets are merged into a union." +msgstr "Los conjuntos siempre se fusionan de todas las entradas. Cuando multiples entradas\ntienen conjuntos con el mismo nombre, los conjuntos se fusionan en una union." + +msgid "> Caution : When `transformMode` and/or `objectMode` is not `Keep`,\n> bounding box computations have significant overhead. Consider\n> not using these operations, or turning off `adjustBounds`." +msgstr "> Precaucion: Cuando `transformMode` y/o `objectMode` no es `Keep`,\n> los calculos de caja delimitadora tienen una sobrecarga significativa. Considera\n> no usar estas operaciones, o desactivar `adjustBounds`." + +msgid "Measures how much a mesh has been distorted from a reference shape.\nThe distortion is calculated by comparing edge lengths between the\nreference and deformed shapes. Compressed areas have negative distortion\nvalues, stretched areas have positive distortion values, and areas with\nno deformation have distortion values of zero. The calculated distortion\nis output as primitive variables on the mesh." +msgstr "Mide cuanto se ha distorsionado una malla respecto a una forma de referencia.\nLa distorsion se calcula comparando longitudes de arista entre las formas de\nreferencia y deformada. Las areas comprimidas tienen valores de distorsion negativos,\nlas areas estiradas tienen valores de distorsion positivos, y las areas sin\ndeformacion tienen valores de distorsion de cero. La distorsion calculada\nse produce como variables primitivas en la malla." + +msgid "Creates a normal primitive variable on a mesh, using the positions of adjacent vertices." +msgstr "Crea una variable primitiva de normal en una malla, usando las posiciones de vertices adyacentes." + +msgid "Creates a uniform primitive variable of integer indices indicating which\nconnected segment each face belongs to. May create segments based on\nwhat is connected in the mesh's topology, or based on an indexed\nprimitive variable ( for example, you may segment based on which faces\nshare UVs in order to segment into UV islands )." +msgstr "Crea una variable primitiva uniforme de indices enteros indicando a que\nsegmento conectado pertenece cada cara. Puede crear segmentos basandose en\nlo que esta conectado en la topologia de la malla, o basandose en una variable\nprimitiva indexada (por ejemplo, puedes segmentar basandose en que caras\ncomparten UVs para segmentar en islas UV)." + +msgid "Splits a mesh into separate meshes for each unique value of a chosen\nUniform ( per-face ) primitive variable. The meshes will be created as children\nof the original mesh, and the original mesh will be removed." +msgstr "Divide una malla en mallas separadas para cada valor unico de una variable\nprimitiva Uniform (por cara) elegida. Las mallas se crearan como secundarios\nde la malla original, y la malla original sera eliminada." + +msgid "Adds surface tangent primitive variables to the mesh based on either UV or topology information." +msgstr "Agrega variables primitivas de tangente de superficie a la malla basandose en la informacion de UV o topologia." + +msgid "Tessellates meshes according to their subdivision scheme, converting them into higher polygon meshes\nwhich follow the limit surface - usually the smooth regular quads of a Catmull-Clark scheme." +msgstr "Tesela mallas segun su esquema de subdivision, convirtiendolas en mallas de mayor numero de poligonos\nque siguen la superficie limite - generalmente los quads regulares suaves de un esquema Catmull-Clark." + +msgid "Can be used similiarly to \"subdivide\" or \"smooth\" features in other packages, with one distinction:\nbecause it puts output points directly on the limit surface, using the tessellated result as a subdiv\nsurface again will result in the surface shrinking. Tessellation gives the most accurate possible result\nfor a given number of divisions in one step, but is not appropriate for doing repeated operations on\nthe same mesh." +msgstr "Puede usarse de forma similar a las funciones \"subdividir\" o \"suavizar\" en otros paquetes, con una distincion:\ndebido a que coloca los puntos de salida directamente en la superficie limite, usar el resultado teselado como\nsuperficie de subdivision nuevamente resultara en que la superficie se encoja. La teselacion da el resultado\nmas preciso posible para un numero dado de divisiones en un paso, pero no es apropiada para realizar operaciones\nrepetidas en la misma malla." + +msgid "This node implements the tessellation schemes described by OpenSubdiv, as described here:\nhttps://graphics.pixar.com/opensubdiv/docs/bfr_overview.html#bfr-navlink-tessellation\n( Note that OpenSubdiv's \"tessellation rate\" parameter is the same as our \"divisions\" parameter,\nexcept \"tessellation rate\" is one higher than \"divisions. )" +msgstr "Este nodo implementa los esquemas de teselacion descritos por OpenSubdiv, como se describe aqui:\nhttps://graphics.pixar.com/opensubdiv/docs/bfr_overview.html#bfr-navlink-tessellation\n(Nota que el parametro \"tessellation rate\" de OpenSubdiv es lo mismo que nuestro parametro \"divisions\",\nexcepto que \"tessellation rate\" es uno mas que \"divisions\".)" + +msgid "Converts mesh primitives into points primitives." +msgstr "Convierte primitivas de malla en primitivas de puntos." + +msgid "Primitive variables with FaceVarying or Uniform\ninterpolation are discarded (because they have the\nwrong size for the new primitive), but all other\nprimitive variables are preserved during conversion." +msgstr "Las variables primitivas con interpolacion FaceVarying o Uniform\nse descartan (porque tienen el tamano incorrecto para la nueva primitiva),\npero todas las demas variables primitivas se preservan durante la conversion." + +msgid "Changes between polygon and subdivision representations\nfor mesh objects, and optionally recalculates vertex\nnormals for polygon meshes." +msgstr "Cambia entre representaciones de poligonos y subdivision\npara objetos de malla, y opcionalmente recalcula las normales\nde vertice para mallas poligonales." + +msgid "Note that currently the Gaffer viewport does not display\nsubdivision meshes with smoothing, so the results of using\nthis node will not be seen until a render is performed." +msgstr "Nota que actualmente la vista de Gaffer no muestra\nmallas de subdivision con suavizado, por lo que los resultados de usar\neste nodo no se veran hasta que se realice un render." + +msgid "Creates a motion path curve over the specified frame range for each filtered location.\nNote the output scene will be isolated to the matching locations only." +msgstr "Crea una curva de trayectoria de movimiento sobre el rango de fotogramas especificado para cada ubicacion filtrada.\nNota que la escena de salida se aislara solo a las ubicaciones coincidentes." + +msgid "Converts objects to be used with the nodes in the\nGafferScene module." +msgstr "Convierte objetos para usarse con los nodos del\nmodulo GafferScene." + +msgid "Applies attributes to modify the appearance of objects in\nthe viewport and in renders done by the OpenGLRender node." +msgstr "Aplica atributos para modificar la apariencia de los objetos en\nla vista y en renders hechos por el nodo OpenGLRender." + +msgid "Loads GLSL shaders for use in the viewer and the OpenGLRender node.\nGLSL shaders are loaded from *.frag and *.vert files in directories\nspecified by the IECOREGL_SHADER_PATHS environment variable." +msgstr "Carga shaders GLSL para su uso en el visor y el nodo OpenGLRender.\nLos shaders GLSL se cargan desde archivos *.frag y *.vert en directorios\nespecificados por la variable de entorno IECOREGL_SHADER_PATHS." + +msgid "Use the ShaderAssignment node to assign shaders to objects in the\nscene." +msgstr "Usar el nodo ShaderAssignment para asignar shaders a los objetos en la\nescena." + +msgid "Queries global scene options, creating an output for each option." +msgstr "Consulta opciones globales de la escena, creando una salida para cada opcion." + +msgid "Makes modifications to options." +msgstr "Realiza modificaciones a las opciones." + +msgid "The base type for nodes that apply options to the scene." +msgstr "El tipo base para nodos que aplican opciones a la escena." + +msgid "Converts between different representations of orientation, stored as\nprimitive variables on an object. Supported representations include\neuler angles, quaternions, axis-angle form, aim vectors and matrices." +msgstr "Convierte entre diferentes representaciones de orientacion, almacenadas como\nvariables primitivas en un objeto. Las representaciones soportadas incluyen\nangulos de Euler, cuaterniones, forma eje-angulo, vectores de direccion y matrices." + +msgid "Typically used to prepare points for instancing, as the Instancer node\nrequires orientation to be provided as a quaternion, but it is often\nmore convenient to prepare orientations in another representation." +msgstr "Tipicamente se usa para preparar puntos para instanciacion, ya que el nodo Instancer\nrequiere que la orientacion se proporcione como cuaternion, pero a menudo\nes mas conveniente preparar orientaciones en otra representacion." + +msgid "Defines the image outputs to be created by the renderer. Arbitrary\noutputs can be defined within the UI and also via the\n`Outputs::addOutput()` API. Commonly used outputs may also\nbe predefined at startup via a config file - see\n$GAFFER_ROOT/startup/gui/outputs.py for an example." +msgstr "Define las salidas de imagen creadas por el renderizador. Salidas arbitrarias\npueden definirse dentro de la interfaz y tambien mediante la\nAPI `Outputs::addOutput()`. Las salidas de uso comun tambien pueden\npredefinirse al inicio mediante un archivo de configuracion - consulta\n$GAFFER_ROOT/startup/gui/outputs.py para un ejemplo." + +msgid "Modifies the parameters of cameras and procedurals.\nExisting parameters can be tweaked and new parameters be added." +msgstr "Modifica los parametros de camaras y procedurales.\nLos parametros existentes pueden ajustarse y se pueden agregar nuevos parametros." + +msgid "Parents additional child hierarchies into the main scene hierarchy." +msgstr "Inserta jerarquias secundarias adicionales en la jerarquia de la escena principal." + +msgid "Constrains objects from one part of the scene hierarchy as if they were\nchildren of another part of the hierarchy." +msgstr "Restringe objetos de una parte de la jerarquia de la escena como si fueran\nsecundarios de otra parte de la jerarquia." + +msgid "Chooses locations by matching them against a list of\npaths." +msgstr "Elige ubicaciones comparandolas contra una lista de\nrutas." + +msgid "Produces scenes containing a plane." +msgstr "Produce escenas que contienen un plano." + +msgid "Translates objects so that they are constrained to\nthe world space position of the target. Leaves the\nscale and orientation of the object untouched." +msgstr "Traslada objetos para que esten restringidos a\nla posicion en el espacio mundial del objetivo. Deja la\nescala y orientacion del objeto sin modificar." + +msgid "Changes the render type for PointsPrimitive objects.\nDepending on the renderer, points may be rendered as\nparticles, spheres, disks, patches or blobbies." +msgstr "Cambia el tipo de render para objetos PointsPrimitive.\nDependiendo del renderizador, los puntos pueden renderizarse como\nparticulas, esferas, discos, parches o blobbies." + +msgid "Returns true if the given primitive variable exists in the input scene\nin the current scene path location." +msgstr "Devuelve verdadero si la variable primitiva dada existe en la escena de entrada\nen la ubicacion de ruta de escena actual." + +msgid "Queries primitive variables at a scene location, creating an output for\neach primitive variable." +msgstr "Consulta variables primitivas en una ubicacion de la escena, creando una salida para\ncada variable primitiva." + +msgid "Modify primitive variable values. Supports modifying values just for specific elements of the\nprimitive." +msgstr "Modifica los valores de las variables primitivas. Soporta modificar valores solo para elementos especificos de la\nprimitiva." + +msgid "Adds arbitrary primitive variables to objects. Currently only primitive\nvariables with constant interpolation are supported - see the OSLObject\nnode for a means of creating variables with vertex interpolation." +msgstr "Agrega variables primitivas arbitrarias a los objetos. Actualmente solo se soportan variables\nprimitivas con interpolacion constante - consulta el nodo OSLObject\npara un medio de crear variables con interpolacion de vertice." + +msgid "A node for removing whole branches from the scene hierarchy." +msgstr "Un nodo para eliminar ramas completas de la jerarquia de la escena." + +msgid "Performs offline batch rendering using any of the\navailable renderer backends, or optionally writes\nscene descriptions to disk for later rendering via\na SystemCommand node." +msgstr "Realiza renderizado por lotes fuera de linea usando cualquiera de los\nbackends de renderizado disponibles, u opcionalmente escribe\ndescripciones de escena a disco para renderizar despues mediante\nun nodo SystemCommand." + +msgid "Sets up a global shader in the options to replace a shader used by a render pass type." +msgstr "Configura un shader global en las opciones para reemplazar un shader usado por un tipo de pase de render." + +msgid "Adapts render pass types to a client and renderer. The behaviour of\nhow each render pass type is adapted is defined by one or more type\nprocessors registered to this node." +msgstr "Adapta tipos de pase de render a un cliente y renderizador. El comportamiento de\ncomo se adapta cada tipo de pase de render es definido por uno o mas procesadores\nde tipo registrados en este nodo." + +msgid "Causes upstream nodes to be dispatched multiple times in a range\nof contexts, each time with a different value for the `renderPass`\ncontext variable. Each value of `renderPass` is the name of a\nrender pass created from one or more RenderPasses nodes in the\nnetwork upstream of the `in` plug." +msgstr "Causa que los nodos anteriores se despachen multiples veces en un rango\nde contextos, cada vez con un valor diferente para la variable de contexto\n`renderPass`. Cada valor de `renderPass` es el nombre de un\npase de render creado desde uno o mas nodos RenderPasses en la\nred anterior al conector `in`." + +msgid "> Tip : Typically, a RenderPassWedge would be placed downstream of\n> your render node of choice, allowing render tasks to be dispatched\n> for each render pass." +msgstr "> Consejo: Tipicamente, un RenderPassWedge se colocaria despues de\n> tu nodo de render elegido, permitiendo que las tareas de render se despachen\n> para cada pase de render." + +msgid "Tasks can be varied per pass by using `${renderPass}` in an upstream\nSpreadsheet or NameSwitch's `selector` or through use of a\nContextQuery node or an expression." +msgstr "Las tareas pueden variarse por pase usando `${renderPass}` en el `selector`\nde un Spreadsheet o NameSwitch anterior, o mediante el uso de un\nnodo ContextQuery o una expresion." + +msgid "Specific passes can be disabled from wedging by setting the\n`renderPass:enabled` option to `False` in contexts where that render\npass name is the value of the `renderPass` context variable." +msgstr "Pases especificos pueden deshabilitarse del wedging estableciendo la\nopcion `renderPass:enabled` a `False` en contextos donde el nombre de ese\npase de render es el valor de la variable de contexto `renderPass`." + +msgid "Customisation\n-------------" +msgstr "Personalizacion\n---------------" + +msgid "The behaviour of the RenderPassWedge node can be customised by registering\nan adaptor that conditionally deletes, renames or disables passes. A common\nuse case is to conditionally enable passes on a per-shot basis according to\nthe presence or absence of particular assets within the scene." +msgstr "El comportamiento del nodo RenderPassWedge puede personalizarse registrando\nun adaptador que condicionalmente elimine, renombre o deshabilite pases. Un caso\nde uso comun es habilitar condicionalmente pases por plano segun la\npresencia o ausencia de activos particulares dentro de la escena." + +msgid "Adaptors should be registered using a client value of \"RenderPassWedge\" - for example :" +msgstr "Los adaptadores deben registrarse usando un valor de cliente \"RenderPassWedge\" - por ejemplo:" + +msgid "`GafferScene.SceneAlgo.registerRenderAdaptor( \"MyConditionalPassAdaptor\", adaptorCreationFunction, client = \"RenderPassWedge\" )`" +msgstr "`GafferScene.SceneAlgo.registerRenderAdaptor( \"MyConditionalPassAdaptor\", adaptorCreationFunction, client = \"RenderPassWedge\" )`" + +msgid "Appends render passes to the scene globals." +msgstr "Agrega pases de render a los globales de la escena." + +msgid "Render passes can be used to define named variations of a scene.\nThese can be rendered by dispatching a RenderPassWedge node downstream\nof your render node of choice, or written to disk by dispatching\na RenderPassWedge node downstream of a SceneWriter." +msgstr "Los pases de render pueden usarse para definir variaciones con nombre de una escena.\nEstos pueden renderizarse despachando un nodo RenderPassWedge despues\nde tu nodo de render elegido, o escribirse a disco despachando\nun nodo RenderPassWedge despues de un SceneWriter." + +msgid "Scenes can be varied per render pass based on the value of the\n`renderPass` context variable, which will contain the name of the\ncurrent render pass being dispatched. `${renderPass}` can be used\non the `selector` plug of Spreadsheet or NameSwitch nodes to choose\nspecific plug values or branches of the node graph per render pass,\nand its value can be queried using Expression or ContextQuery nodes." +msgstr "Las escenas pueden variarse por pase de render basandose en el valor de la\nvariable de contexto `renderPass`, que contendra el nombre del\npase de render actual siendo despachado. `${renderPass}` puede usarse\nen el conector `selector` de nodos Spreadsheet o NameSwitch para elegir\nvalores de conector especificos o ramas del grafo de nodos por pase de render,\ny su valor puede consultarse usando nodos Expression o ContextQuery." + +msgid "> Tip : The list of render passes is stored in the `renderPass:names`\n> option in the scene globals." +msgstr "> Consejo: La lista de pases de render se almacena en la opcion\n> `renderPass:names` en los globales de la escena." + +msgid "

Resamples the list of primitive variables in Names for either mesh, curves or point primitives.

" +msgstr "

Remuestrea la lista de variables primitivas en Nombres para primitivas de malla, curvas o puntos.

" + +msgid "

The reampling algorithm either expands or reduces each primitive variable's data based on the primitive type, primitive variable source interpolation and target interpolation as detailed in the tables below

" +msgstr "

El algoritmo de remuestreo expande o reduce los datos de cada variable primitiva basandose en el tipo de primitiva, la interpolacion de origen de la variable primitiva y la interpolacion objetivo como se detalla en las tablas siguientes

" + +msgid "

Mesh Primitive

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
source / targetConstantUniformVertexFaceVarying
Constant-copycopycopy
Uniformaverage-copycopy
Vertex / Varyingaveragepolygon average-copy
FaceVaryingaveragepolygon averagevertex average-
" +msgstr "

Primitiva de malla

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
origen / destinoConstantUniformVertexFaceVarying
Constant-copiarcopiarcopiar
Uniformpromedio-copiarcopiar
Vertex / Varyingpromediopromedio por poligono-copiar
FaceVaryingpromediopromedio por poligonopromedio por vertice-
" + +msgid "

Curves Primitive

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
source / targetConstantUniformVertexFaceVarying
Constant-copycopycopy
Uniformaverage-copycopy
Vertexaveragecurve average-evaluated
Varying / FaceVaryingaveragecurve averageevaluated-
" +msgstr "

Primitiva de curvas

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
origen / destinoConstantUniformVertexFaceVarying
Constant-copiarcopiarcopiar
Uniformpromedio-copiarcopiar
Vertexpromediopromedio por curva-evaluado
Varying / FaceVaryingpromediopromedio por curvaevaluado-
" + +msgid "

Points Primitive

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n " +msgstr "

Primitiva de puntos

\n
source / targetConstantUniformVertex / FaceVarying
Constant-copycopy
Uniformcopy-copy
Vertex / Varying / FaceVaryingaverageaverage-
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n " + +msgid "
origen / destinoConstantUniformVertex / FaceVarying
Constant-copiarcopiar
Uniformcopiar-copiar
Vertex / Varying / FaceVaryingpromediopromedio-
" +msgstr "" + +msgid "

evaluated : spline evaluated to approximate vertex or varying values

\n

copy : expand source values to target based on topology

\n

average : calculate the mean of the primitive variable (either for the whole primitive, for face / curve or vertex)

" +msgstr "

evaluado: spline evaluado para aproximar valores vertex o varying

\n

copiar: expandir valores de origen al destino basandose en la topologia

\n

promedio: calcular la media de la variable primitiva (ya sea para toda la primitiva, por cara/curva o vertice)

" + +msgid "Reverses the winding order of each face of a mesh; this has the effect\nof flipping the geometric normal. In Gaffer, a face is considered to\nbe front-facing if its vertices are wound in counter-clockwise order\nrelative to the viewer." +msgstr "Invierte el orden de bobinado de cada cara de una malla; esto tiene el efecto\nde voltear la normal geometrica. En Gaffer, una cara se considera\nfrontal si sus vertices estan bobinados en sentido antihorario\nrelativo al visor." + +msgid "Scatters points evenly over the surface of meshes.\nThis can be particularly useful in conjunction with\nthe Instancer, which can then apply instances to\neach point." +msgstr "Dispersa puntos uniformemente sobre la superficie de las mallas.\nEsto puede ser particularmente util en conjunto con\nel Instancer, que puede aplicar instancias a\ncada punto." + +msgid "Base class for nodes which modify individual scene\nlocations, but do not alter the hierarchy in any\nway." +msgstr "Clase base para nodos que modifican ubicaciones individuales de la escena, pero no alteran la jerarquia de\nninguna manera." + +msgid "The base type for all nodes which are capable of generating a\nhierarchical scene." +msgstr "El tipo base para todos los nodos capaces de generar una\nescena jerarquica." + +msgid "The base type for all nodes which take an input scene and process it in some way." +msgstr "El tipo base para todos los nodos que toman una escena de entrada y la procesan de alguna manera." + +msgid "The primary means of loading external assets (models, animation and cameras etc)\nfrom caches into Gaffer. Gaffer's native file format is the .scc (SceneCache) format\nprovided by Cortex, but Alembic and USD files are also supported. Other formats may be\nadded by registering a new implementation of Cortex's abstract SceneInterface." +msgstr "El medio principal para cargar activos externos (modelos, animacion y camaras, etc.)\ndesde caches a Gaffer. El formato nativo de Gaffer es el formato .scc (SceneCache)\nproporcionado por Cortex, pero tambien se soportan archivos Alembic y USD. Otros formatos pueden\nagregarse registrando una nueva implementacion de la interfaz abstracta SceneInterface de Cortex." + +msgid "Writes scenes to cache files on disk. Gaffer's native file format is the .scc\n(SceneCache) format provided by Cortex, but other formats may be supported by\nregistering a new implementation of Cortex's abstract SceneInterface." +msgstr "Escribe escenas a archivos de cache en disco. El formato nativo de Gaffer es el formato .scc\n(SceneCache) proporcionado por Cortex, pero otros formatos pueden soportarse\nregistrando una nueva implementacion de la interfaz abstracta SceneInterface de Cortex." + +msgid "Creates and edits sets of objects. Each set contains a list of paths\nto locations within the scene. After creation, sets can be used\nby the SetFilter to limit scene operations to only the members of\na particular set." +msgstr "Crea y edita conjuntos de objetos. Cada conjunto contiene una lista de rutas\na ubicaciones dentro de la escena. Despues de la creacion, los conjuntos pueden usarse\npor el SetFilter para limitar operaciones de la escena solo a los miembros de\nun conjunto particular." + +msgid "A filter which uses sets to define which locations are matched." +msgstr "Un filtro que usa conjuntos para definir que ubicaciones coinciden." + +msgid "Queries the set memberships of a location, and outputs a list of\nthe sets that it belongs to." +msgstr "Consulta las membresias de conjunto de una ubicacion, y produce una lista de\nlos conjuntos a los que pertenece." + +msgid "Visualises Set membership values by applying a custom shader and coloring\nbased on which sets each object belongs to. Membership of more than one set\nis visualised by a stripe pattern." +msgstr "Visualiza valores de membresia de conjunto aplicando un shader personalizado y coloreado\nbasandose en a que conjuntos pertenece cada objeto. La membresia en mas de un conjunto\nse visualiza con un patron de rayas." + +msgid "Loads shaders. Use a ShaderAssignment node to assign the shader to objects in the scene." +msgstr "Carga shaders. Usa un nodo ShaderAssignment para asignar el shader a los objetos en la escena." + +msgid "Assigns shaders to objects." +msgstr "Asigna shaders a los objetos." + +msgid "Generates scenes suitable for rendering shader balls." +msgstr "Genera escenas adecuadas para renderizar bolas de shader." + +msgid "Queries shader parameters from a scene location, creating outputs\nfor each parameter." +msgstr "Consulta parametros de shader de una ubicacion de escena, creando salidas\npara cada parametro." + +msgid "Represents a shader in the shader network that a ShaderTweaks node is modifying. Allows forming\nconnections from existing shaders to shaders that are being inserted." +msgstr "Representa un shader en la red de shaders que un nodo ShaderTweaks esta modificando. Permite formar\nconexiones desde shaders existentes a shaders que se estan insertando." + +msgid "ShuffleAttributes is used to copy or rename arbitrary numbers of attributes at\nthe filtered locations. The deleteSource plugs may be used to remove the original\nsource attribute(s) after the shuffling has been completed. The replaceDestination\nplugs may be used to specify whether each shuffle should replace already written\ndestination data with the same name." +msgstr "ShuffleAttributes se usa para copiar o renombrar cantidades arbitrarias de atributos en\nlas ubicaciones filtradas. Los conectores deleteSource pueden usarse para eliminar los\natributos de origen originales despues de completar la redistribucion. Los conectores\nreplaceDestination pueden usarse para especificar si cada redistribucion debe reemplazar\ndatos de destino ya escritos con el mismo nombre." + +msgid "An additional context variable `${source}` can be used on the destination plugs\nto insert the name of each source attribute. For example, to prefix all attributes\nwith `user:` set the source to `*` and the destination to `user:${source}`." +msgstr "Una variable de contexto adicional `${source}` puede usarse en los conectores de destino\npara insertar el nombre de cada atributo de origen. Por ejemplo, para prefijar todos los atributos\ncon `user:` establece el origen a `*` y el destino a `user:${source}`." + +msgid "Shuffles options in the scene globals by copying and/or renaming them." +msgstr "Redistribuye las opciones en los globales de la escena copiandolas y/o renombrandolas." + +msgid "ShufflePrimitiveVariables is used to copy or rename arbitrary numbers of primitive\nvariables at the filtered locations. The deleteSource plugs may be used to remove\nthe original source primitive variable(s) after the shuffling has been completed.\nThe replaceDestination plugs may be used to specify whether each shuffle should\nreplace already written destination data with the same name." +msgstr "ShufflePrimitiveVariables se usa para copiar o renombrar cantidades arbitrarias de variables\nprimitivas en las ubicaciones filtradas. Los conectores deleteSource pueden usarse para eliminar\nlas variables primitivas de origen originales despues de completar la redistribucion.\nLos conectores replaceDestination pueden usarse para especificar si cada redistribucion debe\nreemplazar datos de destino ya escritos con el mismo nombre." + +msgid "An additional context variable `${source}` can be used on the destination plugs\nto insert the name of each source primitive variable. For example, to append `ref`\nto all primitive variables set the source to `*` and the destination to `${source}ref`." +msgstr "Una variable de contexto adicional `${source}` puede usarse en los conectores de destino\npara insertar el nombre de cada variable primitiva de origen. Por ejemplo, para agregar `ref`\na todas las variables primitivas establece el origen a `*` y el destino a `${source}ref`." + +msgid "Shuffles render passes, allowing them to be copied and/or renamed." +msgstr "Redistribuye pases de render, permitiendo que se copien y/o renombren." + +msgid "An additional context variable `${source}` can be used on the destination plugs\nto insert the name of each source render pass. For example, to prefix all render\npasses with `test_` set the source to `*` and the destination to `test_${source}`." +msgstr "Una variable de contexto adicional `${source}` puede usarse en los conectores de destino\npara insertar el nombre de cada pase de render de origen. Por ejemplo, para prefijar todos los pases\nde render con `test_` establece el origen a `*` y el destino a `test_${source}`." + +msgid "Produces scenes containing a sphere." +msgstr "Produce escenas que contienen una esfera." + +msgid "Modifies the standard attributes on objects - these should\nbe respected by all renderers." +msgstr "Modifica los atributos estandar en los objetos - estos deben\nser respetados por todos los renderizadores." + +msgid "Specifies the standard options (global settings) for the\nscene. These should be respected by all renderers." +msgstr "Especifica las opciones estandar (configuracion global) para la\nescena. Estas deben ser respetadas por todos los renderizadores." + +msgid "A node for extracting a specific branch from a scene." +msgstr "Un nodo para extraer una rama especifica de una escena." + +msgid "Creates an object containing a polygon representation\nof an arbitrary string of text." +msgstr "Crea un objeto que contiene una representacion poligonal\nde una cadena de texto arbitraria." + +msgid "Applies a transformation to the local matrix\nof all locations matched by the filter." +msgstr "Aplica una transformacion a la matriz local\nde todas las ubicaciones que coincidan con el filtro." + +msgid "Queries a particular location in a scene and outputs the transform." +msgstr "Consulta una ubicacion particular en una escena y produce la transformacion." + +msgid "Gathering information about what UDIMs are present in meshes matching\nthe input scene and filter, and which meshes they belong to." +msgstr "Recopila informacion sobre que UDIMs estan presentes en mallas que coinciden\ncon la escena de entrada y el filtro, y a que mallas pertenecen." + +msgid "The output is a three level dictionary ( stored as CompoundObjects ), containing information about the selected UDIMs." +msgstr "La salida es un diccionario de tres niveles (almacenado como CompoundObjects), que contiene informacion sobre los UDIMs seleccionados." + +msgid "The keys of the top level are all the UDIMs containing part of the target meshes.\nThe keys of the second level are the meshes which touch that UDIM.\nThe keys of the third level are any attributes on that mesh which match extraAttributes, and the values of the third-level dictionary are the attribute values." +msgstr "Las claves del primer nivel son todos los UDIMs que contienen parte de las mallas objetivo.\nLas claves del segundo nivel son las mallas que tocan ese UDIM.\nLas claves del tercer nivel son cualquier atributo en esa malla que coincida con extraAttributes, y los valores del diccionario de tercer nivel son los valores de los atributos." + +msgid "An example result, with two udims, and \"attributes\" set to \"bake:resolution\", might look like this:" +msgstr "Un ejemplo de resultado, con dos UDIMs, y \"attributes\" establecido a \"bake:resolution\", podria verse asi:" + +msgid "```\n{\n \"1001\" : {\n \"/mesh1\" : { \"bake:resolution\", 512 },\n \"/mesh2\" : { \"bake:resolution\", 1024 },\n },\n \"1002\" : {\n \"/mesh1\" : { \"bake:resolution\", 512 },\n },\n}\n```" +msgstr "```\n{\n \"1001\" : {\n \"/mesh1\" : { \"bake:resolution\", 512 },\n \"/mesh2\" : { \"bake:resolution\", 1024 },\n },\n \"1002\" : {\n \"/mesh1\" : { \"bake:resolution\", 512 },\n },\n}\n```" + +msgid "Samples primitive variables from specified UV positions on\nthe surface of a source primitive, and transfers the\nvalues onto new primitive variables on the sampling object." +msgstr "Muestrea variables primitivas de posiciones UV especificadas en\nla superficie de una primitiva de origen, y transfiere los\nvalores a nuevas variables primitivas en el objeto de muestreo." + +msgid "Expands capsules created by Encapsulate back into regular scene hierarchy. This discards the\nperformance advantages of working with capsules, but is useful for debugging, or when it is\nnecessary to alter the internals of a capsule." +msgstr "Expande capsulas creadas por Encapsulate de vuelta a una jerarquia de escena regular. Esto descarta las\nventajas de rendimiento de trabajar con capsulas, pero es util para depuracion, o cuando es\nnecesario alterar los internos de una capsula." + +msgid "Combines several input filters, matching the union\nof all the locations matched by them." +msgstr "Combina varios filtros de entrada, coincidiendo con la union\nde todas las ubicaciones coincidentes." + +msgid "Creates a wireframe representation of a mesh. The wireframe\nis created as a CurvesPrimitive." +msgstr "Crea una representacion de alambre de una malla. El alambre\nse crea como CurvesPrimitive." + +msgid "Creates a scene with a single light in it." +msgstr "Crea una escena con una sola luz." + +msgid "Creates a scene with a single light filter in it." +msgstr "Crea una escena con un solo filtro de luz." + +msgid "Loads Test shaders. Use a ShaderAssignment node to assign the shader to objects in the scene." +msgstr "Carga shaders de prueba. Usa un nodo ShaderAssignment para asignar el shader a objetos en la escena." + +msgid "Dispatches tasks by spooling them to a renderfarm\nmanaged by Pixar's Tractor software." +msgstr "Despacha tareas enviandolas a una granja de render\ngestionada por el software Tractor de Pixar." + +msgid "This dispatcher deliberately provides a very simple\none-to-one mapping between Gaffer's nodes and plugs\nand Tractor's Tasks and attributes. This can be\ncustomised on a site-by-site basis with user defaults\nand expressions for the plugs, or for more complete\ncontrol, with TractorDispatcher.preSpoolSignal()." +msgstr "Este despachador deliberadamente proporciona un mapeo\nmuy simple uno a uno entre los nodos y conectores de Gaffer\ny las tareas y atributos de Tractor. Esto puede\npersonalizarse sitio por sitio con valores predeterminados de usuario\ny expresiones para los conectores, o para un control mas completo,\ncon TractorDispatcher.preSpoolSignal()." + +msgid "Convert points in a point cloud into instanced geometry. Assumes the point cloud matches the conventions of a USD PointInstancer." +msgstr "Convierte puntos en una nube de puntos en geometria instanciada. Asume que la nube de puntos coincide con las convenciones de un USD PointInstancer." + +msgid "Promoted instances are placed in a \"promoted\" group beside the point cloud. The corresponding points in the point cloud are deactivated by modifying the \"inactiveIds\" primitive variable, so downstream instancers won't expand them again." +msgstr "Las instancias promovidas se colocan en un grupo \"promoted\" junto a la nube de puntos. Los puntos correspondientes en la nube de puntos se desactivan modificando la variable primitiva \"inactiveIds\", para que los instanciadores posteriores no las expandan de nuevo." + +msgid "Authors attributes which have specific meaning in USD, but which\ndo not influence Gaffer's native behaviour in any way (in which\ncase they would belong on the StandardAttributes node)." +msgstr "Crea atributos que tienen significado especifico en USD, pero que\nno influyen en el comportamiento nativo de Gaffer de ninguna manera (en cuyo\ncaso pertenecerian al nodo StandardAttributes)." + +msgid "Takes two input scenes and writes a minimal USD file containing the\ndifferences between them. This new file can then be layered in a USD\ncomposition to transform the first scene into the second. This is useful for\nbaking modifications made in Gaffer into a USD file for consumption in other\nhosts." +msgstr "Toma dos escenas de entrada y escribe un archivo USD minimo que contiene las\ndiferencias entre ellas. Este nuevo archivo puede luego ser superpuesto en una composicion\nUSD para transformar la primera escena en la segunda. Esto es util para\nhornear modificaciones hechas en Gaffer en un archivo USD para su consumo en otros\nprogramas." + +msgid "A typical use case might be to share lookdev authored in Gaffer, with a\nworkflow like the following :" +msgstr "Un caso de uso tipico podria ser compartir lookdev creado en Gaffer, con un\nflujograma como el siguiente:" + +msgid "- A SceneReader brings `model.usd` into Gaffer.\n- Shaders and attributes are applied in Gaffer, using Gaffer's standard scene\n processing nodes.\n- A USDLayerWriter is used to bake this lookdev into a new `look.usd` layer on\n disk, with the SceneReader for `model.usd` connected to the `base` input\n and the lookdev connected into the `layer` input.\n- A new USD file is created that layers `look.usd` over `model.usd`. This is\n loaded into Gaffer or another host for lighting." +msgstr "- Un SceneReader trae `model.usd` a Gaffer.\n- Se aplican shaders y atributos en Gaffer, usando los nodos estandar de procesamiento\n de escena de Gaffer.\n- Se usa un USDLayerWriter para hornear este lookdev en una nueva capa `look.usd` en\n disco, con el SceneReader para `model.usd` conectado a la entrada `base`\n y el lookdev conectado a la entrada `layer`.\n- Se crea un nuevo archivo USD que superpone `look.usd` sobre `model.usd`. Este se\n carga en Gaffer u otro programa para iluminacion." + +msgid "> Note : To write a complete USD file (rather than a layer containing differences)\n> use the standard SceneWriter node." +msgstr "> Nota: Para escribir un archivo USD completo (en lugar de una capa que contenga diferencias)\n> usar el nodo SceneWriter estandar." + +msgid "Loads shaders from USD's `SdrRegistry`. This includes shaders such as `UsdPreviewSurface`\nand `UsdUVTexture`." +msgstr "Carga shaders del `SdrRegistry` de USD. Esto incluye shaders como `UsdPreviewSurface`\ny `UsdUVTexture`." + +msgid "This internal node is used to implement automatic translation of USD point instancers at render time.\nIt should never been by users, but DocumentationTest still complains if it isn't documented." +msgstr "Este nodo interno se usa para implementar la traduccion automatica de instanciadores de puntos USD en tiempo de render.\nNunca deberia ser visto por usuarios, pero DocumentationTest aun se queja si no esta documentado." + +msgid "Erodes or dilates a level set VDB." +msgstr "Erosiona o dilata un conjunto de nivel VDB." + +msgid "Converts a level set VDB object to a mesh primitive." +msgstr "Convierte un objeto VDB de conjunto de nivel a una primitiva de malla." + +msgid "Converts a mesh primitive to a level set VDB object." +msgstr "Convierte una primitiva de malla a un objeto VDB de conjunto de nivel." + +msgid "Converts a points grid in a VDB object to a points primitive." +msgstr "Convierte una cuadricula de puntos en un objeto VDB a una primitiva de puntos." + +msgid "Converts a points primitive to an OpenVDB level set." +msgstr "Convierte una primitiva de puntos a un conjunto de nivel OpenVDB." + +msgid "Creates a sphere level set." +msgstr "Crea un conjunto de nivel esferico." + +msgid "Scatter points according the voxel values of a VDB grid." +msgstr "Dispersa puntos segun los valores de voxel de una cuadricula VDB." + +msgid "Solid" +msgstr "Sólido" + +msgid "Frustum Scale" +msgstr "Escala de frustum" + +msgid "Other Scale" +msgstr "Otra escala" + +msgid "Shading" +msgstr "Sombreado" + +msgid "Expand Selection" +msgstr "Expandir selección" + +msgid "Expand Selection Fully" +msgstr "Expandir selección completamente" + +msgid "Collapse Selection" +msgstr "Contraer selección" + +msgid "Expand All" +msgstr "Expandir todo" + +msgid "Preview" +msgstr "Previsualización" + +msgid "Preview with Guides" +msgstr "Previsualización con guías" + +msgid "From Scene" +msgstr "Desde la escena" + +msgid "Meshes" +msgstr "Mallas" + +msgid "Capsules" +msgstr "Cápsulas" + +msgid "Procedurals" +msgstr "Procedurales" + +msgid "Side" +msgstr "Lateral" + +msgid "Browse..." +msgstr "Explorar..." + +msgid "Camera Settings" +msgstr "Ajustes de cámara" + +msgid "Gadgets" +msgstr "Grafetos" + +msgid "Show Grid" +msgstr "Mostrar cuadrícula" + +msgid "Show Gnomon" +msgstr "Mostrar gnomon" + +msgid "Show Inspector" +msgstr "Mostrar inspector" + +msgid "Show FPS" +msgstr "Mostrar FPS" + +msgid "Fit To Selection" +msgstr "Ajustar a la selección" + +msgid "Fit To Scene" +msgstr "Ajustar a la escena" + +msgid "Snapshot to Catalogue" +msgstr "Captura al catálogo" + +msgid "No Catalogues Available" +msgstr "No hay catálogos disponibles" + +msgid "Viewport snapshots are only available for rendered (non-OpenGL) previews." +msgstr "Las capturas del visor solo están disponibles para previsualizaciones renderizadas (no OpenGL)." + +msgid "Snapshot viewport and send to catalogue." +msgstr "Capturar visor y enviar al catálogo." + +msgid "Visibility and Pruning" +msgstr "Visibilidad y poda" + +msgid "Hide" +msgstr "Ocultar" + +msgid "Unhide" +msgstr "Mostrar" + +msgid "# Visibility" +msgstr "# Visibilidad" + +msgid "Defines what is visible in the viewport." +msgstr "Define lo que es visible en el visor." + +msgid "## Actions" +msgstr "## Acciones" + +msgid "click to toggle shading to" +msgstr "clic para alternar el sombreado a" + +msgid "Shortcut" +msgstr "Atajo" + +msgid "Vertex Index" +msgstr "Índice de vértice" + +msgid "Face or Curve Index" +msgstr "Índice de cara o curva" + +msgid "Instance" +msgstr "Instancia" + +msgid "Angle Extent" +msgstr "Extensión angular" + +msgid "Arnold Light Filter Filter" +msgstr "Filtro de luz Arnold" + +msgid "Arnold Surface" +msgstr "Superficie Arnold" + +msgid "Clearcoat" +msgstr "Barniz" + +msgid "Clearcoat Roughness" +msgstr "Rugosidad de barniz" + +msgid "Cone Softness" +msgstr "Suavidad del cono" + +msgid "Cycles Surface" +msgstr "Superficie Cycles" + +msgid "Diffuse Roughness" +msgstr "Rugosidad difusa" + +msgid "Emissive Color" +msgstr "Color emisivo" + +msgid "Enable Temperature" +msgstr "Activar temperatura" + +msgid "IColor" +msgstr "Color I" + +msgid "Light Color" +msgstr "Color de luz" + +msgid "Metallness" +msgstr "Metalicidad" + +msgid "RenderMan Light" +msgstr "Luz RenderMan" + +msgid "Shadow Distance" +msgstr "Distancia de sombra" + +msgid "Shadow Enable" +msgstr "Activar sombra" + +msgid "Shadow Falloff" +msgstr "Atenuación de sombra" + +msgid "Shadow Falloff Gamma" +msgstr "Gamma de atenuación de sombra" + +msgid "Shaping Cone Angle" +msgstr "Ángulo de cono de perfilado" + +msgid "Shaping Cone Softness" +msgstr "Suavidad de cono de perfilado" + +msgid "Shaping Focus" +msgstr "Enfoque de perfilado" + +msgid "Shaping Focus Tint" +msgstr "Tinte de enfoque de perfilado" + +msgid "Shaping Ies Angle Scale" +msgstr "Escala de ángulo IES de perfilado" + +msgid "Shaping Ies File" +msgstr "Archivo IES de perfilado" + +msgid "Shaping Ies Normalize" +msgstr "Normalizar IES de perfilado" + +msgid "Specular Color" +msgstr "Color especular" + +msgid "Specular Roughness" +msgstr "Rugosidad especular" + +msgid "Specular Tint" +msgstr "Tinte especular" + +msgid "Subsurface" +msgstr "Subsuperficie" + +msgid "Subsurface Color" +msgstr "Color de subsuperficie" + +msgid "Subsurface Radius" +msgstr "Radio de subsuperficie" + +msgid "Texture File" +msgstr "Archivo de textura" + +msgid "Texture Format" +msgstr "Formato de textura" + +msgid "USD Surface" +msgstr "Superficie USD" + +msgid "Use Specular Workflow" +msgstr "Usar flujograma especular" + +msgid "length" +msgstr "longitud" + +msgid "{} plugs on {} nodes" +msgstr "{} conectores en {} nodos" + +msgid "{} plugs" +msgstr "{} conectores" + +msgid "SelectionTool" +msgstr "Herramienta de selección" + +msgid "TranslateTool" +msgstr "Herramienta de traslación" + +msgid "RotateTool" +msgstr "Herramienta de rotación" + +msgid "ScaleTool" +msgstr "Herramienta de escala" + +msgid "CameraTool" +msgstr "Herramienta de cámara" + +msgid "CropWindowTool" +msgstr "Herramienta de recorte" + +msgid "LightTool" +msgstr "Herramienta de luz" + +msgid "LightPositionTool" +msgstr "Herramienta de posición de luz" + +msgid "VisualiserTool" +msgstr "Herramienta de visualización" + +msgid "ImageSelectionTool" +msgstr "Herramienta de selección de imagen" + +msgid "Tool for selecting objects." +msgstr "Herramienta para seleccionar objetos." + +msgid "Tool for editing object translation." +msgstr "Herramienta para editar la traslación de objetos." + +msgid "Tool for editing object rotation." +msgstr "Herramienta para editar la rotación de objetos." + +msgid "Tool for editing object scale." +msgstr "Herramienta para editar la escala de objetos." + +msgid "Tool for moving the current camera. Use the Camera dropdown menu\nin the upper toolbar to choose a camera or light to look through\nand edit." +msgstr "Herramienta para mover la cámara actual. Usa el menú desplegable de cámara\nen la barra superior para elegir una cámara o luz a través de la cual mirar\ny editar." + +msgid "Tool for adjusting crop window for rendering. The crop window is displayed as a\nmasked area which can be adjusted using drag and drop.\n\nNote that the view must be locked to a render camera for this tool to be used.\nAdditionally, an upstream node must be capable of setting the crop window so\nthat there is something to adjust - typically this will be a StandardOptions\nnode. The name of the plug being manipulated is displayed underneath the\ncropped area - it can be used to verify that the expected node is being adjusted." +msgstr "Herramienta para ajustar la ventana de recorte del render. La ventana de recorte se muestra como un\nárea enmascarada que puede ajustarse arrastrando y soltando.\n\nLa vista debe estar fijada a una cámara de render para usar esta herramienta.\nAdemás, un nodo anterior debe ser capaz de establecer la ventana de recorte para\nque haya algo que ajustar - típicamente será un nodo StandardOptions.\nEl nombre del conector manipulado se muestra debajo del\nárea recortada - puede usarse para verificar que se está ajustando el nodo esperado." + +msgid "Tool for editing light shapes, such as spot light cones or quad light width and height." +msgstr "Herramienta para editar formas de luz, como conos de foco o ancho y alto de luz cuádruple." + +msgid "Tool for placing lights." +msgstr "Herramienta para posicionar luces." + +msgid "Tool for displaying object data." +msgstr "Herramienta para mostrar datos de objetos." + +msgid "Base class for tools that edit object transforms." +msgstr "Clase base para herramientas que editan transformaciones de objetos." + +msgid "Tool for selecting objects.\n\n- Click or drag to set selection\n- Shift-click or shift-drag to add to selection\n- Drag and drop selected objects\n\t- Drag to Python Editor to get their names\n\t- Drag to PathFilter or Set node to add/remove their paths" +msgstr "Herramienta para seleccionar objetos.\n\n- Clic o arrastrar para establecer selección\n- Shift-clic o shift-arrastrar para agregar a la selección\n- Arrastrar y soltar objetos seleccionados\n\t- Arrastrar al editor Python para obtener sus nombres\n\t- Arrastrar a PathFilter o nodo Set para agregar/eliminar sus rutas" + +msgid "Tool for selecting objects based on image data. Requires one of the following :\n\n- An `id` image layer with associated render manifest (enabled using the StandardOptions node).\n- An ObjectID Cryptomatte image.\n- An `instanceID` image layer.\n\nSupports the same interactions as the 3D scene selection tool:\n\n- Click or drag to set selection\n- Shift-click or shift-drag to add to selection\n- Drag and drop selected objects\n\t- Drag to Python Editor to get their names\n\t- Drag to PathFilter or Set node to add/remove their paths" +msgstr "Herramienta para seleccionar objetos basándose en datos de imagen. Requiere uno de los siguientes:\n\n- Una capa de imagen `id` con manifiesto de render asociado (habilitado con el nodo StandardOptions).\n- Una imagen Cryptomatte ObjectID.\n- Una capa de imagen `instanceID`.\n\nSoporta las mismas interacciones que la herramienta de selección de escena 3D:\n\n- Clic o arrastrar para establecer selección\n- Shift-clic o shift-arrastrar para agregar a la selección\n- Arrastrar y soltar objetos seleccionados\n\t- Arrastrar al editor Python para obtener sus nombres\n\t- Arrastrar a PathFilter o nodo Set para agregar/eliminar sus rutas" + +msgid "Hold 'V' and click to snap to geometry" +msgstr "Pulsar 'V' y hacer clic para ajustar a la geometría" + +msgid "Hold 'V' and click to aim at target" +msgstr "Pulsar 'V' y hacer clic para apuntar al objetivo" + +msgid "Hold 'Shift' + 'V' to place shadow pivot" +msgstr "Pulsar 'Shift' + 'V' para colocar el pivote de sombra" + +msgid "Hold 'V' to place shadow target" +msgstr "Pulsar 'V' para colocar el objetivo de sombra" + +msgid "Hold 'V' to place highlight target" +msgstr "Pulsar 'V' para colocar el objetivo de brillo especular" + +msgid "Hold 'V' to place diffuse target" +msgstr "Pulsar 'V' para colocar el objetivo difuso" + +msgid "Transforming {0} using {1}" +msgstr "Transformando {0} usando {1}" + +msgid "Selection not editable" +msgstr "Selección no editable" + +msgid "{} warnings" +msgstr "{} advertencias" + +msgid "Reset" +msgstr "Restablecer" + +msgid "plugs" +msgstr "conectores" + +msgid "Click to toggle to/from default value" +msgstr "Hacer clic para alternar al/desde el valor predeterminado" + +msgid "Applies an exposure adjustment to the image." +msgstr "Aplica un ajuste de exposición a la imagen." + +msgid "Highlights the regions in which the colour values go above 1 or below 0." +msgstr "Resalta las regiones en las que los valores de color superan 1 o están por debajo de 0." + +msgid "Applies a gamma correction to the image." +msgstr "Aplica una corrección de gamma a la imagen." + +msgid "Converts negative values to positive." +msgstr "Convierte valores negativos a positivos." + +msgid "The colour transform used for correcting the Viewer output for display." +msgstr "La transformación de color utilizada para corregir la salida del visor para la pantalla." + +msgid "Defines what types of objects are selectable in the viewport." +msgstr "Define qué tipos de objetos son seleccionables en el visor." + +msgid "Output Index" +msgstr "Índice de salida" + +msgid "Columns" +msgstr "Columnas" + +msgid "Source" +msgstr "Origen" + +msgid "Value" +msgstr "Valor" + +msgid "

Name

" +msgstr "

Nombre

" + +msgid "

Location

" +msgstr "

Ubicación

" + +msgid "

Pointcloud

" +msgstr "

Nube de puntos

" + +msgid "

Transform

" +msgstr "

Transformación

" + +msgid "Extrapolation" +msgstr "Extrapolación" + +msgid "Find Bookmark" +msgstr "Buscar marcador" + +msgid "Annotations" +msgstr "Anotaciones" + +msgid "Unable to edit plugs with mixed types" +msgstr "No es posible editar conectores con tipos mixtos" + +msgid "Move to Section" +msgstr "Mover a sección" + +msgid "

Default

" +msgstr "

Predeterminado

" + +msgid "Caution : filtering deep images is expensive" +msgstr "Atención: filtrar imágenes profundas es costoso" + +msgid "Create Proxy" +msgstr "Crear proxy" + +msgid "Load Shader" +msgstr "Cargar shader" + +msgid "Select Shader Parameters" +msgstr "Seleccionar parámetros de shader" + +msgid "Select Shader" +msgstr "Seleccionar shader" + +msgid "Shader Preview Scene" +msgstr "Escena de previsualización de shader" + +msgid "ShaderView Settings" +msgstr "Ajustes de ShaderView" + +msgid "

Source

" +msgstr "

Origen

" + +msgid "

Destination

" +msgstr "

Destino

" + +msgid "

Delete Source

" +msgstr "

Eliminar origen

" + +msgid "

Replace

" +msgstr "

Reemplazar

" + +msgid "Unable to edit multiple plugs of this type" +msgstr "No es posible editar múltiples conectores de este tipo" + +msgid "label" +msgstr "etiqueta" + +msgid "The sets to query." +msgstr "Conjuntos que se consultan." + +msgid "Depth for near clip." +msgstr "Profundidad del recorte cercano." + +msgid "The input image data." +msgstr "Los datos de la imagen de entrada." + +msgid "The size of the cube." +msgstr "El tamaño del cubo." + +msgid "The name of the grid." +msgstr "El nombre de la cuadrícula." + +msgid "Radius of the sphere." +msgstr "Radio de la esfera." + +msgid "Name of view to select" +msgstr "Nombre de la vista a seleccionar" + +msgid "For internal use only." +msgstr "Solo para uso interno." + +msgid "The view to be sampled." +msgstr "Vista que se muestrea." + +msgid "The colour of the text." +msgstr "El color del texto." + +msgid "The view to be queried." +msgstr "Vista que se consulta." + +msgid "Legacy plug. Do not use." +msgstr "Conector obsoleto. No utilizar." + +msgid "The result of the query." +msgstr "El resultado de la consulta." + +msgid "The view to be analysed." +msgstr "Vista que se analiza." + +msgid "The image to be sampled." +msgstr "Imagen que se muestrea." + +msgid "The text to be rendered." +msgstr "Texto que se renderiza." + +msgid "The string to be tested." +msgstr "Cadena que se evalúa." + +msgid "The scene to be written." +msgstr "Escena que se escribe." + +msgid "The scene to be rendered." +msgstr "Escena que se renderiza." + +msgid "The colour of the shadow." +msgstr "El color de la sombra." + +msgid "Turns the node on and off." +msgstr "Activa y desactiva el nodo." + +msgid "The image to compare with." +msgstr "La imagen con la que comparar." + +msgid "The shader to be rendered." +msgstr "El shader a renderizar." + +msgid "A deep or flat image input." +msgstr "Una entrada de imagen profunda o plana." + +msgid "Hides sets with no members." +msgstr "Oculta conjuntos sin miembros." + +msgid "The bit depth of the image." +msgstr "La profundidad de bits de la imagen." + +msgid "Where the script is stored." +msgstr "Dónde se almacena el script." + +msgid "The transform to be applied." +msgstr "Transformación aplicada." + +msgid "The variables to be deleted." +msgstr "Variables que se eliminan." + +msgid "Invert the result transform." +msgstr "Invertir la transformación resultante." + +msgid "The colour of the rectangle." +msgstr "El color del rectángulo." + +msgid "How the shader is to be used." +msgstr "Cómo se utilizará el shader." + +msgid "The final result of the loop." +msgstr "El resultado final del bucle." + +msgid "Curve span has in key's value." +msgstr "El tramo de curva tiene el valor de la clave de entrada." + +msgid "The scene to query UDIMs from." +msgstr "La escena de la cual consultar UDIMs." + +msgid "The OpenColorIO config to use." +msgstr "La configuración de OpenColorIO a utilizar." + +msgid "Tangent slopes are kept equal." +msgstr "Las pendientes de tangentes se mantienen iguales." + +msgid "Curve span has out key's value." +msgstr "El tramo de curva tiene el valor de la clave de salida." + +msgid "Curve is repeated indefinitely." +msgstr "La curva se repite indefinidamente." + +msgid "The input image to be analysed." +msgstr "Imagen de entrada que se analiza." + +msgid "The number of copies to be made." +msgstr "Número de copias que se realizan." + +msgid "The image to be written to disk." +msgstr "Imagen que se escribe en disco." + +msgid "The space to query the bound in." +msgstr "El espacio en el que consultar los límites." + +msgid "The outputs defined by this node." +msgstr "Las salidas definidas por este nodo." + +msgid "Messages from the render process." +msgstr "Mensajes del proceso de render." + +msgid "The name of the image to extract." +msgstr "El nombre de la imagen a extraer." + +msgid "The space to query the transform." +msgstr "El espacio en el que consultar la transformación." + +msgid "Curve is extended as a flat line." +msgstr "La curva se extiende como una línea plana." + +msgid "The scene to query the shader for." +msgstr "La escena en la que consultar el shader." + +msgid "The scene to query the bounds for." +msgstr "La escena en la que consultar los límites." + +msgid "A pass-through of the input image." +msgstr "Un paso directo de la imagen de entrada." + +msgid "The end frame of the masked range." +msgstr "El fotograma final del rango enmascarado." + +msgid "The name of the variable to query." +msgstr "Nombre de la variable que se consulta." + +msgid "The transform applied to the grid." +msgstr "La transformación aplicada a la cuadrícula." + +msgid "Specifies which lights to convert." +msgstr "Especifica qué luces convertir." + +msgid "The last frame of motion tracking." +msgstr "El último fotograma del seguimiento de movimiento." + +msgid "The amount to offset the image by." +msgstr "Cantidad de desplazamiento aplicado a la imagen." + +msgid "The scene to query the filter for." +msgstr "La escena en la que consultar el filtro." + +msgid "The first frame of motion tracking." +msgstr "El primer fotograma del seguimiento de movimiento." + +msgid "Size vector of the requested bound." +msgstr "Vector de tamaño del límite solicitado." + +msgid "Applies a rank filter to the image." +msgstr "Aplica un filtro de rango a la imagen." + +msgid "The name of the parameter to query." +msgstr "Nombre del parámetro que se consulta." + +msgid "Turns the backup system on and off." +msgstr "Activa y desactiva el sistema de copias de seguridad." + +msgid "The scene to query the camera from." +msgstr "La escena de la cual consultar la cámara." + +msgid "The scene to look for variables in." +msgstr "La escena en la que buscar variables." + +msgid "Multiplies the current frame value." +msgstr "Multiplica el valor del fotograma actual." + +msgid "Sphere radius in object space units." +msgstr "Radio de la esfera en unidades de espacio de objeto." + +msgid "The start frame of the masked range." +msgstr "El fotograma inicial del rango enmascarado." + +msgid "The location to query for existence." +msgstr "Ubicación que se consulta para verificar su existencia." + +msgid "The scene to query the options from." +msgstr "La escena de la cual consultar las opciones." + +msgid "Specify the look transform direction" +msgstr "Especificar la dirección de la transformación de apariencia" + +msgid "The size of the displayWindow as V2i." +msgstr "El tamaño del displayWindow como V2i." + +msgid "Format options specific to SGI files." +msgstr "Opciones de formato específicas para archivos SGI." + +msgid "The scale factor to apply to vectors." +msgstr "Factor de escala aplicado a los vectores." + +msgid "Format options specific to DPX files." +msgstr "Opciones de formato específicas para archivos DPX." + +msgid "The scene to query the attribute for." +msgstr "La escena en la que consultar el atributo." + +msgid "Format options specific to IFF files." +msgstr "Opciones de formato específicas para archivos IFF." + +msgid "Opt in or out of bounds calculations." +msgstr "Activar o desactivar los cálculos de límites." + +msgid "Hardcoded for ShaderTweakProxy nodes." +msgstr "Codificado para nodos ShaderTweakProxy." + +msgid "Format options specific to PNG files." +msgstr "Opciones de formato específicas para archivos PNG." + +msgid "The scene to query the transform for." +msgstr "La escena en la que consultar la transformación." + +msgid "The child hierarchies to be parented." +msgstr "Las jerarquías secundarias a emparentar." + +msgid "Format options specific to RLA files." +msgstr "Opciones de formato específicas para archivos RLA." + +msgid "Format options specific to WebP files." +msgstr "Opciones de formato específicas para archivos WebP." + +msgid "The value to be given to the variable." +msgstr "El valor a asignar a la variable." + +msgid "Generated automatically - do not edit." +msgstr "Generado automáticamente - no editar." + +msgid "Format options specific to Jpeg files." +msgstr "Opciones de formato específicas para archivos Jpeg." + +msgid "Format options specific to FITS files." +msgstr "Opciones de formato específicas para archivos FITS." + +msgid "The parameters for the colour manager." +msgstr "Los parámetros del gestor de color." + +msgid "4x4 matrix of the requested transform." +msgstr "Matriz 4x4 de la transformación solicitada." + +msgid "The name of the VDB file to be loaded." +msgstr "El nombre del archivo VDB a cargar." + +msgid "The colour to use for drawing vectors." +msgstr "El color a utilizar para dibujar vectores." + +msgid "Format options specific to TIFF files." +msgstr "Opciones de formato específicas para archivos TIFF." + +msgid "The name of the variable to be created." +msgstr "Nombre de la variable que se crea." + +msgid "Enables the location for access in OSL." +msgstr "Activa la ubicación para acceso en OSL." + +msgid "Format options specific to Targa files." +msgstr "Opciones de formato específicas para archivos Targa." + +msgid "Deprecated. Use `filter` input instead." +msgstr "Obsoleto. Utilizar la entrada `filter` en su lugar." + +msgid "The source of the options to be copied." +msgstr "El origen de las opciones a copiar." + +msgid "Controls the size of the backdrop text." +msgstr "Controla el tamaño del texto de fondo." + +msgid "Transformation applied to the rectangle." +msgstr "Transformación aplicada al rectángulo." + +msgid "The device to render the shader ball on." +msgstr "El dispositivo en el que renderizar la esfera de shader." + +msgid "The initial starting point for the loop." +msgstr "El punto de partida inicial del bucle." + +msgid "The output image generated by this node." +msgstr "La imagen de salida generada por este nodo." + +msgid "Outputs the value returned by the query." +msgstr "Genera el valor devuelto por la consulta." + +msgid "A direct pass-through of the input scene." +msgstr "Un paso directo de la escena de entrada." + +msgid "Specifies the size of the displayed text." +msgstr "Especifica el tamaño del texto mostrado." + +msgid "Path to the closest ancestor that exists." +msgstr "Ruta al ancestro más cercano que existe." + +msgid "Format options specific to OpenEXR files." +msgstr "Opciones de formato específicas para archivos OpenEXR." + +msgid "The name of the Cryptomatte layer to use." +msgstr "El nombre de la capa de Cryptomatte a utilizar." + +msgid "The client to adapt render pass types to." +msgstr "El cliente al que adaptar los tipos de pase de render." + +msgid "Scaling component of requested transform." +msgstr "Componente de escala de la transformación solicitada." + +msgid "Format options specific to Field3D files." +msgstr "Opciones de formato específicas para archivos Field3D." + +msgid "Name of the level set grid to be created." +msgstr "Nombre de la cuadrícula de conjunto de nivel que se crea." + +msgid "The view within the image to be converted." +msgstr "Vista dentro de la imagen que se convierte." + +msgid "Format options specific to Jpeg2000 files." +msgstr "Opciones de formato específicas para archivos Jpeg2000." + +msgid "The image which contains the mask channel." +msgstr "La imagen que contiene el canal de máscara." + +msgid "Defines the camera used to view the scene." +msgstr "Define la cámara utilizada para ver la escena." + +msgid "Center point vector of the requested bound." +msgstr "Vector del punto central del límite solicitado." + +msgid "The renderer to adapt render pass types to." +msgstr "El renderizador al que adaptar los tipos de pase de render." + +msgid "The center of the data window of the image." +msgstr "El centro de la ventana de datos de la imagen." + +msgid "Make the local coordinate frame left handed" +msgstr "Hacer el sistema de coordenadas local zurdo" + +msgid "The data type to be written to the SGI file." +msgstr "Tipo de dato escrito en el archivo SGI." + +msgid "Specifies the OpenColorIO config to be used." +msgstr "Especifica la configuración de OpenColorIO que se utiliza." + +msgid "The radius of the disk to blur by in pixels." +msgstr "El radio del disco de desenfoque en píxeles." + +msgid "True if the given primitive variable exists." +msgstr "Verdadero si la variable primitiva indicada existe." + +msgid "The object to be placed in the output scene." +msgstr "Objeto que se coloca en la escena de salida." + +msgid "The image to copy the metadata entries from." +msgstr "La imagen de la cual copiar las entradas de metadatos." + +msgid "The interpolation type to apply to the mesh." +msgstr "Tipo de interpolación aplicado a la malla." + +msgid "The data type to be written to the DPX file." +msgstr "Tipo de dato escrito en el archivo DPX." + +msgid "The name of the primitive variable to query." +msgstr "Nombre de la variable primitiva que se consulta." + +msgid "The data type to be written to the RLA file." +msgstr "Tipo de dato escrito en el archivo RLA." + +msgid "The rotation order of the input euler angles." +msgstr "El orden de rotación de los ángulos de Euler de entrada." + +msgid "The gradient of colour used to draw the ramp." +msgstr "El degradado de color utilizado para dibujar la rampa." + +msgid "The offset of the shadow, measured in pixels." +msgstr "El desplazamiento de la sombra, medido en píxeles." + +msgid "The width of the outline, measured in pixels." +msgstr "El ancho del contorno, medido en píxeles." + +msgid "Swaps which elements are tweaked/not tweaked." +msgstr "Intercambia qué elementos se ajustan y cuáles no." + +msgid "The data type to be written to the TIFF file." +msgstr "Tipo de dato escrito en el archivo TIFF." + +msgid "Translation component of requested transform." +msgstr "Componente de traslación de la transformación solicitada." + +msgid "The data type to be written to the FITS file." +msgstr "Tipo de dato escrito en el archivo FITS." + +msgid "The names of the four channels to be sampled." +msgstr "Nombres de los cuatro canales que se muestrean." + +msgid "Turns the rendering on and off, or pauses it." +msgstr "Activa, desactiva o pausa el renderizado." + +msgid "Outputs the value of the specified attribute." +msgstr "Genera el valor del atributo especificado." + +msgid "Specifies the working color space to be used." +msgstr "Especifica el espacio de color de trabajo a utilizar." + +msgid "Clamps input values so they don't go below 0." +msgstr "Limita los valores de entrada para que no sean menores que 0." + +msgid "Width of the signed distance field in voxels." +msgstr "Ancho del campo de distancia con signo en vóxeles." + +msgid "The name of the clipping plane to be created." +msgstr "Nombre del plano de recorte que se crea." + +msgid "An additional multiplier on the output values." +msgstr "Un multiplicador adicional sobre los valores de salida." + +msgid "The location to query the set memberships for." +msgstr "La ubicación para la cual consultar las membresías de conjuntos." + +msgid "The rotation order of the output euler angles." +msgstr "El orden de rotación de los ángulos de Euler de salida." + +msgid "The names of the four channels to be analysed." +msgstr "Los nombres de los cuatro canales a analizar." + +msgid "Defines the scene used for the shader preview." +msgstr "Define la escena utilizada para la previsualización de shader." + +msgid "Used to enable/disable this shuffle operation." +msgstr "Se utiliza para activar/desactivar esta operación de reorganización." + +msgid "Apply the inverse transformation to the image." +msgstr "Aplicar la transformación inversa a la imagen." + +msgid "Clamps output values so they don't go above 1." +msgstr "Limita los valores de salida para que no superen 1." + +msgid "Slope for the ASC CDL color correction formula." +msgstr "Pendiente para la fórmula de corrección de color ASC CDL." + +msgid "Defines how the scene is drawn in the viewport." +msgstr "Define cómo se dibuja la escena en el visor." + +msgid "The scene to query the primitive variable from." +msgstr "La escena de la cual consultar la variable primitiva." + +msgid "Power for the ASC CDL color correction formula." +msgstr "Potencia para la fórmula de corrección de color ASC CDL." + +msgid "The scene from which the attributes are copied." +msgstr "La escena de la cual se copian los atributos." + +msgid "The path to the external procedural or archive." +msgstr "La ruta al procedural externo o archivo." + +msgid "The integer coordinates of the pixel to sample." +msgstr "Coordenadas enteras del píxel que se muestrea." + +msgid "Target interpolation for the primitive variables" +msgstr "Interpolación objetivo para las variables primitivas" + +msgid "Outputs a random choice from the `choices` plug." +msgstr "Genera una elección aleatoria del conector `choices`." + +msgid "The size of the plane in the X and Y directions." +msgstr "El tamaño del plano en las direcciones X e Y." + +msgid "An additional offset added to the output values." +msgstr "Un desplazamiento adicional añadido a los valores de salida." + +msgid "How often backups are made, measured in minutes." +msgstr "Con qué frecuencia se realizan copias de seguridad, medido en minutos." + +msgid "Offset for the ASC CDL color correction formula." +msgstr "Desplazamiento para la fórmula de corrección de color ASC CDL." + +msgid "The data type to be written to the Field3D file." +msgstr "Tipo de dato escrito en el archivo Field3D." + +msgid "Space separated list of set names to be removed." +msgstr "Lista de nombres de conjuntos a eliminar, separados por espacios." + +msgid "The name of the primitive vairable to check for." +msgstr "El nombre de la variable primitiva a verificar." + +msgid "The scene to be searched for matching locations." +msgstr "La escena en la que buscar ubicaciones coincidentes." + +msgid "Defines how the scene is shaded in the viewport." +msgstr "Define cómo se sombrean las escenas en el visor." + +msgid "Controls how lights are presented in the Viewer." +msgstr "Controla cómo se presentan las luces en el visor." + +msgid "The image which will be evaluated for each layer." +msgstr "La imagen que se evaluará para cada capa." + +msgid "The method used to define the input orientations." +msgstr "El método utilizado para definir las orientaciones de entrada." + +msgid "A pair of option name to query and default value." +msgstr "Un par de nombre de opción a consultar y valor predeterminado." + +msgid "A blur applied to the shadow, measured in pixels." +msgstr "Un desenfoque aplicado a la sombra, medido en píxeles." + +msgid "Enables the constraint in the world space y axis." +msgstr "Activa la restricción en el eje Y del espacio mundial." + +msgid "Turns on clamping for values below the min value." +msgstr "Activa la limitación para valores por debajo del valor mínimo." + +msgid "The value to output if the option does not exist." +msgstr "El valor a generar si la opción no existe." + +msgid "Turns on clamping for values above the max value." +msgstr "Activa la limitación para valores por encima del valor máximo." + +msgid "Enables the constraint in the world space x axis." +msgstr "Activa la restricción en el eje X del espacio mundial." + +msgid "Overrides the `{option}` option:\\n\\n{description}" +msgstr "Sobrescribe la opción `{option}`:\\n\\n{description}" + +msgid "The colour of half of the squares of the pattern." +msgstr "El color de la mitad de los cuadrados del patrón." + +msgid "Enables the constraint in the world space z axis." +msgstr "Activa la restricción en el eje Z del espacio mundial." + +msgid "The data type to be written to the Jpeg2000 file." +msgstr "Tipo de dato escrito en el archivo Jpeg2000." + +msgid "The image to be converted into a points primitive." +msgstr "Imagen que se convierte en una primitiva de puntos." + +msgid "Adjusts vTangent to be orthogonal to the uTangent." +msgstr "Ajusta vTangent para que sea ortogonal a uTangent." + +msgid "Applies Arnold attributes to objects in the scene." +msgstr "Aplica atributos de Arnold a los objetos de la escena." + +msgid "The label displayed when the type is set to custom." +msgstr "La etiqueta mostrada cuando el tipo es personalizado." + +msgid "The value to output if the variable does not exist." +msgstr "El valor a generar si la variable no existe." + +msgid "A constant depth value to place the whole image at." +msgstr "Un valor de profundidad constante en el que colocar toda la imagen." + +msgid "A pair of variable name to query and default value." +msgstr "Un par de nombre de variable a consultar y valor predeterminado." + +msgid "Outputs true if the option exists, otherwise false." +msgstr "Genera verdadero si la opción existe, de lo contrario falso." + +msgid "Hides sets with no selected members or descendants." +msgstr "Oculta conjuntos sin miembros o descendientes seleccionados." + +msgid "Where the parameters for the shader are represented." +msgstr "Dónde se representan los parámetros del shader." + +msgid "A pair of parameter name to query and default value." +msgstr "Un par de nombre de parámetro a consultar y valor predeterminado." + +msgid "The colour of the other half of the squares of the pattern." +msgstr "El color de la otra mitad de los cuadrados del patrón." + +msgid "Applies a random rotation around the axis, specified in degrees." +msgstr "Aplica una rotación aleatoria alrededor del eje, especificada en grados." + +msgid "Name of the primitive variable which will contain the tangent data." +msgstr "Nombre de la variable primitiva que contendrá los datos de tangente." + +msgid "The name of the position primitive variable that drives everything." +msgstr "El nombre de la variable primitiva de posición que controla todo." + +msgid "Outputs true if both attribute and location exist, otherwise false." +msgstr "Genera verdadero si tanto el atributo como la ubicación existen, de lo contrario falso." + +msgid "The filters to be combined. Any number of inputs may be added here." +msgstr "Los filtros a combinar. Se puede añadir cualquier número de entradas aquí." + +msgid "The number of subdivisions of the cube in the X, Y and Z directions." +msgstr "El número de subdivisiones del cubo en las direcciones X, Y y Z." + +msgid "The method used when accessing pixels outside the input data window." +msgstr "El método utilizado al acceder a píxeles fuera de la ventana de datos de entrada." + +msgid "Name of the primitive variable which will contain the uTangent data." +msgstr "Nombre de la variable primitiva que contendrá los datos de uTangent." + +msgid "A list of ids to delete. Only used when `selectionMode` is \"IdList\"." +msgstr "Una lista de ids a eliminar. Solo se usa cuando `selectionMode` es \"IdList\"." + +msgid "Name of the primitive variable which will contain the vTangent data." +msgstr "Nombre de la variable primitiva que contendrá los datos de vTangent." + +msgid "Turns the node on and off. When off, `match` always outputs `false`." +msgstr "Activa y desactiva el nodo. Cuando está desactivado, `match` siempre genera `false`." + +msgid "Generates keyframed animation to be applied to plugs on other nodes." +msgstr "Genera animación con fotogramas clave para aplicar a conectores en otros nodos." + +msgid "The per-channel maximum values computed from the input image region." +msgstr "Los valores máximos por canal calculados de la región de la imagen de entrada." + +msgid "The name of the file to be generated when in scene description mode." +msgstr "El nombre del archivo a generar cuando se está en modo de descripción de escena." + +msgid "The +- range over which the saturation of the base colour is varied." +msgstr "El rango +/- sobre el cual se varía la saturación del color base." + +msgid "The input to be used as the start of the next iteration of the loop." +msgstr "La entrada a utilizar como inicio de la siguiente iteración del bucle." + +msgid "The per-channel minimum values computed from the input image region." +msgstr "Los valores mínimos por canal calculados de la región de la imagen de entrada." + +msgid "When on, matching names are kept, and non-matching names are removed." +msgstr "Cuando está activado, se conservan los nombres coincidentes y se eliminan los no coincidentes." + +msgid "Name of the primitive variable which will contain the biTangent data." +msgstr "Nombre de la variable primitiva que contendrá los datos de biTangent." + +msgid "Curve is repeated indefinitely with each repetition mirrored in time." +msgstr "La curva se repite indefinidamente con cada repetición reflejada en el tiempo." + +msgid "Attributes that affect the visualisation of this Light in the Viewer." +msgstr "Atributos que afectan la visualización de esta luz en el visor." + +msgid "The choices that will be randomly selected between based on the seed." +msgstr "Las opciones que se seleccionarán aleatoriamente según la semilla." + +msgid "Converts objects to be used with the nodes in the GafferScene module." +msgstr "Convierte objetos para ser utilizados con los nodos del módulo GafferScene." + +msgid "Name of the points grid in the VDB to create a points primitive from." +msgstr "Nombre de la cuadrícula de puntos en el VDB a partir de la cual crear una primitiva de puntos." + +msgid "Base class for nodes where input plugs have an effect on output plugs." +msgstr "Clase base para nodos donde los conectores de entrada afectan a los conectores de salida." + +msgid "Puts this variable in the context for the upstream prototypes network." +msgstr "Coloca esta variable en el contexto para la red de prototipos anterior." + +msgid "Attributes that affect the visualisation of this camera in the Viewer." +msgstr "Atributos que afectan la visualización de esta cámara en el visor." + +msgid "Removes everything with Z greater than or equal to the far clip depth." +msgstr "Elimina todo lo que tenga Z mayor o igual a la profundidad de recorte lejano." + +msgid "Uses this channel as a Z channel, defining the depth each pixel is at." +msgstr "Utiliza este canal como canal Z, definiendo la profundidad de cada píxel." + +msgid "An arbitrary set of parameters to be passed to the external procedural." +msgstr "Un conjunto arbitrario de parámetros a pasar al procedural externo." + +msgid "The radius of the disk or sphere shape. Has no effect for other shapes." +msgstr "El radio de la forma de disco o esfera. No tiene efecto para otras formas." + +msgid "Controls a mechanism used to create automatic backup copies of scripts." +msgstr "Controla un mecanismo utilizado para crear copias de seguridad automáticas de scripts." + +msgid "The new format (resolution and pixel aspect ratio) of the output image." +msgstr "El nuevo formato (resolución y relación de aspecto de píxel) de la imagen de salida." + +msgid "Enable to delete the source data after shuffling to the destination(s)." +msgstr "Activar para eliminar los datos de origen después de reorganizar al destino(s)." + +msgid "This image ( which must be flat ) drives the color of the output image." +msgstr "Esta imagen (que debe ser plana) controla el color de la imagen de salida." + +msgid "Outputs `true` if the string matches the pattern, and `false` otherwise." +msgstr "Genera `true` si la cadena coincide con el patrón, y `false` de lo contrario." + +msgid "Filters the input scene to isolate locations belonging to specific sets." +msgstr "Filtra la escena de entrada para aislar ubicaciones pertenecientes a conjuntos específicos." + +msgid "Defines the exterior and interior width of the level set in voxel units." +msgstr "Define el ancho exterior e interior del conjunto de nivel en unidades de vóxel." + +msgid "Curve span is linearly interpolated between values of in key and out key." +msgstr "El tramo de curva se interpola linealmente entre los valores de la clave de entrada y salida." + +msgid "Outputs `True` if the filter matches the location, and `False` otherwise." +msgstr "Genera `True` si el filtro coincide con la ubicación, y `False` de lo contrario." + +msgid "The number of points per unit area of the mesh, measured in object space." +msgstr "El número de puntos por unidad de área de la malla, medido en espacio de objeto." + +msgid "The sampled data, as a CompoundData with one FloatVectorData per channel." +msgstr "Los datos muestreados, como un CompoundData con un FloatVectorData por canal." + +msgid "Saturation from the v1.2 release of the ASC CDL color correction formula." +msgstr "Saturación de la versión v1.2 de la fórmula de corrección de color ASC CDL." + +msgid "The overall density of the scattered points, defined in points per pixel." +msgstr "La densidad global de los puntos dispersos, definida en puntos por píxel." + +msgid "Outputs true if the shader, location and parameter exist, otherwise false." +msgstr "Genera verdadero si el shader, la ubicación y el parámetro existen, de lo contrario falso." + +msgid "Modifies the current time for the network upstream of the prototypes plug." +msgstr "Modifica el tiempo actual para la red anterior al conector de prototipos." + +msgid "The input image containing Cryptomatte image layers and optional metadata." +msgstr "La imagen de entrada que contiene capas de imagen Cryptomatte y metadatos opcionales." + +msgid "The minimum value - values below this will be clamped if minEnabled is on." +msgstr "El valor mínimo - los valores por debajo de este se limitarán si minEnabled está activado." + +msgid "The maximum value - values above this will be clamped if maxEnabled is on." +msgstr "El valor máximo - los valores por encima de este se limitarán si maxEnabled está activado." + +msgid "The parameters of the Cycles emission shader that is applied to the meshes." +msgstr "Los parámetros del shader de emisión de Cycles que se aplica a las mallas." + +msgid "Container for custom plugs which dispatchers use to control their behaviour." +msgstr "Contenedor para conectores personalizados que los despachadores utilizan para controlar su comportamiento." + +msgid "Arbitary parameters which specify the features of the \"Geometry\" shape type." +msgstr "Parámetros arbitrarios que especifican las características del tipo de forma \"Geometry\"." + +msgid "The channel used to provide per-point width values for the points primitive." +msgstr "El canal utilizado para proporcionar valores de ancho por punto para la primitiva de puntos." + +msgid "The amount the visualiser will occlude the scene locations being visualised." +msgstr "La cantidad en que el visualizador ocluirá las ubicaciones de escena que se están visualizando." + +msgid "The minimum and maximum values that will be generated for the outFloat plug." +msgstr "Los valores mínimo y máximo que se generarán para el conector outFloat." + +msgid "> Warning : Deprecated - please use the `OpenColorIOContext` > node instead." +msgstr "> Advertencia: Obsoleto - utilizar el nodo `OpenColorIOContext` en su lugar." + +msgid "Name of the UV set primitive variable used to calculate uTangent & vTangent." +msgstr "Nombre de la variable primitiva del conjunto UV utilizado para calcular uTangent y vTangent." + +msgid "Input connections to upstream nodes which must be executed before this node." +msgstr "Conexiones de entrada a nodos anteriores que deben ejecutarse antes de este nodo." + +msgid "Executes the dispatched tasks in separate processes via a background thread." +msgstr "Ejecuta las tareas despachadas en procesos separados mediante un hilo en segundo plano." + +msgid "The variables to be added - arbitrary numbers of variables can be added here." +msgstr "Las variables a añadir - se puede añadir un número arbitrario de variables aquí." + +msgid "The parameters of the light shader - these will vary based on the light type." +msgstr "Los parámetros del shader de luz - estos variarán según el tipo de luz." + +msgid "The parameters of the Arnold mesh_light shader that is applied to the meshes." +msgstr "Los parámetros del shader mesh_light de Arnold que se aplica a las mallas." + +msgid "Base class for nodes which sample primitive variables from another primitive." +msgstr "Clase base para nodos que muestrean variables primitivas de otra primitiva." + +msgid "Outputs true if the variable exists in the context, and is a compatible type." +msgstr "Genera verdadero si la variable existe en el contexto y es de un tipo compatible." + +msgid "The location of the primitive in the `source` scene that will be sampled from." +msgstr "La ubicación de la primitiva en la escena `source` de la cual se muestreará." + +msgid "A list of values for the `layerVariable`, defining the layers to be collected." +msgstr "Una lista de valores para `layerVariable`, definiendo las capas a recopilar." + +msgid "Chooses the default camera to be used when `camera.lookThroughEnabled` is off." +msgstr "Elige la cámara predeterminada a utilizar cuando `camera.lookThroughEnabled` está desactivado." + +msgid "The on/off state of the node. When it is off, the node outputs an empty scene." +msgstr "El estado activado/desactivado del nodo. Cuando está desactivado, el nodo genera una escena vacía." + +msgid "The parameters of the light filter shader - these will vary based on the type." +msgstr "Los parámetros del shader de filtro de luz - estos variarán según el tipo." + +msgid "Indicates whether or not the script has been modified since it was last saved." +msgstr "Indica si el script ha sido modificado desde la última vez que se guardó." + +msgid "Queries a filter for a particular location in a scene and outputs the results." +msgstr "Consulta un filtro para una ubicación particular en una escena y genera los resultados." + +msgid "Makes the location's transform accessible via the `transform()` OSL functions." +msgstr "Hace accesible la transformación de la ubicación mediante las funciones `transform()` de OSL." + +msgid "The method used when a filter references pixels outside the input data window." +msgstr "El método utilizado cuando un filtro hace referencia a píxeles fuera de la ventana de datos de entrada." + +msgid "The list of values used when in \"Int List\" mode. Has no effect in other modes." +msgstr "La lista de valores utilizada en el modo \"Int List\". No tiene efecto en otros modos." + +msgid "The middle of the displayWindow. Stored as V2f, since it could be a half-pixel." +msgstr "El centro del displayWindow. Almacenado como V2f, ya que podría ser medio píxel." + +msgid "Applies color transformations provided by OpenColorIO via an OCIO CDLTransform." +msgstr "Aplica transformaciones de color proporcionadas por OpenColorIO mediante un OCIO CDLTransform." + +msgid "Base class for nodes which process RGB layers with cross talk between channels." +msgstr "Clase base para nodos que procesan capas RVA con interacción entre canales." + +msgid "When on, matching names are ignored, and non-matching names are copied instead." +msgstr "Cuando está activado, los nombres coincidentes se ignoran y se copian los no coincidentes." + +msgid "Limits the parts of the scene loaded to only those with a specific set of tags." +msgstr "Limita las partes de la escena cargadas solo a aquellas con un conjunto específico de etiquetas." + +msgid "The primitive variable that provides the position to be used in the projection." +msgstr "La variable primitiva que proporciona la posición a utilizar en la proyección." + +msgid "The title for the backdrop - this will be displayed at the top of the backdrop." +msgstr "El título para el fondo - se mostrará en la parte superior del fondo." + +msgid "Used to give the rectangle rounded corners. A radius of 0 gives square corners." +msgstr "Se utiliza para dar esquinas redondeadas al rectángulo. Un radio de 0 da esquinas cuadradas." + +msgid "The near and far clipping planes for the viewport's default perspective camera." +msgstr "Los planos de recorte cercano y lejano para la cámara de perspectiva predeterminada del visor." + +msgid "Loads an Arnold light shader and uses it to output a scene with a single light." +msgstr "Carga un shader de luz de Arnold y lo utiliza para generar una escena con una sola luz." + +msgid "This plug has been deprecated in favour of using a filter to select the volume." +msgstr "Este conector ha sido descontinuado en favor de utilizar un filtro para seleccionar el volumen." + +msgid "The list of values used when in \"Float List\" mode. Has no effect in other modes." +msgstr "La lista de valores utilizada en el modo \"Float List\". No tiene efecto en otros modos." + +msgid "Resizes the image to a new resolution, scaling the contents to fit the new size." +msgstr "Redimensiona la imagen a una nueva resolución, escalando el contenido para ajustarse al nuevo tamaño." + +msgid "A list of sets to include the group in. The names should be separated by spaces." +msgstr "Una lista de conjuntos en los que incluir el grupo. Los nombres deben estar separados por espacios." + +msgid "The input scene containing the meshes to bake, and any lights which affect them." +msgstr "La escena de entrada que contiene las mallas a hornear, y cualquier luz que las afecte." + +msgid "Generates scenes suitable for rendering shader balls with Arnold." +msgstr "Genera escenas adecuadas para renderizar esferas de shader con Arnold." + +msgid "The channel used to provide per-point width values for the points." +msgstr "El canal utilizado para proporcionar valores de ancho por punto para los puntos." + +msgid "An environment map used for lighting. Should be in latlong format." +msgstr "Un mapa de entorno utilizado para iluminación. Debe estar en formato latlong." + +msgid "A container that interactive tools may make nodes in as necessary." +msgstr "Un contenedor en el que las herramientas interactivas pueden crear nodos según sea necesario." + +msgid "The type of object to produce. May be a SpherePrimitive or a Mesh." +msgstr "El tipo de objeto a producir. Puede ser un SpherePrimitive o una malla." + +msgid "Adds to the current frame value (after multiplication with speed)." +msgstr "Suma al valor del fotograma actual (después de la multiplicación con la velocidad)." + +msgid "The colour of the two lines forming the central cross of the grid." +msgstr "El color de las dos líneas que forman la cruz central de la cuadrícula." + +msgid "Hides all rows where the A and B columns both have the same value." +msgstr "Oculta todas las filas donde las columnas A y B tienen el mismo valor." + +msgid "The resolution of the shader ball image, which is always a square." +msgstr "La resolución de la imagen de la esfera de shader, que siempre es cuadrada." + +msgid "Click to toggle between list and grouped display of render passes." +msgstr "Hacer clic para alternar entre visualización en lista y agrupada de pases de render." + +msgid "An output plug containing the names of all currently enabled rows." +msgstr "Un conector de salida que contiene los nombres de todas las filas actualmente activadas." + +msgid "The number of vertices to insert in each edge during tessellation." +msgstr "El número de vértices a insertar en cada arista durante la teselación." + +msgid "Base class for nodes creating a new branch in the scene hierarchy." +msgstr "Clase base para nodos que crean una nueva rama en la jerarquía de escena." + +msgid "The number of subdivisions of the plane in the X and Y directions." +msgstr "El número de subdivisiones del plano en las direcciones X e Y." + +msgid "Allows arbitrary OSL shaders to be written directly within Gaffer." +msgstr "Permite escribir shaders OSL arbitrarios directamente dentro de Gaffer." + +msgid "Creates an external procedural for rendering VDB volumes in Arnold." +msgstr "Crea un procedural externo para renderizar volúmenes VDB en Arnold." + +msgid "The frame used to access the target when `useTargetFrame` is set." +msgstr "El fotograma utilizado para acceder al objetivo cuando `useTargetFrame` está establecido." + +msgid "Applies a dilate filter to the image. This can be useful for expanding mask." +msgstr "Aplica un filtro de dilatación a la imagen. Puede ser útil para expandir máscaras." + +msgid "Applies an erode filter to the image. This can be useful for shrinking mask." +msgstr "Aplica un filtro de erosión a la imagen. Puede ser útil para contraer máscaras." + +msgid "Applies a median filter to the image. This can be useful for removing noise." +msgstr "Aplica un filtro de mediana a la imagen. Puede ser útil para eliminar ruido." + +msgid "The layer to generate. The output channels will be named ( layer.R, layer.G, layer.B and layer.A )." +msgstr "La capa a generar. Los canales de salida se nombrarán (layer.R, layer.G, layer.B y layer.A)." + +msgid "The compression level of the PNG file. This is a value between 0 (no compression) and 9 (most compression)." +msgstr "El nivel de compresión del archivo PNG. Es un valor entre 0 (sin compresión) y 9 (máxima compresión)." + +msgid "The names of the channels to be deleted (or kept if the mode is set to Keep). Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de los canales a eliminar (o conservar si el modo está establecido en Conservar). Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "The renderer the shader should affect. Shaders assigned to a specific renderer will take precedence over shaders not assigned to any specific renderer." +msgstr "El renderizador que el shader debe afectar. Los shaders asignados a un renderizador específico tendrán prioridad sobre los shaders no asignados a ningún renderizador específico." + +msgid "The name of the destination data to be created. Use `${source}` to insert the name of the source data. For example, `${source}Filtered` to create a filtered copy of each source." +msgstr "El nombre de los datos de destino a crear. Utilizar `${source}` para insertar el nombre de los datos de origen. Por ejemplo, `${source}Filtered` para crear una copia filtrada de cada origen." + +msgid "The width of the lines forming the main part of the grid. This width applies only to the OpenGL representation of the grid in the viewport, and does not affect the scene output." +msgstr "El ancho de las líneas que forman la parte principal de la cuadrícula. Este ancho se aplica solo a la representación OpenGL de la cuadrícula en el visor, y no afecta la salida de la escena." + +msgid "The name of the shader used to perform the visualisation. The default value is for a standard OpenGL shader. Any shader ( including fragment shaders and compute shaders ) may be specified." +msgstr "El nombre del shader utilizado para realizar la visualización. El valor predeterminado es para un shader OpenGL estándar. Se puede especificar cualquier shader (incluyendo shaders de fragmento y shaders de cómputo)." + +msgid "An explicit list of paths used to map between `prototypeIndex` and paths in the `prototypes` scene. If this is provided, `prototypeRoots` is used only when connecting the `prototypes` input scene." +msgstr "Una lista explícita de rutas utilizada para mapear entre `prototypeIndex` y rutas en la escena `prototypes`. Si se proporciona, `prototypeRoots` se utiliza solo al conectar la escena de entrada `prototypes`." + +msgid "Divides selected channels by a specified alpha channel. If the alpha channel on the image being processed is not the standard alpha \"A\" then it may be necessary to specify which channel to use." +msgstr "Divide los canales seleccionados por un canal alfa especificado. Si el canal alfa de la imagen que se está procesando no es el alfa estándar \"A\", puede ser necesario especificar qué canal utilizar." + +msgid "Outputs the type of the primitive variable data, or empty string if the primitive variable does not exist." +msgstr "Genera el tipo de datos de la variable primitiva, o una cadena vacía si la variable primitiva no existe." + +msgid "The on/off state of the filter. When it is off, the result of the first input is passed through unchanged." +msgstr "El estado activado/desactivado del filtro. Cuando está desactivado, el resultado de la primera entrada se pasa sin cambios." + +msgid "The filter used to control which parts of the scene are processed. A Filter node should be connected here." +msgstr "El filtro utilizado para controlar qué partes de la escena se procesan. Se debe conectar un nodo Filter aquí." + +msgid "Specifies the standard options (global settings) for the scene. These should be respected by all renderers." +msgstr "Especifica las opciones estándar (configuración global) para la escena. Estas deben ser respetadas por todos los renderizadores." + +msgid "Don't allow any tasks which depend on this list to run until all frames of the tasks in this list have run." +msgstr "No permitir que se ejecuten tareas que dependen de esta lista hasta que todos los fotogramas de las tareas en esta lista se hayan ejecutado." + +msgid "The names of the views to copy. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de las vistas a copiar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "The orthographic aperture used when converting distant lights ( which are theoretically infinite in extent )" +msgstr "La apertura ortográfica utilizada al convertir luces distantes (que son teóricamente infinitas en extensión)" + +msgid "The name of a boolean primitive variable created to record the success or failure of the sampling operation." +msgstr "El nombre de una variable primitiva booleana creada para registrar el éxito o fracaso de la operación de muestreo." + +msgid "Values less than 1 bring colors closer to monochrome, values greater than 1 push colors away from monochrome." +msgstr "Valores menores que 1 acercan los colores al monocromo, valores mayores que 1 alejan los colores del monocromo." + +msgid "Name of the primitive variable that will be created to store the z-axis aim vector of the output orientation." +msgstr "Nombre de la variable primitiva que se creará para almacenar el vector de dirección del eje Z de la orientación de salida." + +msgid "The parent plug of the query outputs. The order of outputs corresponds to the order of children of `queries`." +msgstr "El conector primario de las salidas de consulta. El orden de las salidas corresponde al orden de los secundarios de `queries`." + +msgid "The channel which controls the blend. Clamped between 0 and 1. 0 to take first input, 1 to take second input." +msgstr "El canal que controla la mezcla. Limitado entre 0 y 1. 0 para tomar la primera entrada, 1 para tomar la segunda entrada." + +msgid "An arbitrary set of variables which can be accessed via the `variables` dictionary within the python command." +msgstr "Un conjunto arbitrario de variables que se pueden acceder mediante el diccionario `variables` dentro del comando Python." + +msgid "Name of the primitive variable that will be created to store the x-axis aim vector of the output orientation." +msgstr "Nombre de la variable primitiva que se creará para almacenar el vector de dirección del eje X de la orientación de salida." + +msgid "The name of the display to use. Defaults to the default display as defined by the current OpenColorIO config." +msgstr "El nombre de la visualización a utilizar. Por defecto usa la visualización predeterminada definida por la configuración actual de OpenColorIO." + +msgid "If set, this node will do nothing if the specified `alphaChannel` is not found, instead of throwing an error." +msgstr "Indica si este nodo no hará nada si el `alphaChannel` especificado no se encuentra, en lugar de generar un error." + +msgid "Name of the primitive variable that will be created to store the y-axis aim vector of the output orientation." +msgstr "Nombre de la variable primitiva que se creará para almacenar el vector de dirección del eje Y de la orientación de salida." + +msgid "The list of sets that the `location` is a member of. Returned in the order they are listed in the `sets` plug." +msgstr "La lista de conjuntos de los que la `location` es miembro. Se devuelve en el orden en que se listan en el conector `sets`." + +msgid "Shifts the cropped image area back to the origin, so that the bottom left of the display window is at ( 0, 0 )." +msgstr "Desplaza el área de imagen recortada de vuelta al origen, de modo que la esquina inferior izquierda de la ventana de visualización esté en (0, 0)." + +msgid "The names of the channels to copy. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de los canales a copiar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "The name of the file to be loaded. The file can be in any of the formats supported by Cortex's SceneInterfaces." +msgstr "El nombre del archivo a cargar. El archivo puede estar en cualquiera de los formatos soportados por las SceneInterfaces de Cortex." + +msgid "The chroma sub sampling used to write the jpeg file. Note that the file will be stored as YCbCr instead of RGB." +msgstr "El submuestreo de croma utilizado para escribir el archivo JPEG. Tenga en cuenta que el archivo se almacenará como YCbCr en lugar de RVA." + +msgid "Provides the image to be used to create this view. The connected image should not itself be a multi-view image." +msgstr "Proporciona la imagen a utilizar para crear esta vista. La imagen conectada no debe ser en sí misma una imagen de múltiples vistas." + +msgid "The filter used to control which meshes the textures will be baked for. A Filter node should be connected here." +msgstr "El filtro utilizado para controlar para qué mallas se hornearán las texturas. Se debe conectar un nodo Filter aquí." + +msgid "The names of options to be removed. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de las opciones a eliminar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "The name of the primitive variable created to store the distortion values. This will contain a float per vertex." +msgstr "El nombre de la variable primitiva creada para almacenar los valores de distorsión. Contendrá un float por vértice." + +msgid "Enables randomisation of the orientations. Randomisation is applied as a pre-transform of the input orientation." +msgstr "Activa la aleatorización de las orientaciones. La aleatorización se aplica como una pre-transformación de la orientación de entrada." + +msgid "The names of globals to be removed. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de los globales a eliminar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "Size of the voxels in the created sphere levelset. Smaller voxel results in more detail but higher memory usage." +msgstr "Tamaño de los vóxeles en el conjunto de nivel esférico creado. Vóxeles más pequeños producen más detalle pero mayor uso de memoria." + +msgid "The array of inputs to choose from. One of these is chosen by the index plug to be passed through to the output." +msgstr "El arreglo de entradas del que elegir. Una de estas es elegida por el conector de índice para pasar a la salida." + +msgid "The names of outputs to be removed. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de las salidas a eliminar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "Loads shaders for use in Arnold renders. Use the ShaderAssignment node to assign shaders to objects in the scene." +msgstr "Carga shaders para usar en renders de Arnold. Utilizar el nodo ShaderAssignment para asignar shaders a objetos en la escena." + +msgid "The largest allowable value of the wedge range when the mode is set to \"Int Range\". Has no effect in other modes." +msgstr "El valor máximo permitido del rango de cuña cuando el modo está establecido en \"Int Range\". No tiene efecto en otros modos." + +msgid "The width of the points. If `widthChannel` is used as well, then this acts as a multiplier on the channel values." +msgstr "El ancho de los puntos. Si también se utiliza `widthChannel`, entonces actúa como un multiplicador de los valores del canal." + +msgid "Masks upstream tasks so that they will only be executed for a subset of the Dispatcher's frame range." +msgstr "Enmascara las tareas anteriores de modo que solo se ejecuten para un subconjunto del rango de fotogramas del despachador." + +msgid "The name given to the object generated - this will be placed under the parent in the scene hierarchy." +msgstr "El nombre dado al objeto generado - se colocará bajo el primario en la jerarquía de escena." + +msgid "Sets the Context Variable used in the default file name to control where all the bakes will be stored." +msgstr "Establece la variable de contexto utilizada en el nombre de archivo predeterminado para controlar dónde se almacenarán todos los horneados." + +msgid "The size of the grid in the x and y axes. Use the transform to rotate the grid into a different plane." +msgstr "El tamaño de la cuadrícula en los ejes X e Y. Utilizar la transformación para rotar la cuadrícula a un plano diferente." + +msgid "Omits pixels from the points primitive if their alpha value is less than or equal to `alphaThreshold`." +msgstr "Omite píxeles de la primitiva de puntos si su valor alfa es menor o igual a `alphaThreshold`." + +msgid "The result of the filter. This should be connected into the \"filter\" plug of a FilteredSceneProcessor." +msgstr "El resultado del filtro. Debe conectarse al conector \"filter\" de un FilteredSceneProcessor." + +msgid "Are vectors measured in pixels, or as fractions of the input image display window ranging from 0 to 1." +msgstr "Indica si los vectores se miden en píxeles, o como fracciones de la ventana de visualización de la imagen de entrada que van de 0 a 1." + +msgid "Curve span is smoothly interpolated between values of in key and out key using tangent slope and scale." +msgstr "El tramo de curva se interpola suavemente entre los valores de la clave de entrada y salida usando pendiente y escala de tangente." + +msgid "Random colour output derived from seed, Context Variable, base colour, hue, saturation and value plugs." +msgstr "Salida de color aleatorio derivada de la semilla, variable de contexto, color base, tono, saturación y conectores de valor." + +msgid "Copies attributes to newly created destination locations to match the attributes at the source location." +msgstr "Copia atributos a las ubicaciones de destino recién creadas para coincidir con los atributos de la ubicación de origen." + +msgid "The list of weights for the choices. Choices with a higher weight have a greater chance of being chosen." +msgstr "La lista de pesos para las opciones. Las opciones con un peso mayor tienen una mayor probabilidad de ser elegidas." + +msgid "The smallest value of the wedge range when the mode is set to \"Int Range\". Has no effect in other modes." +msgstr "El valor más pequeño del rango de cuña cuando el modo está establecido en \"Int Range\". No tiene efecto en otros modos." + +msgid "Adaptively generate fewer polygons from level set. 0 - uniform meshing, 1 - maximum level of adaptivity." +msgstr "Generar adaptativamente menos polígonos del conjunto de nivel. 0 - mallado uniforme, 1 - nivel máximo de adaptabilidad." + +msgid "Curve is repeated indefinitely with each repetition inverted in value and offset to preserve continuity." +msgstr "La curva se repite indefinidamente con cada repetición invertida en valor y desplazada para preservar la continuidad." + +msgid "If the target is larger than the current clipping planes, increase the far clipping plane to enclose it." +msgstr "Si el objetivo es más grande que los planos de recorte actuales, aumentar el plano de recorte lejano para encerrarlo." + +msgid "Base class for nodes which modify individual scene locations, but do not alter the hierarchy in any way." +msgstr "Clase base para nodos que modifican ubicaciones individuales de la escena, pero no alteran la jerarquía de ninguna manera." + +msgid "Adjusts the constraint so that the original position of the object at the `referenceFrame` is maintained." +msgstr "Ajusta la restricción para que la posición original del objeto en el `referenceFrame` se mantenga." + +msgid "The radius of the median filter. Values greater than 1 will likely remove small details from the texture." +msgstr "El radio del filtro de mediana. Valores mayores que 1 probablemente eliminarán pequeños detalles de la textura." + +msgid "An arbitrary set of name/value pairs which will be set as environment variables when running the command." +msgstr "Un conjunto arbitrario de pares nombre/valor que se establecerán como variables de entorno al ejecutar el comando." + +msgid "Causes the node to do nothing if the primitive variable doesn't exist on the curves, instead of erroring." +msgstr "Hace que el nodo no haga nada si la variable primitiva no existe en las curvas, en lugar de generar un error." + +msgid "The last frame of motion tracking can be specified relative to the current frame or as an absolute value." +msgstr "El último fotograma de seguimiento de movimiento puede especificarse relativo al fotograma actual o como un valor absoluto." + +msgid "The name of the uniform primitive variable which will be created to hold the segment index for each face." +msgstr "El nombre de la variable primitiva uniforme que se creará para contener el índice de segmento de cada cara." + +msgid "Causes the node to do nothing if the primitive variable doesn't exist on the points, instead of erroring." +msgstr "Hace que el nodo no haga nada si la variable primitiva no existe en los puntos, en lugar de generar un error." + +msgid "Deletes primitive variables from objects. The primitive variables to be deleted are chosen based on name." +msgstr "Elimina variables primitivas de los objetos. Las variables primitivas que se eliminan se eligen según el nombre." + +msgid "The name given to the PointsPrimitive - this will be placed under the location specified by \"destination\"." +msgstr "El nombre dado al PointsPrimitive - se colocará bajo la ubicación especificada por \"destination\"." + +msgid "Stores animation curves. Rather than access these directly, prefer to use the Animation::acquire() method." +msgstr "Almacena curvas de animación. En lugar de acceder a estas directamente, es preferible usar el método Animation::acquire()." + +msgid "The type of shader to modify. This is actually the name of an attribute which contains the shader network." +msgstr "El tipo de shader a modificar. Esto es en realidad el nombre de un atributo que contiene la red de shaders." + +msgid "The custom area to set the Data/Display Window to. This plug is only used if 'Area Source' is set to Area." +msgstr "El área personalizada a la que establecer la ventana de datos/visualización. Este conector solo se usa si 'Area Source' está establecido en Area." + +msgid "Name of the primitive variable that will be created to store the axis component of the output orientation." +msgstr "Nombre de la variable primitiva que se creará para almacenar el componente de eje de la orientación de salida." + +msgid "An arbitrary set of name/value pairs which can be referenced in command with '{substitutionsName}' syntax." +msgstr "Un conjunto arbitrario de pares nombre/valor que pueden referenciarse en el comando con la sintaxis '{substitutionsName}'." + +msgid "The smallest value of the wedge range when the mode is set to \"Float Range\". Has no effect in other modes." +msgstr "El valor más pequeño del rango de cuña cuando el modo está establecido en \"Float Range\". No tiene efecto en otros modos." + +msgid "The first frame of motion tracking can be specified relative to the current frame or as an absolute value." +msgstr "El primer fotograma de seguimiento de movimiento puede especificarse relativo al fotograma actual o como un valor absoluto." + +msgid "The exact number of samples (including `start.frame` and `end.frame`) when using a \"Fixed\" `samplingMode`." +msgstr "El número exacto de muestras (incluyendo `start.frame` y `end.frame`) cuando se usa un `samplingMode` \"Fixed\"." + +msgid "Specifies the clipping planes used when looking through this light. Overrides the Viewer's Camera Settings." +msgstr "Especifica los planos de recorte utilizados al mirar a través de esta luz. Sobrescribe la configuración de cámara del visor." + +msgid "Outputs the interpolation of the primitive variable, or `Invalid` if the primitive variable does not exist." +msgstr "Genera la interpolación de la variable primitiva, o `Invalid` si la variable primitiva no existe." + +msgid "Outputs the value of the primitive variable, or the default value if the primitive variable does not exist." +msgstr "Genera el valor de la variable primitiva, o el valor predeterminado si la variable primitiva no existe." + +msgid "Name of the primitive variable that will be created to store the angle component of the output orientation." +msgstr "Nombre de la variable primitiva que se creará para almacenar el componente de ángulo de la orientación de salida." + +msgid "Causes the constraint to do nothing if the target location doesn't exist in the scene, instead of erroring." +msgstr "Hace que la restricción no haga nada si la ubicación objetivo no existe en la escena, en lugar de generar un error." + +msgid "The largest allowable value of the wedge range when the mode is set to \"Float Range\". Has no effect in other modes." +msgstr "El valor máximo permitido del rango de cuña cuando el modo está establecido en \"Float Range\". No tiene efecto en otros modos." + +msgid "Shuffles attributes in the scene, allowing entries to be copied and/or renamed." +msgstr "Reorganiza atributos en la escena, permitiendo copiar y/o renombrar entradas." + +msgid "Shuffles render passes in the scene globals, allowing them to be copied and/or renamed." +msgstr "Reorganiza pases de render en los globales de la escena, permitiendo copiarlos y/o renombrarlos." + +msgid "Shuffles primitive variables, allowing them to be copied and/or renamed." +msgstr "Reorganiza variables primitivas, permitiendo copiarlas y/o renombrarlas." + +msgid "Removes everything with Z less than or equal to the near clip depth." +msgstr "Elimina todo lo que tenga Z menor o igual a la profundidad de recorte cercano." + +msgid "Whether to assign a new Display Window based on the defined area." +msgstr "Indica si se debe asignar una nueva ventana de visualización basada en el área definida." + +msgid "A gamma correction applied after all the remapping defined above." +msgstr "Una corrección de gamma aplicada después de toda la reasignación definida anteriormente." + +msgid "The directory where completed renders are saved. This allows them to remain in the catalogue for the next session." +msgstr "El directorio donde se guardan los renders completados. Esto permite que permanezcan en el catálogo para la siguiente sesión." + +msgid "The input colour which is considered to be \"white\". This colour is remapped to the gain value in the output image." +msgstr "El color de entrada que se considera \"blanco\". Este color se reasigna al valor de ganancia en la imagen de salida." + +msgid "The input colour which is considered to be \"black\". This colour is remapped to the lift value in the output image." +msgstr "El color de entrada que se considera \"negro\". Este color se reasigna al valor de elevación en la imagen de salida." + +msgid "The names of the channels to process. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de los canales a procesar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "The list of values for the choices. Use the `choices.weights` plug to assign a relative probability to each choice." +msgstr "La lista de valores para las opciones. Utilizar el conector `choices.weights` para asignar una probabilidad relativa a cada opción." + +msgid "The names of the options to be copied. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de las opciones a copiar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "Modifies the parameters of cameras and procedurals. Existing parameters can be tweaked and new parameters be added." +msgstr "Modifica los parámetros de cámaras y procedurales. Los parámetros existentes pueden ajustarse y se pueden añadir nuevos parámetros." + +msgid "The aim vector, specified in object space. The object will be transformed so that this vector points at the target." +msgstr "El vector de dirección, especificado en espacio de objeto. El objeto se transformará para que este vector apunte al objetivo." + +msgid "The names of attributes to be removed. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de los atributos a eliminar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "Causes the attributes to be applied to the scene globals instead of the individual locations defined by the filter." +msgstr "Hace que los atributos se apliquen a los globales de la escena en lugar de las ubicaciones individuales definidas por el filtro." + +msgid "Ignores tweaks targeting missing primitive variables. When off, missing primitive variables cause the node to error." +msgstr "Ignora los ajustes dirigidos a variables primitivas faltantes. Cuando está desactivado, las variables primitivas faltantes causan un error en el nodo." + +msgid "Blends two images together based on a mask. If the mask is 0 you get the first input, if it is 1 you get the second." +msgstr "Mezcla dos imágenes basándose en una máscara. Si la máscara es 0 se obtiene la primera entrada, si es 1 se obtiene la segunda." + +msgid "Applies attributes to modify the appearance of objects in the viewport and in renders done by the OpenGLRender node." +msgstr "Aplica atributos para modificar la apariencia de los objetos en el visor y en los renders realizados por el nodo OpenGLRender." + +msgid "Amount to offset the level set by in voxel units. A positive number will erode the surface and negative will dilate." +msgstr "Cantidad de desplazamiento del conjunto de nivel en unidades de vóxel. Un número positivo erosionará la superficie y uno negativo la dilatará." + +msgid "If selected, adjusts the alpha of each deep sample so that the composited result will match the alpha of colorSource." +msgstr "Indica si se ajusta el alfa de cada muestra profunda para que el resultado compuesto coincida con el alfa de colorSource." + +msgid "The names of the channels to operate on. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de los canales en los que operar. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "The near and far clipping planes, defining a region of forward depth within which objects are visible to this camera." +msgstr "Los planos de recorte cercano y lejano, definiendo una región de profundidad hacia adelante dentro de la cual los objetos son visibles para esta cámara." + +msgid "A list of the available frames for the current file sequence. Empty when the input `fileName` is not a file sequence." +msgstr "Una lista de los fotogramas disponibles para la secuencia de archivos actual. Vacía cuando el `fileName` de entrada no es una secuencia de archivos." + +msgid "Container for user-defined plugs. Nodes should never make their own plugs here, so users are free to do as they wish." +msgstr "Contenedor para conectores definidos por el usuario. Los nodos nunca deben crear sus propios conectores aquí, para que los usuarios tengan libertad." + +msgid "Base class for nodes which process a subset of the image channels, while leaving the format and data window unchanged." +msgstr "Clase base para nodos que procesan un subconjunto de los canales de imagen, dejando el formato y la ventana de datos sin cambios." + +msgid "The names of the new attributes to create. The new attributes will be copied from the transform in different Contexts." +msgstr "Los nombres de los nuevos atributos a crear. Los nuevos atributos se copiarán de la transformación en diferentes contextos." + +msgid "A label for the shader to be assigned. If this is empty, the node connected to the `shader` plug will be used instead." +msgstr "Una etiqueta para el shader a asignar. Si está vacía, se utilizará el nodo conectado al conector `shader` en su lugar." + +msgid "Warps an input image onto a set of UVs provided by a second image, effectively applying a texture map to the UV image." +msgstr "Deforma una imagen de entrada sobre un conjunto de UVs proporcionados por una segunda imagen, aplicando efectivamente un mapa de textura a la imagen UV." + +msgid "Ignores errors loading the script when executing in the background. This is not recommended - fix the problem instead." +msgstr "Ignora errores al cargar el script cuando se ejecuta en segundo plano. Esto no es recomendable - es mejor corregir el problema." + +msgid "Maintains the subtree's membership in sets by transferring the `root` location's memberships to the subtree's children." +msgstr "Mantiene la membresía del subárbol en conjuntos transfiriendo las membresías de la ubicación `root` a los secundarios del subárbol." + +msgid "The code for the body of the OSL shader. This should read from the input parameters and write to the output parameters." +msgstr "El código para el cuerpo del shader OSL. Debe leer de los parámetros de entrada y escribir en los parámetros de salida." + +msgid "The location where the copies will be placed in the output scene. The default value places them alongside the original." +msgstr "La ubicación donde se colocarán las copias en la escena de salida. El valor predeterminado las coloca junto al original." + +msgid "Outputs the value of the specified variable, or the default value if the variable does not exist ( or is incompatible )." +msgstr "Genera el valor de la variable especificada, o el valor predeterminado si la variable no existe (o es incompatible)." + +msgid "The width of the lines forming the border of the grid. This width applies only to the OpenGL representation of the grid." +msgstr "El ancho de las líneas que forman el borde de la cuadrícula. Este ancho se aplica solo a la representación OpenGL de la cuadrícula." + +msgid "The name of the view to use. Defaults to the default view for the display, as defined by the current OpenColorIO config." +msgstr "El nombre de la vista a utilizar. Por defecto usa la vista predeterminada para la pantalla, según la configuración actual de OpenColorIO." + +msgid "Maintains the subtree's world-space position by applying the `root` location's full transform to the subtree's children." +msgstr "Mantiene la posición en espacio mundial del subárbol aplicando la transformación completa de la ubicación `root` a los secundarios del subárbol." + +msgid "Duplicates a part of the scene. The duplicates are parented alongside the original, and have a transform applied to them." +msgstr "Duplica una parte de la escena. Los duplicados se emparentan junto al original y se les aplica una transformación." + +msgid "A string to add at the end of the name. Suffixes are added last, after the find and replace operation has been performed." +msgstr "Una cadena a añadir al final del nombre. Los sufijos se añaden al final, después de la operación de buscar y reemplazar." + +msgid "Makes the object's transform available to OSL, so that you can use OSL functions that convert from object to world space." +msgstr "Hace disponible la transformación del objeto para OSL, de modo que se puedan usar funciones OSL que conviertan de espacio de objeto a espacio mundial." + +msgid "The name of the location the instances will be generated below. This will be parented directly under the parent location." +msgstr "El nombre de la ubicación bajo la cual se generarán las instancias. Se emparentará directamente bajo la ubicación primaria." + +msgid "Name of the primitive variable that will be created to store the output orientations as euler angles, measured in degrees." +msgstr "Nombre de la variable primitiva que se creará para almacenar las orientaciones de salida como ángulos de Euler, medidos en grados." + +msgid "The Format to use as the area to set the Data/Display Window to. This plug is only used if 'Area Source' is set to Format." +msgstr "El formato a utilizar como el área para establecer la ventana de datos/visualización. Este conector solo se usa si 'Area Source' está establecido en Format." + +msgid "The width of the lines forming the main part of the grid. This width applies only to the OpenGL representation of the grid." +msgstr "El ancho de las líneas que forman la parte principal de la cuadrícula. Este ancho se aplica solo a la representación OpenGL de la cuadrícula." + +msgid "A string to add at the start of the name. Prefixes are added last, after the find and replace operation has been performed." +msgstr "Una cadena a añadir al inicio del nombre. Los prefijos se añaden al final, después de la operación de buscar y reemplazar." + +msgid "Determines the scene location that is ultimately selected or deselected, which may differ from what is originally selected." +msgstr "Determina la ubicación de la escena que se selecciona o deselecciona finalmente, que puede diferir de lo seleccionado originalmente." + +msgid "A specific UDIM to offset the texture coordinates to. The UDIM is converted to an offset which is added to the offset above." +msgstr "Un UDIM específico al cual desplazar las coordenadas de textura. El UDIM se convierte en un desplazamiento que se suma al desplazamiento anterior." + +msgid "The context variable used to specify the index being collected. This may be used in the node network upstream of the inputs." +msgstr "La variable de contexto utilizada para especificar el índice que se está recopilando. Puede usarse en la red de nodos anterior a las entradas." + +msgid "Size of the voxel in the level set grid. Smaller voxel sizes will increase resolution, take more memory & longer to process." +msgstr "Tamaño del vóxel en la cuadrícula de conjunto de nivel. Tamaños de vóxel más pequeños aumentarán la resolución, usarán más memoria y tardarán más en procesarse." + +msgid "Name of the primitive variable that defines the input orientations as a matrix. This variable should contain M33fVectorData." +msgstr "Nombre de la variable primitiva que define las orientaciones de entrada como una matriz. Esta variable debe contener M33fVectorData." + +msgid "Chooses view to display from a multi-view image. The \"default\" view is used for normal images that don't have specific views." +msgstr "Elige la vista a mostrar de una imagen de múltiples vistas. La vista \"default\" se usa para imágenes normales que no tienen vistas específicas." + +msgid "Filter to specify the branches to prune. The specified locations and all locations below them will be removed from the scene." +msgstr "Filtro para especificar las ramas a podar. Las ubicaciones especificadas y todas las ubicaciones debajo de ellas se eliminarán de la escena." + +msgid "Defines the shuffling to be performed. Add shuffles by pressing `+` in the UI, or adding `ShufflePlug` children using the API." +msgstr "Define la reorganización a realizar. Añadir reorganizaciones presionando `+` en la interfaz, o añadiendo secundarios `ShufflePlug` usando la API." + +msgid "Name of the primitive variable that defines the input orientation as quaternions. This variable should contain QuatfVectorData." +msgstr "Nombre de la variable primitiva que define la orientación de entrada como cuaterniones. Esta variable debe contener QuatfVectorData." + +msgid "Limits the extent of the sphere along the lower pole. Valid values are in the range [-1,1] and should always be less than zMax." +msgstr "Limita la extensión de la esfera a lo largo del polo inferior. Los valores válidos están en el rango [-1,1] y siempre deben ser menores que zMax." + +msgid "Input connections to nodes which must be executed after this node, but which don't need to be executed before downstream nodes." +msgstr "Conexiones de entrada a nodos que deben ejecutarse después de este nodo, pero que no necesitan ejecutarse antes de los nodos posteriores." + +msgid "A suffix to remove from the start of the original name. Suffixes are removed before the find and replace operation is performed." +msgstr "Un sufijo a eliminar del inicio del nombre original. Los sufijos se eliminan antes de la operación de buscar y reemplazar." + +msgid "When on, the primitive variables matched by names are unaffected, and the non-matching primitive variables are affected instead." +msgstr "Cuando está activado, las variables primitivas que coinciden con los nombres no se afectan, y las que no coinciden se afectan en su lugar." + +msgid "Used in the Color and False Color modes to define the value which is mapped to black or the left end of the spline respectively." +msgstr "Se utiliza en los modos Color y Falso Color para definir el valor que se mapea a negro o al extremo izquierdo de la curva respectivamente." + +msgid "The scene location to inspect. Defaults to the currently selected location. Use the HierarchyView or Viewer to select a location." +msgstr "La ubicación de la escena a inspeccionar. Por defecto es la ubicación seleccionada actualmente. Utilizar el HierarchyView o el visor para seleccionar una ubicación." + +msgid "Used in the Color and False Color modes to define the value which is mapped to white or the right end of the spline respectively." +msgstr "Se utiliza en los modos Color y Falso Color para definir el valor que se mapea a blanco o al extremo derecho de la curva respectivamente." + +msgid "Control the blend between the two input images. 0 to take first input, 1 to take second input. Multiplied together with the mask." +msgstr "Controla la mezcla entre las dos imágenes de entrada. 0 para tomar la primera entrada, 1 para tomar la segunda. Se multiplica junto con la máscara." + +msgid "Creates shaders for use with Arnold cameras. Use a ShaderAssignment node to assign the shaders to the cameras they should affect." +msgstr "Crea shaders para usar con cámaras de Arnold. Utilizar un nodo ShaderAssignment para asignar los shaders a las cámaras que deben afectar." + +msgid "When on, the query includes attributes inherited from ancestor locations and the scene globals if a local attribute is not found." +msgstr "Cuando está activado, la consulta incluye atributos heredados de ubicaciones ancestrales y los globales de la escena si no se encuentra un atributo local." + +msgid "The tweaks to be made to the primitive variables. Arbitrary numbers of user defined tweaks may be added as children of this plug." +msgstr "Los ajustes a realizar en las variables primitivas. Se puede añadir un número arbitrario de ajustes definidos por el usuario como secundarios de este conector." + +msgid "The location to become the new root for the output scene. All locations below this will be kept, and all others will be discarded." +msgstr "La ubicación que se convertirá en la nueva raíz de la escena de salida. Se conservarán todas las ubicaciones debajo de esta y se descartarán las demás." + +msgid "Limits the extent of the sphere along the upper pole. Valid values are in the range [-1,1] and should always be greater than zMin." +msgstr "Limita la extensión de la esfera a lo largo del polo superior. Los valores válidos están en el rango [-1,1] y siempre deben ser mayores que zMin." + +msgid "Outputs the location of the first ancestor matched by the filter. In the case of an exact match, this will be the location itself." +msgstr "Genera la ubicación del primer ancestro coincidente con el filtro. En caso de coincidencia exacta, será la ubicación misma." + +msgid "The renderer that will be used, accounting for the value of the `render:defaultRenderer` option if `renderer` is set to \"Default\"." +msgstr "El renderizador que se utilizará, teniendo en cuenta el valor de la opción `render:defaultRenderer` si `renderer` está establecido en \"Default\"." + +msgid "The render type of the points. This defaults to \"gl:point\" so that the points are rendered in a lightweight manner in the viewport." +msgstr "El tipo de render de los puntos. Por defecto es \"gl:point\" para que los puntos se rendericen de forma ligera en el visor." + +msgid "The width of the two lines forming the central cross of the grid. This width applies only to the OpenGL representation of the grid." +msgstr "El ancho de las dos líneas que forman la cruz central de la cuadrícula. Este ancho se aplica solo a la representación OpenGL de la cuadrícula." + +msgid "The name of the primitive variable which drives the UVs to compute UDIMs from. Should be a Face-Varying or Vertex interpolated V2f." +msgstr "El nombre de la variable primitiva que controla los UVs para calcular UDIMs. Debe ser un V2f con interpolación Face-Varying o Vertex." + +msgid "Specifies the colour manager to be used in Arnold renders. This is represented in the scene as an option called `ai:color_manager`." +msgstr "Especifica el gestor de color a utilizar en renders de Arnold. Esto se representa en la escena como una opción llamada `ai:color_manager`." + +msgid "The scene containing the target location to which cameras are pointed. If this is unconnected, the main input scene is used instead." +msgstr "La escena que contiene la ubicación objetivo a la que se apuntan las cámaras. Si no está conectada, se utiliza la escena de entrada principal." + +msgid "The method used to define the output orientations. When creating orientations for the Instancer, the Quaternion mode should be used." +msgstr "El método utilizado para definir las orientaciones de salida. Al crear orientaciones para el Instancer, se debe utilizar el modo cuaternión." + +msgid "When on, the primitive variables matched by names are not extracted, and the non-matching primitive variables are extracted instead." +msgstr "Cuando está activado, las variables primitivas que coinciden con los nombres no se extraen, y las que no coinciden se extraen en su lugar." + +msgid "The image channels used to provide 3d positions for the points. If `None`, the pixel's 2d position within the image is used instead." +msgstr "Los canales de imagen utilizados para proporcionar posiciones 3D para los puntos. Si es `None`, se utiliza la posición 2D del píxel en la imagen." + +msgid "May be incremented to force a reload if the file has changed on disk - otherwise old contents may still be loaded via Gaffer's cache." +msgstr "Puede incrementarse para forzar una recarga si el archivo ha cambiado en disco - de lo contrario, el contenido antiguo puede seguir cargándose desde la caché de Gaffer." + +msgid "Name of the primitive variable that defines the axis component of the input orientations. This variable should contain V3fVectorData." +msgstr "Nombre de la variable primitiva que define el componente de eje de las orientaciones de entrada. Esta variable debe contener V3fVectorData." + +msgid "The type of the shader being represented. This should be considered read-only. Use the `Shader.loadShader()` method to load a shader." +msgstr "El tipo del shader que se está representando. Debe considerarse de solo lectura. Utilizar el método `Shader.loadShader()` para cargar un shader." + +msgid "When tidying, omits samples which are blocked by samples in front of them ( occluded samples have no effect on the composited result." +msgstr "Al ordenar, omite muestras que están bloqueadas por muestras delante de ellas (las muestras ocluidas no tienen efecto en el resultado compuesto)." + +msgid "The name of the shader being represented. This should be considered read-only. Use the `Shader.loadShader()` method to load a shader." +msgstr "El nombre del shader que se está representando. Debe considerarse de solo lectura. Utilizar el método `Shader.loadShader()` para cargar un shader." + +msgid "A space separated list of grids used to be used to generate motion blur. Should either contain a single vector grid or 3 float grids." +msgstr "Una lista separada por espacios de cuadrículas utilizadas para generar desenfoque de movimiento. Debe contener una sola cuadrícula vectorial o 3 cuadrículas de flotantes." + +msgid "Computes new tightened bounding boxes taking into account the removed objects. This can be an expensive operation - turn on with care." +msgstr "Calcula nuevas cajas de límites ajustadas teniendo en cuenta los objetos eliminados. Esta puede ser una operación costosa - activar con cuidado." + +msgid "Modifies the Data and/or Display Window, in a way that is either user-defined, or can be driven by the existing Data or Display Window." +msgstr "Modifica la ventana de datos y/o visualización, de una manera definida por el usuario, o que puede ser controlada por la ventana de datos o visualización existente." + +msgid "Maximum number of frames to batch together when dispatching tasks. If the node requires sequence execution `batchSize` will be ignored." +msgstr "Número máximo de fotogramas a agrupar al despachar tareas. Si el nodo requiere ejecución secuencial, `batchSize` será ignorado." + +msgid "Do vectors specify absolute positions in the source image, or relative offsets from the current pixel to the pixel in the source image." +msgstr "Indica si los vectores especifican posiciones absolutas en la imagen de origen, o desplazamientos relativos desde el píxel actual al píxel en la imagen de origen." + +msgid "Automatically turns the details of the displacement map into bump, wherever the mesh is not subdivided enough to properly capture them." +msgstr "Convierte automáticamente los detalles del mapa de desplazamiento en bump, donde la malla no esté suficientemente subdividida para capturarlos correctamente." + +msgid "Name of the primitive variable that defines the angle component of the input orientations. This variable should contain FloatVectorData." +msgstr "Nombre de la variable primitiva que define el componente de ángulo de las orientaciones de entrada. Esta variable debe contener FloatVectorData." + +msgid "Name of the primitive variable that defines the direction in which the Y axis will be aimed. This variable should contain V3fVectorData." +msgstr "Nombre de la variable primitiva que define la dirección a la que se apuntará el eje Y. Esta variable debe contener V3fVectorData." + +msgid "Name of the primitive variable that defines the direction in which the X axis will be aimed. This variable should contain V3fVectorData." +msgstr "Nombre de la variable primitiva que define la dirección a la que se apuntará el eje X. Esta variable debe contener V3fVectorData." + +msgid "Name of the primitive variable that defines the direction in which the Z axis will be aimed. This variable should contain V3fVectorData." +msgstr "Nombre de la variable primitiva que define la dirección a la que se apuntará el eje Z. Esta variable debe contener V3fVectorData." + +msgid "Always uses the default display and view for the current config. Useful when changing configs often, or using context-sensitive configs." +msgstr "Siempre utiliza la visualización y vista predeterminadas de la configuración actual. Útil al cambiar configuraciones frecuentemente, o al usar configuraciones sensibles al contexto." + +msgid "Computes new tightened bounding boxes taking into account the removed locations. This can be an expensive operation - turn on with care." +msgstr "Calcula nuevas cajas de límites ajustadas teniendo en cuenta las ubicaciones eliminadas. Esta puede ser una operación costosa - activar con cuidado." + +msgid "The scene containing the target location to which objects are constrained. If this is unconnected, the main input scene is used instead." +msgstr "La escena que contiene la ubicación objetivo a la que se restringen los objetos. Si no está conectada, se utiliza la escena de entrada principal." + +msgid "The font to use - this should be a .ttf font file which is located on the paths specified by the IECORE_FONT_PATHS environment variable." +msgstr "La fuente a utilizar - debe ser un archivo de fuente .ttf ubicado en las rutas especificadas por la variable de entorno IECORE_FONT_PATHS." + +msgid "Converts a deep image into a \"flat\" image, by compositing all samples in each pixel, resulting in an image with 1 sample for every pixel." +msgstr "Convierte una imagen profunda en una imagen \"plana\", componiendo todas las muestras en cada píxel, resultando en una imagen con 1 muestra por píxel." + +msgid "The variables to be added. Each variable is represented as a child plug, created either through the UI or using the CompoundDataPlug API." +msgstr "Las variables a añadir. Cada variable se representa como un conector secundario, creado a través de la interfaz o usando la API CompoundDataPlug." + +msgid "A reference axis which the randomisation is specified relative to. Typically this would be the primary axis of the model being instanced." +msgstr "Un eje de referencia respecto al cual se especifica la aleatorización. Normalmente sería el eje principal del modelo que se está instanciando." + +msgid "The value that the row names will be matched against. Typically this will refer to a Context Variable using the `${variableName}` syntax." +msgstr "El valor contra el que se compararán los nombres de fila. Normalmente se referirá a una variable de contexto usando la sintaxis `${variableName}`." + +msgid "Name of the primitive variable to read. The same name will be used for the context variables available to the upstream prototype network." +msgstr "Nombre de la variable primitiva a leer. El mismo nombre se usará para las variables de contexto disponibles en la red de prototipos anterior." + +msgid "A constant thickness value for the whole image. Transparent images will be interpreted as fog where the density increases over this range." +msgstr "Un valor de grosor constante para toda la imagen. Las imágenes transparentes se interpretarán como niebla donde la densidad aumenta sobre este rango." + +msgid "The bounding boxes of each tile. > Note : Each input image will be scaled to fit entirely within its tile > while preserving aspect ratio." +msgstr "Las cajas de límites de cada bloque. > Nota: Cada imagen de entrada se escalará para caber completamente dentro de su bloque > manteniendo la proporción de aspecto." + +msgid "Add a border between the edge of the camera frustum and the target. 0.1 adds a 10% border. Using negative padding moves the camera closer." +msgstr "Añadir un borde entre el límite del frustum de la cámara y el objetivo. 0.1 añade un borde del 10%. Usar relleno negativo acerca la cámara." + +msgid "The context variable used to vary the values of the inputs being collected. This should be used in the node network upstream of the inputs." +msgstr "La variable de contexto utilizada para variar los valores de las entradas que se están recopilando. Debe usarse en la red de nodos anterior a las entradas." + +msgid "Defines additional scene locations to be made accessible via the `pointcloud_search()`, `pointcloud_get()` and `transform()` OSL functions." +msgstr "Define ubicaciones de escena adicionales que se harán accesibles mediante las funciones OSL `pointcloud_search()`, `pointcloud_get()` y `transform()`." + +msgid "The value that the input names will be matched against. Typically this will refer to a Context Variable using the `${variableName}` syntax." +msgstr "El valor contra el que se compararán los nombres de entrada. Normalmente se referirá a una variable de contexto usando la sintaxis `${variableName}`." + +msgid "Sets global scene options applicable to the Cycles renderer. Use the StandardOptions node to set global options applicable to all renderers." +msgstr "Establece opciones globales de escena aplicables al renderizador Cycles. Utilizar el nodo StandardOptions para establecer opciones globales aplicables a todos los renderizadores." + +msgid "The names of metadata entries to be copied. This is a space separated list of entry names, which accepts Gaffer's standard string wildcards." +msgstr "Los nombres de las entradas de metadatos a copiar. Es una lista separada por espacios de nombres de entradas, que acepta los comodines estándar de Gaffer." + +msgid "The names of the channels to be written to the file. Names should be separated by spaces and may contain any of Gaffer's standard wildcards." +msgstr "Los nombres de los canales a escribir en el archivo. Los nombres deben estar separados por espacios y pueden contener cualquiera de los comodines estándar de Gaffer." + +msgid "The colour that input pixels at the blackPoint become in the output image. This can be thought of as lifting the darker values of the image." +msgstr "El color en que se convierten los píxeles de entrada en el blackPoint en la imagen de salida. Puede entenderse como elevar los valores más oscuros de la imagen." + +msgid "Sets global scene options applicable to the Arnold renderer. Use the StandardOptions node to set global options applicable to all renderers." +msgstr "Establece opciones globales de escena aplicables al renderizador Arnold. Utilizar el nodo StandardOptions para establecer opciones globales aplicables a todos los renderizadores." + +msgid "The names of metadata entries to be removed. This is a space separated list of entry names, which accepts Gaffer's standard string wildcards." +msgstr "Los nombres de las entradas de metadatos a eliminar. Es una lista separada por espacios de nombres de entradas, que acepta los comodines estándar de Gaffer." + +msgid "The up vector, specified in object space. The object will be transformed so that this vector points up in world space, as far as is possible." +msgstr "El vector hacia arriba, especificado en espacio de objeto. El objeto se transformará para que este vector apunte hacia arriba en espacio mundial, en la medida de lo posible." + +msgid "A float primitive variable used to specify a varying point density across the surface of the mesh. Multiplied with the density setting above." +msgstr "Una variable primitiva de tipo flotante utilizada para especificar una densidad de puntos variable sobre la superficie de la malla. Se multiplica con la configuración de densidad anterior." + +msgid "The command to run. This may reference any of the variables by name, and also the node itself as `self` and the current Context as `context`." +msgstr "El comando a ejecutar. Puede referenciar cualquiera de las variables por nombre, y también el nodo mismo como `self` y el contexto actual como `context`." + +msgid "Shows objects with USD purposes that match the global `option:render:includedPurposes` variable which can be set from a StandardOptions node." +msgstr "Muestra objetos con propósitos USD que coincidan con la variable global `option:render:includedPurposes` que se puede establecer desde un nodo StandardOptions." + +msgid "Applies colour transformations provided by OpenColorIO. Configs are loaded from the configuration specified by the OCIO environment variable." +msgstr "Aplica transformaciones de color proporcionadas por OpenColorIO. Las configuraciones se cargan desde la configuración especificada por la variable de entorno OCIO." + +msgid "Maintains the subtree's attributes (including shader assignments) by applying the `root` location's full attributes to the subtree's children." +msgstr "Mantiene los atributos del subárbol (incluyendo asignaciones de shader) aplicando los atributos completos de la ubicación `root` a los secundarios del subárbol." + +msgid "The colour that input pixels at the whitePoint become in the output image. This can be thought of as defining the lighter values of the image." +msgstr "El color en que se convierten los píxeles de entrada en el whitePoint en la imagen de salida. Puede entenderse como definir los valores más claros de la imagen." + +msgid "The compression level used when writing files with DWAA or DWAB compression. Higher values decrease file size at the expense of image quality." +msgstr "El nivel de compresión utilizado al escribir archivos con compresión DWAA o DWAB. Valores más altos reducen el tamaño del archivo a expensas de la calidad de imagen." + +msgid "The filter used when transforming the image. Each filter provides different tradeoffs between sharpness and the danger of aliasing or ringing." +msgstr "El filtro utilizado al transformar la imagen. Cada filtro proporciona diferentes compromisos entre nitidez y el riesgo de aliasing o resonancia." + +msgid "Provides the colour mapping for the False Color mode. Values between min and max are remapped using the colours from the ramp (left to right)." +msgstr "Proporciona el mapeo de color para el modo de falso color. Los valores entre mínimo y máximo se reasignan usando los colores de la rampa (de izquierda a derecha)." + +msgid "The name of the Context Variable defined by the wedge. This should be used in upstream expressions to apply the wedged value to specific nodes." +msgstr "El nombre de la variable de contexto definida por la cuña. Debe usarse en expresiones anteriores para aplicar el valor de cuña a nodos específicos." + +msgid "Turn on to blend with adjacent pixels when sampling away from the center of the pixel at 0.5, 0.5. If off, you always sample exactly one pixel." +msgstr "Activar para mezclar con píxeles adyacentes al muestrear lejos del centro del píxel en 0.5, 0.5. Si está desactivado, siempre se muestrea exactamente un píxel." + +msgid "Divides selected channels by a specified alpha channel. If the alpha channel on a pixel is 0, then that pixel will remain the same as the input." +msgstr "Divide los canales seleccionados por un canal alfa especificado. Si el canal alfa de un píxel es 0, ese píxel permanecerá igual que la entrada." + +msgid "Name of the primitive variable that will be created to store the output orientations as matrices. The matrices will be stored as M33fVectorData." +msgstr "Nombre de la variable primitiva que se creará para almacenar las orientaciones de salida como matrices. Las matrices se almacenarán como M33fVectorData." + +msgid "The names of the primitive variables to be affected. Names should be separated by spaces, and Gaffer's standard wildcard characters may be used." +msgstr "Los nombres de las variables primitivas a afectar. Los nombres deben estar separados por espacios y se pueden usar los caracteres comodín estándar de Gaffer." + +msgid "When enabled, global attributes matching the names in `attributes` will be localised if an equivalent local or inherited attribute is not found." +msgstr "Cuando está activado, los atributos globales que coincidan con los nombres en `attributes` se localizarán si no se encuentra un atributo local o heredado equivalente." + +msgid "If non-empty, only UDIMs in this list will be baked. The formatting is the same as a frame list: comma separated, with dashes indicating ranges." +msgstr "Si no está vacío, solo se hornearán los UDIMs de esta lista. El formato es el mismo que una lista de fotogramas: separados por comas, con guiones indicando rangos." + +msgid "A transformation applied to the rectangle. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees." +msgstr "Una transformación aplicada al rectángulo. Los valores de traslación y pivote se especifican en píxeles, y el valor de rotación se especifica en grados." + +msgid "The name of the shader parameter used to perform the visualisation. The default value is for an OpenGL shader which will be used in the viewport." +msgstr "El nombre del parámetro del shader utilizado para realizar la visualización. El valor predeterminado es para un shader OpenGL que se usará en el visor." + +msgid "The size of the blur in pixels. This can be varied independently in the x and y directions, and fractional values are supported for fine control." +msgstr "El tamaño del desenfoque en píxeles. Puede variarse independientemente en las direcciones X e Y, y se admiten valores fraccionarios para un control preciso." + +msgid "A transformation applied to the entire ramp. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees." +msgstr "Una transformación aplicada a toda la rampa. Los valores de traslación y pivote se especifican en píxeles, y el valor de rotación se especifica en grados." + +msgid "The primitive variable that provides the positions to find the closest point to. This defaults to \"P\", the vertex position of the sampling object." +msgstr "La variable primitiva que proporciona las posiciones para encontrar el punto más cercano. Por defecto es \"P\", la posición del vértice del objeto de muestreo." + +msgid "The names of the attributes to localise. These should be separated by spaces and can use Gaffer's standard wildcards to match multiple attributes." +msgstr "Los nombres de los atributos a localizar. Deben estar separados por espacios y pueden usar los comodines estándar de Gaffer para coincidir con múltiples atributos." + +msgid "The parameters to be added - any number of arbitrary parameters may be specified here using either the user interface or the CompoundDataPlug API." +msgstr "Los parámetros a añadir - se puede especificar cualquier número de parámetros arbitrarios aquí usando la interfaz de usuario o la API CompoundDataPlug." + +msgid "The name of the primitive variable used to store the projected UV coordinates. This may be changed to store multiple sets of UVs on a single mesh." +msgstr "El nombre de la variable primitiva utilizada para almacenar las coordenadas UV proyectadas. Puede cambiarse para almacenar múltiples conjuntos de UVs en una sola malla." + +msgid "The compression quality for the Jpeg file to be written. A value between 0 (low quality, high compression) and 100 (high quality, low compression)." +msgstr "La calidad de compresión del archivo JPEG a escribir. Un valor entre 0 (baja calidad, alta compresión) y 100 (alta calidad, baja compresión)." + +msgid "The definition of the shuffling to be performed - an arbitrary number of channel edits can be made by adding ShufflePlugs as children of this plug." +msgstr "La definición de la reorganización a realizar - se puede hacer un número arbitrario de ediciones de canal añadiendo ShufflePlugs como secundarios de este conector." + +msgid "The compression quality for the WebP file to be written. A value between 0 (low quality, high compression) and 100 (high quality, low compression)." +msgstr "La calidad de compresión del archivo WebP a escribir. Un valor entre 0 (baja calidad, alta compresión) y 100 (alta calidad, baja compresión)." + +msgid "The names of the attributes to be copied. These should be separated by spaces and can use Gaffer's standard wildcards to match multiple attributes." +msgstr "Los nombres de los atributos a copiar. Deben estar separados por espacios y pueden usar los comodines estándar de Gaffer para coincidir con múltiples atributos." + +msgid "Name of the primitive variable that defines the input orientation as euler angles, measured in degrees. This variable should contain V3fVectorData." +msgstr "Nombre de la variable primitiva que define la orientación de entrada como ángulos de Euler, medidos en grados. Esta variable debe contener V3fVectorData." + +msgid "The reference frame used by the `keepReferencePosition` mode. The constraint is adjusted so that the original position at this frame is maintained." +msgstr "El fotograma de referencia utilizado por el modo `keepReferencePosition`. La restricción se ajusta para que la posición original en este fotograma se mantenga." + +msgid "Causes the node to not error when attempting to copy primitive variables from the source object that are not compatible with the destination object." +msgstr "Hace que el nodo no genere un error al intentar copiar variables primitivas del objeto de origen que no son compatibles con el objeto de destino." + +msgid "The pixel filter used when transforming the image. Each filter provides different tradeoffs between sharpness and the danger of aliasing or ringing." +msgstr "El filtro de píxel utilizado al transformar la imagen. Cada filtro proporciona diferentes compromisos entre nitidez y el riesgo de aliasing o resonancia." + +msgid "The name of an integer primitive variable that specifies the index of the curve to be sampled. If left unspecified, the first curve will be sampled." +msgstr "El nombre de una variable primitiva entera que especifica el índice de la curva a muestrear. Si se deja sin especificar, se muestreará la primera curva." + +msgid "If you select world space, the created attributes will contain a concatenation of all transforms from the root of the scene to the current location." +msgstr "Indica si se selecciona espacio mundial, los atributos creados contendrán una concatenación de todas las transformaciones desde la raíz de la escena hasta la ubicación actual." + +msgid "Changing the seedPermutation changes the mapping of ids to seeds. This results in a different grouping of which instances end up with the same seed." +msgstr "Cambiar seedPermutation cambia el mapeo de ids a semillas. Esto resulta en un agrupamiento diferente de qué instancias terminan con la misma semilla." + +msgid "Translates objects so that they are constrained to the world space position of the target. Leaves the scale and orientation of the object untouched." +msgstr "Traslada objetos para que estén restringidos a la posición en espacio mundial del objetivo. Deja la escala y orientación del objeto sin modificar." + +msgid "The names of the new suffixes to add to copies of the target primitive variables. The new suffixed variables will be copied from different Contexts." +msgstr "Los nombres de los nuevos sufijos a añadir a copias de las variables primitivas objetivo. Las nuevas variables con sufijo se copiarán de diferentes contextos." + +msgid "The transformation to be applied to the image. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees." +msgstr "Transformación aplicada a la imagen. Los valores de traslación y pivote se especifican en píxeles, y el valor de rotación se especifica en grados." + +msgid "The type of geometry to create when shape is set to \"Geometry\". This should contain the name of a geometry type specific to the renderer being used." +msgstr "El tipo de geometría a crear cuando la forma está establecida en \"Geometry\". Debe contener el nombre de un tipo de geometría específico del renderizador utilizado." + +msgid "The definition of the shuffling to be performed - an arbitrary number of metadata edits can be made by adding ShufflePlugs as children of this plug." +msgstr "La definición de la reorganización a realizar - se puede hacer un número arbitrario de ediciones de metadatos añadiendo ShufflePlugs como secundarios de este conector." + +msgid "Specifies the name to be stored in EXR's part name metadata. If different channels are given different part names, then a multipart file is produced." +msgstr "Especifica el nombre a almacenar en los metadatos de nombre de parte del EXR. Si se dan diferentes nombres de parte a diferentes canales, se produce un archivo multiparte." + +msgid "The filter used to determine which objects in the `in` scene will receive primitive variables sampled from the `sourceLocation` in the `source` scene." +msgstr "El filtro utilizado para determinar qué objetos en la escena `in` recibirán variables primitivas muestreadas de la `sourceLocation` en la escena `source`." + +msgid "Whether this light is muted. When toggled, the attribute \\\"light:mute\\\" will be set to true. When not toggled, it will be omitted from the attributes." +msgstr "Indica si esta luz está silenciada. Cuando se activa, el atributo \\\"light:mute\\\" se establecerá en verdadero. Cuando no se activa, se omitirá de los atributos." + +msgid "The pixel filter used when resizing the input images. Each filter provides different tradeoffs between sharpness and the danger of aliasing or ringing." +msgstr "El filtro de píxel utilizado al redimensionar las imágenes de entrada. Cada filtro proporciona diferentes compromisos entre nitidez y el riesgo de aliasing o resonancia." + +msgid "The definition of the shuffling to be performed - an arbitrary number of render pass edits can be made by adding ShufflePlugs as children of this plug." +msgstr "La definición de la reorganización a realizar - se puede hacer un número arbitrario de ediciones de pases de render añadiendo ShufflePlugs como secundarios de este conector." + +msgid "A prefix applied to the name of each option. For example, a prefix of \"myCategory:\" and a name of \"test\" will create an option named \"myCategory:test\"." +msgstr "Un prefijo aplicado al nombre de cada opción. Por ejemplo, un prefijo de \"myCategory:\" y un nombre de \"test\" creará una opción llamada \"myCategory:test\"." + +msgid "Uniformly interpolated int, float or bool primitive variable to choose which faces to delete. Note a non-zero value indicates the face will be deleted." +msgstr "Variable primitiva uniformemente interpolada de tipo int, float o bool para elegir qué caras eliminar. Un valor distinto de cero indica que la cara se eliminará." + +msgid "An explicit list of paths used to map between `prototypeIndex` and paths in the prototypes scene. This plug is only used in \"Indexed (Roots List)\" mode." +msgstr "Una lista explícita de rutas utilizada para mapear entre `prototypeIndex` y rutas en la escena de prototipos. Este conector solo se usa en el modo \"Indexed (Roots List)\"." + +msgid "The font to render the text with. This should be a .ttf font file which is located on the paths specified by the IECORE_FONT_PATHS environment variable." +msgstr "La fuente con la que renderizar el texto. Debe ser un archivo de fuente .ttf ubicado en las rutas especificadas por la variable de entorno IECORE_FONT_PATHS." + +msgid "A prefix to remove from the start of the original name. Prefixes are removed before the suffixes and before the find and replace operation is performed." +msgstr "Un prefijo a eliminar del inicio del nombre original. Los prefijos se eliminan antes que los sufijos y antes de la operación de buscar y reemplazar." + +msgid "Defines how the views listed in the views plug are treated. Delete mode deletes the listed views. Keep mode keeps the listed views, deleting all others." +msgstr "Define cómo se tratan las vistas listadas en el conector de vistas. El modo Eliminar borra las vistas listadas. El modo Conservar mantiene las vistas listadas, eliminando las demás." + +msgid "Changes the render type for PointsPrimitive objects. Depending on the renderer, points may be rendered as particles, spheres, disks, patches or blobbies." +msgstr "Cambia el tipo de render para objetos PointsPrimitive. Dependiendo del renderizador, los puntos pueden renderizarse como partículas, esferas, discos, parches o blobbies." + +msgid "Size of a voxel in the level set grid, specified in local space. Smaller voxel sizes will increase resolution, but take more memory and computation time." +msgstr "Tamaño de un vóxel en la cuadrícula de conjunto de nivel, especificado en espacio local. Tamaños de vóxel más pequeños aumentarán la resolución, pero requerirán más memoria y tiempo de cálculo." + +msgid "Uniformly interpolated int, float or bool primitive variable to choose which curves to delete. Note a non-zero value indicates the curve will be deleted." +msgstr "Variable primitiva uniformemente interpolada de tipo int, float o bool para elegir qué curvas eliminar. Un valor distinto de cero indica que la curva se eliminará." + +msgid "Context variable used to pass the index of the current tile to the upstream node network. This should be used to provide a different input image per tile." +msgstr "Variable de contexto utilizada para pasar el índice del bloque actual a la red de nodos anterior. Debe usarse para proporcionar una imagen de entrada diferente por bloque." + +msgid "The base type for scene nodes that merge locations into combined locations. Appropriate for nodes which merge primitives, or convert transforms to points." +msgstr "El tipo base para nodos de escena que combinan ubicaciones en ubicaciones unificadas. Apropiado para nodos que combinan primitivas o convierten transformaciones en puntos." + +msgid "Use a fixed frame to access the target at. This can be used to produce a consistent framing if the target has high-frequency animation you want to ignore." +msgstr "Usar un fotograma fijo para acceder al objetivo. Puede usarse para producir un encuadre consistente si el objetivo tiene animación de alta frecuencia que se desea ignorar." + +msgid "The name of the file to be written. File sequences with arbitrary padding may be specified using the '#' character as a placeholder for the frame numbers." +msgstr "El nombre del archivo a escribir. Las secuencias de archivos con relleno arbitrario pueden especificarse usando el carácter '#' como marcador de posición para los números de fotograma." + +msgid "Shader to be used for the light_blocker filter. UVs are only available if the geometry type is set to \"box\". Shading will need to be based on P otherwise." +msgstr "Shader a utilizar para el filtro light_blocker. Los UVs solo están disponibles si el tipo de geometría está establecido en \"box\". De lo contrario, el sombreado deberá basarse en P." + +msgid "Defines how the names listed in the `names` plug are treated. Delete mode deletes the listed names. Keep mode keeps the listed names, deleting all others." +msgstr "Define cómo se tratan los nombres listados en el conector `names`. El modo Eliminar borra los nombres listados. El modo Conservar mantiene los nombres listados, eliminando los demás." + +msgid "Specifies which set or sets to apply the override to. This can be a name, or a match string. Right-click to insert the name of any set in the input scene." +msgstr "Especifica a qué conjunto o conjuntos aplicar la sobrescritura. Puede ser un nombre o una cadena de coincidencia. Hacer clic derecho para insertar el nombre de cualquier conjunto en la escena de entrada." + +msgid "The names of the primitive variables to be copied. These should be separated by spaces and can use Gaffer's standard wildcards to match multiple variables." +msgstr "Los nombres de las variables primitivas a copiar. Deben estar separados por espacios y pueden usar los comodines estándar de Gaffer para coincidir con múltiples variables." + +msgid "The name to give to the location. This is how it will be referred to from OSL in the `pointcloud_search()`, `pointcloud_get()` and `transform()` functions." +msgstr "El nombre a dar a la ubicación. Así es como se referenciará desde OSL en las funciones `pointcloud_search()`, `pointcloud_get()` y `transform()`." + +msgid "Ignores tweaks targeting missing context variables. When off, missing context variables cause the node to error, unless the tweak mode is `CreateIfMissing`." +msgstr "Ignora los ajustes dirigidos a variables de contexto faltantes. Cuando está desactivado, las variables de contexto faltantes causan un error en el nodo, a menos que el modo de ajuste sea `CreateIfMissing`." + +msgid "Arbitrary attributes which are applied to the light. Typical uses include setting renderer specific visibility attributes to hide the shape from the camera." +msgstr "Atributos arbitrarios que se aplican a la luz. Los usos típicos incluyen establecer atributos de visibilidad específicos del renderizador para ocultar la forma de la cámara." + +msgid "The handle of the upstream shader being fetched by this proxy - or Auto, indicating that the original input of the parameter being ShaderTweaked will be used." +msgstr "El identificador del shader anterior que este proxy obtiene - o Auto, indicando que se usará la entrada original del parámetro que se está ajustando con ShaderTweak." + +msgid "For a constant primitive variable, this is just the value of the primitive variable. For non-constant primitive variables, this is the value for each element." +msgstr "Para una variable primitiva constante, es simplemente el valor de la variable primitiva. Para variables primitivas no constantes, es el valor de cada elemento." + +msgid "This Context Variable will be set with the current layer name when evaluating the in plug. This allows you to vary the upstream processing for each new layer." +msgstr "Esta variable de contexto se establecerá con el nombre de la capa actual al evaluar el conector de entrada. Esto permite variar el procesamiento anterior para cada nueva capa." + +msgid "An offset added to the texture coordinates. Note that moving the texture coordinates in the positive direction will move the texture in the negative direction." +msgstr "Un desplazamiento añadido a las coordenadas de textura. Tenga en cuenta que mover las coordenadas de textura en dirección positiva moverá la textura en dirección negativa." + +msgid "Assigns a background shader. This is stored as an \"ai:background\" option in Gaffer's globals, and translated onto the `options.background` parameter in Arnold." +msgstr "Asigna un shader de fondo. Se almacena como una opción \"ai:background\" en los globales de Gaffer, y se traduce al parámetro `options.background` en Arnold." + +msgid "The resolution to use for each texture file written. May be overridden per mesh by specifying the \"bake:resolution\" integer attribute on the meshes to be baked." +msgstr "La resolución a utilizar para cada archivo de textura escrito. Puede sobrescribirse por malla especificando el atributo entero \"bake:resolution\" en las mallas a hornear." + +msgid "The name of the primitive variable created to store the UV distortion values. This will contain a V2f with separate distortion values for the U and V directions." +msgstr "El nombre de la variable primitiva creada para almacenar los valores de distorsión UV. Contendrá un V2f con valores de distorsión separados para las direcciones U y V." + +msgid "Applies a random rotation away from the axis, specified in degrees. The maximum spread of 180 degrees gives a uniform randomisation over all possible directions." +msgstr "Aplica una rotación aleatoria alejada del eje, especificada en grados. La dispersión máxima de 180 grados da una aleatorización uniforme sobre todas las direcciones posibles." + +msgid "Keeps all cameras, regardless of other settings. This is useful when isolating an asset but wanting to render it through a camera located elsewhere in the scene." +msgstr "Conserva todas las cámaras, independientemente de otras configuraciones. Esto es útil al aislar un recurso pero querer renderizarlo a través de una cámara ubicada en otra parte de la escena." + +msgid "Add a camera tweak. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or via the CameraTweaks API in Python." +msgstr "Añadir un ajuste de cámara. Se pueden añadir números arbitrarios de ajustes definidos por el usuario como secundarios de este conector a través de la interfaz, o mediante la API CameraTweaks en Python." + +msgid "Allows the randomly generated set colors to be overridden by specific colors to use for Sets matching the supplied filter. This can be a name, or a match string." +msgstr "Permite sobrescribir los colores de conjunto generados aleatoriamente con colores específicos para conjuntos que coincidan con el filtro proporcionado. Puede ser un nombre o una cadena de coincidencia." + +msgid "This suffix defines where the aov shader is stored in the render options. If you use an existing suffix, you will overwrite instead of creating a new AOV shader." +msgstr "Este sufijo define dónde se almacena el shader de VAS en las opciones de render. Si se usa un sufijo existente, se sobrescribirá en lugar de crear un nuevo shader de VAS." + +msgid "A transformation applied to the entire checkerboard pattern. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees." +msgstr "Una transformación aplicada a todo el patrón de tablero de ajedrez. Los valores de traslación y pivote se especifican en píxeles, y el valor de rotación se especifica en grados." + +msgid "The name of the shader to query. > Note : If the shader does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "El nombre del shader a consultar. > Nota: Si el shader no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "Whether to intersect the defined area with the input Data Window. It will never pad black onto the Data Window, it will only ever reduce the existing Data Window." +msgstr "Indica si se debe intersecar el área definida con la ventana de datos de entrada. Nunca añadirá negro a la ventana de datos, solo reducirá la ventana de datos existente." + +msgid "Scatters points evenly over the surface of meshes. This can be particularly useful in conjunction with the Instancer, which can then apply instances to each point." +msgstr "Dispersa puntos uniformemente sobre la superficie de las mallas. Puede ser particularmente útil junto con el Instancer, que puede entonces aplicar instancias a cada punto." + +msgid "The names of per-vertex primitive variables to be turned into per-instance attributes. Names should be separated by spaces and can use Gaffer's standard wildcards." +msgstr "Los nombres de las variables primitivas por vértice a convertir en atributos por instancia. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer." + +msgid "Defines how the channels listed in the channels plug are treated. Delete mode deletes the listed channels. Keep mode keeps the listed channels, deleting all others." +msgstr "Define cómo se tratan los canales listados en el conector de canales. El modo Eliminar borra los canales listados. El modo Conservar mantiene los canales listados, eliminando los demás." + +msgid "The renderer the shader should affect. Shaders assigned to a specific renderer will take precedence over shaders assigned to \"All\" when rendering with that renderer." +msgstr "El renderizador que el shader debe afectar. Los shaders asignados a un renderizador específico tendrán prioridad sobre los shaders asignados a \"All\" al renderizar con ese renderizador." + +msgid "The names of the channels to be deleted (or kept if the mode is set to Keep). Names should be separated by spaces and may contain any of Gaffer's standard wildcards." +msgstr "Los nombres de los canales a eliminar (o conservar si el modo está establecido en Conservar). Los nombres deben estar separados por espacios y pueden contener cualquiera de los comodines estándar de Gaffer." + +msgid "The location in the source scene that attributes are copied from. By default, attributes are copied from the location equivalent to the one they are being copied to." +msgstr "La ubicación en la escena de origen de la que se copian los atributos. Por defecto, los atributos se copian de la ubicación equivalente a la que se están copiando." + +msgid "A context variable created to pass the name of the set being processed to the nodes connected to the `filter` plug. This can be used to vary the filter for each set." +msgstr "Una variable de contexto creada para pasar el nombre del conjunto que se está procesando a los nodos conectados al conector `filter`. Puede usarse para variar el filtro para cada conjunto." + +msgid "The name of the primitive variable containing uvs which will determine how the mesh is unwrapped for baking. Must be a Face-Varying or Vertex V2f primitive variable." +msgstr "El nombre de la variable primitiva que contiene UVs que determinarán cómo se desenvuelve la malla para el horneado. Debe ser una variable primitiva V2f Face-Varying o Vertex." + +msgid "A JSON file containing a Cryptomatte manifest. File sequences with arbitrary padding may be specified using the '#' character as a placeholder for the frame numbers." +msgstr "Un archivo JSON que contiene un manifiesto Cryptomatte. Las secuencias de archivos con relleno arbitrario pueden especificarse usando el carácter '#' como marcador de posición para los números de fotograma." + +msgid "The name of the attribute to be visualised. The value of the attribute will be converted to a colour using the chosen mode and then assigned using a constant shader." +msgstr "El nombre del atributo a visualizar. El valor del atributo se convertirá a un color usando el modo elegido y luego se asignará usando un shader constante." + +msgid "Samples primitive variables from the closest point on the surface of a source primitive, and transfers the values onto new primitive variable on the sampling objects." +msgstr "Muestrea variables primitivas del punto más cercano en la superficie de una primitiva de origen, y transfiere los valores a nuevas variables primitivas en los objetos de muestreo." + +msgid "When off, having the same ids on multiple points is considered an error. Setting on will allow a render to proceed, with all instances that share an id being omitted." +msgstr "Cuando está desactivado, tener los mismos ids en múltiples puntos se considera un error. Activar permitirá que un render continúe, omitiendo todas las instancias que comparten un id." + +msgid "The number of possible seed values. Increasing this allows for more different variations to be driven by the seed, increasing the total number of variations required." +msgstr "El número de valores de semilla posibles. Aumentar esto permite que más variaciones diferentes sean controladas por la semilla, incrementando el número total de variaciones requeridas." + +msgid "The names of render passes to be deleted (or kept if the mode is set to Keep). Names should be separated by spaces and may contain any of Gaffer's standard wildcards." +msgstr "Los nombres de los pases de render a eliminar (o conservar si el modo está establecido en Conservar). Los nombres deben estar separados por espacios y pueden contener cualquiera de los comodines estándar de Gaffer." + +msgid "The names of the primitive variables to be extracted from VDB points grid. Names should be separated by spaces, and Gaffer's standard wildcard characters may be used." +msgstr "Los nombres de las variables primitivas a extraer de la cuadrícula de puntos VDB. Los nombres deben estar separados por espacios y se pueden usar los caracteres comodín estándar de Gaffer." + +msgid "The results of the search, converted to a list of strings. This is useful for connecting directly to other plugs, such as `Wedge.strings` or `CollectScenes.rootNames`." +msgstr "Los resultados de la búsqueda, convertidos a una lista de cadenas. Esto es útil para conectar directamente a otros conectores, como `Wedge.strings` o `CollectScenes.rootNames`." + +msgid "The indices of the input array that have incoming connections. > Tip : This can be used to drive a Wedge or Collect node so that > they operate over each input in turn." +msgstr "Los índices del arreglo de entrada que tienen conexiones entrantes. > Consejo: Esto puede usarse para controlar un nodo Wedge o Collect de modo que operen sobre cada entrada a su vez." + +msgid "The name of the attribute to query. > Note : If the attribute does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "El nombre del atributo a consultar. > Nota: Si el atributo no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "The number of steps in the value range defined when in \"Float Range\" mode. The steps are distributed evenly between the min and max values. Has no effect in other modes." +msgstr "El número de pasos en el rango de valores definido en el modo \"Float Range\". Los pasos se distribuyen uniformemente entre los valores mínimo y máximo. No tiene efecto en otros modos." + +msgid "Mirrors the image, flipping it in the horizontal and/or vertical directions. Unlike the ImageTransform node, this performs no filtering, so pixel values are not changed." +msgstr "Refleja la imagen, volteándola en dirección horizontal y/o vertical. A diferencia del nodo ImageTransform, no realiza filtrado, por lo que los valores de píxel no cambian." + +msgid "The end frame. This doesn't enforce anything, but is typically used by dispatchers to control default frame ranges, and by the UI to define the range of the time slider." +msgstr "El fotograma final. No impone nada, pero normalmente es utilizado por los despachadores para controlar los rangos de fotogramas predeterminados, y por la interfaz para definir el rango del control deslizante de tiempo." + +msgid "The name of a primitive variable containing a mask. The variable must match the specified interpolation. Any elements where the mask variable is non-zero will be tweaked." +msgstr "El nombre de una variable primitiva que contiene una máscara. La variable debe coincidir con la interpolación especificada. Los elementos donde la variable de máscara sea distinta de cero serán ajustados." + +msgid "The orthographic aperture used when converting distant lights ( which are theoretically infinite in extent ). May be overridden by the visualisation setting on the light." +msgstr "La apertura ortográfica utilizada al convertir luces distantes (que son teóricamente infinitas en extensión). Puede ser sobrescrita por la configuración de visualización de la luz." + +msgid "Whether or not the files exists and can be read into memory, value calculated per frame if an image sequence. MissingFrameMode does not change the behaviour of this plug." +msgstr "Indica si los archivos existen y pueden leerse en memoria, valor calculado por fotograma si es una secuencia de imágenes. MissingFrameMode no cambia el comportamiento de este conector." + +msgid "Samples primitive variables from specified UV positions on the surface of a source primitive, and transfers the values onto new primitive variables on the sampling object." +msgstr "Muestrea variables primitivas de posiciones UV especificadas en la superficie de una primitiva de origen, y transfiere los valores a nuevas variables primitivas en el objeto de muestreo." + +msgid "Adjusts bounding boxes to take account of the merging operation. > Caution : This has considerable overhead when the `objectsMode` and/or > `transformsMode` is not `Keep`." +msgstr "Ajusta las cajas de límites para tener en cuenta la operación de combinación. > Precaución: Esto tiene un costo considerable cuando `objectsMode` y/o `transformsMode` no es `Keep`." + +msgid "The start frame. This doesn't enforce anything, but is typically used by dispatchers to control default frame ranges, and by the UI to define the range of the time slider." +msgstr "El fotograma inicial. No impone nada, pero normalmente es utilizado por los despachadores para controlar los rangos de fotogramas predeterminados, y por la interfaz para definir el rango del control deslizante de tiempo." + +msgid "Performs offline batch rendering using any of the available renderer backends, or optionally writes scene descriptions to disk for later rendering via a SystemCommand node." +msgstr "Realiza renderizado por lotes fuera de línea usando cualquiera de los backends de renderizado disponibles, u opcionalmente escribe descripciones de escena a disco para renderizar después mediante un nodo SystemCommand." + +msgid "The method used to define the range of values used by the wedge. It is possible to define numeric or color ranges, and also to specify explicit lists of numbers or strings." +msgstr "El método utilizado para definir el rango de valores usados por la cuña. Es posible definir rangos numéricos o de color, y también especificar listas explícitas de números o cadenas." + +msgid "When enabled, objects that inherit Set membership from their parents will also be coloured. Disabling this will only color objects that are exactly matched by any given Set." +msgstr "Cuando está activado, los objetos que heredan membresía de conjunto de sus primarios también se colorearán. Desactivar esto solo coloreará objetos que coincidan exactamente con un conjunto dado." + +msgid "The metadata to be applied - arbitrary numbers of user defined metadata may be added as children of this plug via the user interface, or using the CompoundDataPlug python API" +msgstr "Metadatos aplicados - se pueden añadir números arbitrarios de metadatos definidos por el usuario como secundarios de este conector a través de la interfaz, o usando la API Python de CompoundDataPlug" + +msgid "A space separated list of attribute names ( may use wildcards ), to collect from meshes which have UDIMs, and return as part of the output. Inherited attributes are included." +msgstr "Una lista separada por espacios de nombres de atributos (puede usar comodines), a recopilar de mallas que tienen UDIMs, y devolver como parte de la salida. Se incluyen atributos heredados." + +msgid "The transform to be applied to the copies. The transform is applied iteratively, so the second copy is transformed twice, the third copy is transformed three times and so on." +msgstr "Transformación aplicada a las copias. Se aplica iterativamente, así que la segunda copia se transforma dos veces, la tercera copia tres veces y así sucesivamente." + +msgid "Deep images may optionally have a ZBack channel - for transparent samples, this specifies the depth range over which the opacity gradually increases from 0 to the alpha value." +msgstr "Las imágenes profundas pueden opcionalmente tener un canal ZBack - para muestras transparentes, esto especifica el rango de profundidad sobre el cual la opacidad aumenta gradualmente de 0 al valor alfa." + +msgid "The precise location of the target transform - this can be derived from the origin, bounding box or from a specific primitive uv coordinate or vertex id of the target location." +msgstr "La ubicación precisa de la transformación objetivo - puede derivarse del origen, la caja de límites o de una coordenada UV primitiva específica o id de vértice de la ubicación objetivo." + +msgid "The Arnold shader that provides the displacement map. Connect a float or colour input to displace along the object normals or a vector input to displace in a specific direction." +msgstr "El shader de Arnold que proporciona el mapa de desplazamiento. Conectar una entrada de flotante o color para desplazar a lo largo de las normales del objeto, o una entrada de vector para desplazar en una dirección específica." + +msgid "The number of steps in the wedge range defined when in \"Colour Range\" mode. The steps are distributed evenly from the start to the end of the ramp. Has no effect in other modes." +msgstr "El número de pasos en el rango de cuña definido en el modo \"Colour Range\". Los pasos se distribuyen uniformemente desde el inicio hasta el final de la rampa. No tiene efecto en otros modos." + +msgid "The options to be applied - arbitrary numbers of user defined options may be added as children of this plug via the user interface, or using the CompoundDataPlug API via python." +msgstr "Opciones aplicadas - se pueden añadir números arbitrarios de opciones definidas por el usuario como secundarios de este conector a través de la interfaz, o usando la API CompoundDataPlug mediante Python." + +msgid "Turns mesh primitives into Cycles mesh lights by assigning an emission shader, turning off all visibility except for camera rays, and adding the meshes to the default lights set." +msgstr "Convierte primitivas de malla en luces de malla de Cycles asignando un shader de emisión, desactivando toda la visibilidad excepto para rayos de cámara, y añadiendo las mallas al conjunto de luces predeterminado." + +msgid "The name of the destination data to be created. Use `${source}` to insert the name of the source data. For example, to prepend `prefix:` set the destination to `prefix:${source}`." +msgstr "El nombre de los datos de destino a crear. Utilizar `${source}` para insertar el nombre de los datos de origen. Por ejemplo, para anteponer `prefix:` establecer el destino como `prefix:${source}`." + +msgid "Turns mesh primitives into Arnold mesh lights by assigning a mesh_light shader, turning off all visibility except for camera rays, and adding the meshes to the default lights set." +msgstr "Convierte primitivas de malla en luces de malla de Arnold asignando un shader mesh_light, desactivando toda la visibilidad excepto para rayos de cámara, y añadiendo las mallas al conjunto de luces predeterminado." + +msgid "Keeps all lights and light filters, regardless of other settings. This is useful when isolating an asset but wanting to render it using a light rig located elsewhere in the scene." +msgstr "Conserva todas las luces y filtros de luz, independientemente de otras configuraciones. Esto es útil al aislar un recurso pero querer renderizarlo usando una configuración de luces ubicada en otra parte de la escena." + +msgid "Convenience node for representing promoted plugs visually in the internal node graph of a Box. Don't create BoxIO nodes directly, instead use the BoxIn and BoxOut derived classes." +msgstr "Nodo de conveniencia para representar visualmente conectores promovidos en el gráfico de nodos interno de un Box. No crear nodos BoxIO directamente, usar las clases derivadas BoxIn y BoxOut." + +msgid "Option to use a non-standard `Smooth` subdivision rule that provides slightly better results at triangular faces in Catmull-Clark meshes than the standard Catmull-Clark algorithm." +msgstr "Opción para usar una regla de subdivisión `Smooth` no estándar que proporciona resultados ligeramente mejores en caras triangulares de mallas Catmull-Clark que el algoritmo estándar Catmull-Clark." + +msgid "The renderer to use. Default mode uses the `render:defaultRenderer` option from the input scene globals to choose the renderer. This can be authored using the StandardOptions node." +msgstr "El renderizador a utilizar. El modo predeterminado usa la opción `render:defaultRenderer` de los globales de la escena de entrada para elegir el renderizador. Esto puede configurarse usando el nodo StandardOptions." + +msgid "When using an id list to delete points, this primitive variable defines the id used for each point. If this primitive variable is not found, then the index of each point is its id." +msgstr "Al usar una lista de ids para eliminar puntos, esta variable primitiva define el id utilizado para cada punto. Si no se encuentra esta variable primitiva, entonces el índice de cada punto es su id." + +msgid "Specifies the list of images currently stored in the catalogue. Either add images interactively using the UI, or use the API to construct Catalogue.Image plugs and parent them here." +msgstr "Especifica la lista de imágenes actualmente almacenadas en el catálogo. Añadir imágenes interactivamente usando la interfaz, o usar la API para construir conectores Catalogue.Image y emparentarlos aquí." + +msgid "An output of the available frames for the given file sequence. Returns an empty vector when the input fileName is not a file sequence, even if it has a file-sequence-like structure." +msgstr "Una salida de los fotogramas disponibles para la secuencia de archivos dada. Devuelve un vector vacío cuando el fileName de entrada no es una secuencia de archivos, incluso si tiene una estructura similar a secuencia." + +msgid "The number of backups to keep for each script. Only used if the backup filename includes `${backup:number}`. When the backup limit is reached, the oldest backup will be overwritten." +msgstr "El número de copias de seguridad a mantener para cada script. Solo se usa si el nombre de archivo de respaldo incluye `${backup:number}`. Cuando se alcanza el límite, la copia de seguridad más antigua se sobrescribirá." + +msgid "The location which the children are parented under. This is ignored when a filter is connected, in which case the children are parented under all the locations matched by the filter." +msgstr "La ubicación bajo la cual se emparentan los secundarios. Esto se ignora cuando hay un filtro conectado, en cuyo caso los secundarios se emparentan bajo todas las ubicaciones coincidentes con el filtro." + +msgid "The tweaks to be made to the options. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or using the OptionTweaks API via python." +msgstr "Los ajustes a realizar en las opciones. Se pueden añadir números arbitrarios de ajustes definidos por el usuario como secundarios de este conector a través de la interfaz, o usando la API OptionTweaks mediante Python." + +msgid "The name of a constant primitive variable holding a list of ids to delete. Must be type IntVectorData or Int64VectorData. Only used when `selectionMode` is \"IdListPrimitiveVariable\"." +msgstr "El nombre de una variable primitiva constante que contiene una lista de ids a eliminar. Debe ser de tipo IntVectorData o Int64VectorData. Solo se usa cuando `selectionMode` es \"IdListPrimitiveVariable\"." + +msgid "The lights that are being filtered. Accepts a SetExpression. You might want to set it to 'defaultLights' to have the filter affect all lights that haven't been excluded from that set." +msgstr "Las luces que se están filtrando. Acepta una SetExpression. Puede establecerse en 'defaultLights' para que el filtro afecte a todas las luces que no hayan sido excluidas de ese conjunto." + +msgid "The attributes to be applied - arbitrary numbers of user defined attributes may be added as children of this plug via the user interface, or using the CompoundDataPlug API via python." +msgstr "Atributos aplicados - se pueden añadir números arbitrarios de atributos definidos por el usuario como secundarios de este conector a través de la interfaz, o usando la API CompoundDataPlug mediante Python." + +msgid "A transformation applied to the entire text area after layout has been performed. The translate and pivot values are specified in pixels, and the rotate value is specified in degrees." +msgstr "Una transformación aplicada a toda el área de texto después de realizar el diseño. Los valores de traslación y pivote se especifican en píxeles, y el valor de rotación se especifica en grados." + +msgid "The location within the scene to query the bound at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "La ubicación dentro de la escena en la que consultar los límites. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "The names of render passes to be created. > Tip : If any of the specified names already exist, they > will be removed from their existing position in the list > and appended to the end." +msgstr "Los nombres de los pases de render a crear. > Consejo: Si alguno de los nombres especificados ya existe, se eliminará de su posición actual en la lista y se añadirá al final." + +msgid "\" A grid. This is used to draw the grid in the viewer, but is also included as a node in case it might be useful, perhaps for placing a grid in renders done using the OpenGLRender node." +msgstr "\" Una cuadrícula. Se utiliza para dibujar la cuadrícula en el visor, pero también se incluye como nodo en caso de que sea útil, por ejemplo para colocar una cuadrícula en renders realizados con el nodo OpenGLRender." + +msgid "The location within the scene to query the shader at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "La ubicación dentro de la escena en la que consultar el shader. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "The location within the scene to query the filter at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "La ubicación dentro de la escena en la que consultar el filtro. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "An optional input image channel which defines a blur radius per pixel, allowing the radius to be varied across the image. The per-pixel radius is multiplied with the main radius control." +msgstr "Un canal de imagen de entrada opcional que define un radio de desenfoque por píxel, permitiendo que el radio varíe a lo largo de la imagen. El radio por píxel se multiplica con el control de radio principal." + +msgid "When on, the output channel names are automatically prefixed with the name of the layer being collected. Should be turned off when the input channel names already contain the layer name." +msgstr "Cuando está activado, los nombres de los canales de salida se prefijan automáticamente con el nombre de la capa que se está recopilando. Debe desactivarse cuando los nombres de los canales de entrada ya contienen el nombre de la capa." + +msgid "An upper limit on the disk radius (`radiusChannel * radius`). Larger disks will be clamped to this size. Used to accelerate rendering, so higher-than-necessary settings may reduce speed." +msgstr "Un límite superior en el radio de disco (`radiusChannel * radius`). Los discos más grandes se limitarán a este tamaño. Se usa para acelerar el renderizado, por lo que configuraciones más altas de lo necesario pueden reducir la velocidad." + +msgid "The name of the primitive variable to split based on. Must be a Uniform ( per-face ) primitive variable. A separate mesh will be created for each unique value of this primitive variable." +msgstr "El nombre de la variable primitiva por la cual dividir. Debe ser una variable primitiva Uniform (por cara). Se creará una malla separada para cada valor único de esta variable primitiva." + +msgid "Name of a primitive variable to add to the time. Must be a float or int primvar. It will be treated as a number of frames, and can be negative or positive to adjust time forward or back." +msgstr "Nombre de una variable primitiva a sumar al tiempo. Debe ser una variable primitiva de tipo float o int. Se tratará como un número de fotogramas, y puede ser negativo o positivo para ajustar el tiempo hacia adelante o atrás." + +msgid "The image channel used to modulate the density of the scattered points. Black pixels will receive no points and white pixels will receive the full amount as defined by the `density` plug." +msgstr "El canal de imagen utilizado para modular la densidad de los puntos dispersos. Los píxeles negros no recibirán puntos y los píxeles blancos recibirán la cantidad completa definida por el conector `density`." + +msgid "Used as the basis for the random colours generated for the outColor plug. All colours start with this value and then have a random HSV variation applied, using the ranges specified below." +msgstr "Se utiliza como base para los colores aleatorios generados para el conector outColor. Todos los colores comienzan con este valor y luego se les aplica una variación TSV aleatoria, usando los rangos especificados a continuación." + +msgid "The color space in which Gaffer performs image processing. ImageReaders will automatically load images into this space, and ImageWriters will automatically convert images from this space." +msgstr "El espacio de color en el que Gaffer realiza el procesamiento de imágenes. Los ImageReaders cargarán automáticamente las imágenes en este espacio, y los ImageWriters convertirán automáticamente las imágenes desde este espacio." + +msgid "Groups together several input scenes under a new parent. If the input scenes contain locations with identical names, they are automatically renamed to make them unique in the output scene." +msgstr "Agrupa varias escenas de entrada bajo un nuevo primario. Si las escenas de entrada contienen ubicaciones con nombres idénticos, se renombran automáticamente para hacerlas únicas en la escena de salida." + +msgid "The tweaks to be made to the attributes. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or using the AttributeTweaks API via python." +msgstr "Los ajustes a realizar en los atributos. Se pueden añadir números arbitrarios de ajustes definidos por el usuario como secundarios de este conector a través de la interfaz, o usando la API AttributeTweaks mediante Python." + +msgid "Name of the primitive variable which contains the position data used to calculate tangents & binormals. For example 'Pref' would compute tangents using the reference positions (if defined)" +msgstr "Nombre de la variable primitiva que contiene los datos de posición utilizados para calcular tangentes y binormales. Por ejemplo, 'Pref' calcularía tangentes usando las posiciones de referencia (si están definidas)" + +msgid "The location within the scene to query the transform at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "La ubicación dentro de la escena en la que consultar la transformación. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "Makes the location accessible via the `pointcloud_search()` and `pointcloud_get()` OSL functions. The location should contain a primitive with at least a position ('P') primitive variable." +msgstr "Hace accesible la ubicación mediante las funciones OSL `pointcloud_search()` y `pointcloud_get()`. La ubicación debe contener una primitiva con al menos una variable primitiva de posición ('P')." + +msgid "The space used to define the orientation of the XYZ rotation handles. Note that this is independent of the space setting on a Transform node - each setting can be mixed and matched freely." +msgstr "El espacio utilizado para definir la orientación de los manejadores de rotación XYZ. Esto es independiente de la configuración de espacio en un nodo Transform - cada configuración puede combinarse libremente." + +msgid "The location within the scene to query the attribute at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "La ubicación dentro de la escena en la que consultar el atributo. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "The OpenColorIO config to use. > Note : An OpenColorIOContext node can be used to override the config within specific parts of the node graph, or to perform wedging across several contexts." +msgstr "La configuración de OpenColorIO a utilizar. > Nota: Un nodo OpenColorIOContext puede usarse para sobrescribir la configuración en partes específicas del gráfico de nodos, o para realizar cuñas a través de varios contextos." + +msgid "The size of the font in pixels. For best quality results for constant sized text prefer this over the scale setting on the transform, which is better suited for smoothly animating the size." +msgstr "El tamaño de la fuente en píxeles. Para resultados de mejor calidad con texto de tamaño constante, preferir esto sobre la configuración de escala en la transformación, que es más adecuada para animar suavemente el tamaño." + +msgid "When on, the `find` string is treated as a regular expression, allowing it to perform complex pattern matching and to capture sections of the match to be referenced by the `replace` string." +msgstr "Cuando está activado, la cadena `find` se trata como una expresión regular, permitiendo realizar coincidencia de patrones complejos y capturar secciones de la coincidencia para ser referenciadas por la cadena `replace`." + +msgid "The number of threads used by Arnold to render the shader ball. A value of 0 uses all cores, and negative values reserve cores for other uses - to be used by the rest of the UI for instance." +msgstr "El número de hilos utilizados por Arnold para renderizar la esfera de shader. Un valor de 0 usa todos los núcleos, y valores negativos reservan núcleos para otros usos - para ser usados por el resto de la interfaz, por ejemplo." + +msgid "How the camera to be queried is specified. - Render Camera : Uses the value of the `render:camera` option in the scene globals. - Location : Uses the camera specified on the `location` plug." +msgstr "Cómo se especifica la cámara a consultar. - Render Camera: Usa el valor de la opción `render:camera` en los globales de la escena. - Location: Usa la cámara especificada en el conector `location`." + +msgid "The number of threads used by Cycles to render the shader ball. A value of 0 uses all cores, and negative values reserve cores for other uses - to be used by the rest of the UI for instance." +msgstr "El número de hilos utilizados por Cycles para renderizar la esfera de shader. Un valor de 0 usa todos los núcleos, y valores negativos reservan núcleos para otros usos - para ser usados por el resto de la interfaz, por ejemplo." + +msgid "When enabled, locks the view to look through a specific camera in the scene. By default, the current render camera is used, but this can be changed using the camera.lookThroughCamera setting." +msgstr "Cuando está activado, bloquea la vista para mirar a través de una cámara específica en la escena. Por defecto, se usa la cámara de render actual, pero esto puede cambiarse usando la configuración camera.lookThroughCamera." + +msgid "The space used to define the orientation of the XYZ translation handles. Note that this is independent of the space setting on a Transform node - each setting can be mixed and matched freely." +msgstr "El espacio utilizado para definir la orientación de los manejadores de traslación XYZ. Esto es independiente de la configuración de espacio en un nodo Transform - cada configuración puede combinarse libremente." + +msgid "The index of the input task which is executed. A value of 0 chooses the first input, 1 the second and so on. Values larger than the number of available inputs wrap back around to the beginning." +msgstr "El índice de la tarea de entrada que se ejecuta. Un valor de 0 elige la primera entrada, 1 la segunda y así sucesivamente. Los valores mayores que el número de entradas disponibles vuelven al inicio." + +msgid "The location within the scene to use for relative space mode. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "La ubicación dentro de la escena a utilizar para el modo de espacio relativo. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "The index of the input which is passed through. A value of 0 chooses the first input, 1 the second and so on. Values larger than the number of available inputs wrap back around to the beginning." +msgstr "El índice de la entrada que se pasa. Un valor de 0 elige la primera entrada, 1 la segunda y así sucesivamente. Los valores mayores que el número de entradas disponibles vuelven al inicio." + +msgid "Container of inputs to be collected from. Inputs may be added by calling `collectNode.addInput( plug )` or using the UI. Each input provides a corresponding output parented under the `out` plug." +msgstr "Contenedor de entradas de las que recopilar. Las entradas pueden añadirse llamando a `collectNode.addInput( plug )` o usando la interfaz. Cada entrada proporciona una salida correspondiente emparentada bajo el conector `out`." + +msgid "Deletes attributes from locations within the scene. Those locations will then inherit the attribute values from ancestor locations instead, or will fall back to using the default attribute value." +msgstr "Elimina atributos de ubicaciones dentro de la escena. Esas ubicaciones heredarán entonces los valores de atributo de ubicaciones ancestrales, o recurrirán al valor de atributo predeterminado." + +msgid "By default, vertex normals will only be calculated for polygon meshes which don't already have them. Turning this on will force new normals to be calculated even for meshes which had them already." +msgstr "Por defecto, las normales de vértice solo se calcularán para mallas poligonales que aún no las tengan. Activar esto forzará el cálculo de nuevas normales incluso para mallas que ya las tenían." + +msgid "Unpremultiplies data before processing, and premultiply again after processing. This allows accurate processing of nodes that deal with color, when running on partially transparent or deep images." +msgstr "Desmultiplica previamente los datos antes del procesamiento, y premultiplica de nuevo después. Esto permite un procesamiento preciso de nodos que trabajan con color, al operar en imágenes parcialmente transparentes o profundas." + +msgid "Transforms the constrained object relative to the target location. > Note : This is ignored when `keepReferencePosition` is on. In this case it is easier > to modify the reference position instead." +msgstr "Transforma el objeto restringido relativo a la ubicación objetivo. > Nota: Esto se ignora cuando `keepReferencePosition` está activado. En este caso es más fácil modificar la posición de referencia." + +msgid "The location within the scene to query the primitive variable at. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "La ubicación dentro de la escena en la que consultar la variable primitiva. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "The name of the view to be created from this input. Usually \"left\" or \"right\" for a stereo workflow, but can be any name, allowing arbitrary numbers of views to be created in a single image stream." +msgstr "El nombre de la vista a crear a partir de esta entrada. Generalmente \"left\" o \"right\" para un flujograma estéreo, pero puede ser cualquier nombre, permitiendo crear un número arbitrario de vistas en un solo flujo de imagen." + +msgid "An output plug containing the names of all currently enabled inputs. Example uses include driving `Collect.contextValues` to collect all the inputs, or `Wedge.strings` to dispatch a task per input." +msgstr "Un conector de salida que contiene los nombres de todas las entradas actualmente activadas. Ejemplos de uso incluyen controlar `Collect.contextValues` para recopilar todas las entradas, o `Wedge.strings` para despachar una tarea por entrada." + +msgid "The results of the search, as an `IECore::PathMatcher` object. This is most useful for performing hierarchical queries and for iterating through the paths without an expensive conversion to strings." +msgstr "Los resultados de la búsqueda, como un objeto `IECore::PathMatcher`. Es más útil para realizar consultas jerárquicas y para iterar a través de las rutas sin una conversión costosa a cadenas." + +msgid "The tweaks to be made to the parameters of the shader. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or using the ShaderTweaks API via python." +msgstr "Los ajustes a realizar en los parámetros del shader. Se pueden añadir números arbitrarios de ajustes definidos por el usuario como secundarios de este conector a través de la interfaz, o usando la API ShaderTweaks mediante Python." + +msgid "Causes this node to be executed from a script containing *only* this node. This is a useful optimisation when the load time for the full script is high compared to the time taken to execute the task." +msgstr "Hace que este nodo se ejecute desde un script que contenga *solo* este nodo. Es una optimización útil cuando el tiempo de carga del script completo es alto comparado con el tiempo de ejecución de la tarea." + +msgid "Expand the data window to cover the display window. The new data will be filled with blurred contributions from nearby pixels ( the same as any regions of low alpha within the original data window )." +msgstr "Expandir la ventana de datos para cubrir la ventana de visualización. Los nuevos datos se llenarán con contribuciones desenfocadas de píxeles cercanos (igual que cualquier región de alfa bajo dentro de la ventana de datos original)." + +msgid "The port number on which to run the display server. Outputs which specify this port number will appear in this node - use multiple nodes with different port numbers to receive multiple images at once." +msgstr "El número de puerto en el que ejecutar el servidor de visualización. Las salidas que especifiquen este número de puerto aparecerán en este nodo - usar múltiples nodos con diferentes números de puerto para recibir múltiples imágenes a la vez." + +msgid "The name of the per-vertex primitive variable used to specify the scale of each instance. Scale can be provided as a float for uniform scaling, or as a vector to define different scaling in each axis." +msgstr "El nombre de la variable primitiva por vértice utilizada para especificar la escala de cada instancia. La escala puede proporcionarse como un flotante para escala uniforme, o como un vector para definir diferente escala en cada eje." + +msgid "The name of the file to be written. Note that unlike image sequences, many scene formats write animation into a single file, so using # characters to specify a frame number is generally not necessary." +msgstr "El nombre del archivo a escribir. A diferencia de las secuencias de imágenes, muchos formatos de escena escriben la animación en un solo archivo, por lo que usar caracteres # para especificar un número de fotograma generalmente no es necesario." + +msgid "Value which defines the isosurface to convert to a mesh primitive. Usually this is set to zero but setting a small positive number will generate a dilated mesh and negative will create an eroded mesh." +msgstr "Valor que define la isosuperficie a convertir en una primitiva de malla. Normalmente se establece en cero, pero un pequeño número positivo generará una malla dilatada y uno negativo creará una malla erosionada." + +msgid "The first set from the `matches` output, or `\"\"` if there were no matches. This is particularly convenient for use in a Spreadsheet's selector, to select rows based on the set membership of a location." +msgstr "El primer conjunto de la salida `matches`, o `\"\"` si no hubo coincidencias. Es particularmente conveniente para usar en el selector de una hoja de cálculo, para seleccionar filas basadas en la membresía de conjunto de una ubicación." + +msgid "The tweaks to be made to the context variables. Arbitrary numbers of user defined tweaks may be added as children of this plug via the user interface, or using the ContextVariableTweaks API via python." +msgstr "Los ajustes a realizar en las variables de contexto. Se pueden añadir números arbitrarios de ajustes definidos por el usuario como secundarios de este conector a través de la interfaz, o usando la API ContextVariableTweaks mediante Python." + +msgid "The primitive variables to be applied - arbitrary numbers of user defined primitive variables may be added as children of this plug via the user interface, or using the CompoundDataPlug API via python." +msgstr "Variables primitivas aplicadas - se pueden añadir números arbitrarios de variables primitivas definidas por el usuario como secundarios de este conector a través de la interfaz, o usando la API CompoundDataPlug mediante Python." + +msgid "Primitive variables to sample from the source mesh and output on the generated points. Supports a Gaffer match pattern, with multiple space seperated variable names, optionally using `*` as a wildcard." +msgstr "Variables primitivas a muestrear de la malla de origen y generar en los puntos creados. Soporta un patrón de coincidencia de Gaffer, con múltiples nombres de variables separados por espacios, opcionalmente usando `*` como comodín." + +msgid "A context variable used to pass the location of the parent to the upstream nodes connected into the `children` plug. This can be used to procedurally vary the children at each different parent location." +msgstr "Una variable de contexto utilizada para pasar la ubicación del primario a los nodos anteriores conectados al conector `children`. Puede usarse para variar proceduralmente los secundarios en cada ubicación primaria diferente." + +msgid "The filter used to choose the vdbs to be converted. Source locations are pruned from the output scene, unless they are reused as part of a destination location (or a separate source scene is connected)." +msgstr "El filtro utilizado para elegir los VDBs a convertir. Las ubicaciones de origen se podan de la escena de salida, a menos que se reutilicen como parte de una ubicación de destino (o se conecte una escena de origen separada)." + +msgid "A world space translation offset applied on top of the target position. > Note : This is ignored when `keepReferencePosition` is on. In this case it is easier > to modify the reference position instead." +msgstr "Un desplazamiento de traslación en espacio mundial aplicado sobre la posición objetivo. > Nota: Esto se ignora cuando `keepReferencePosition` está activado. En este caso es más fácil modificar la posición de referencia." + +msgid "The minimum data channel value that will be mapped to 0. For float data only the first channel is used. For V2f data only the first and second channels are used. For V3f data all three channels are used." +msgstr "El valor mínimo del canal de datos que se mapeará a 0. Para datos flotantes solo se usa el primer canal. Para datos V2f solo se usan el primer y segundo canales. Para datos V3f se usan los tres canales." + +msgid "The name of the row. This is matched against the `selector` to determine which row is chosen to be passed to the output. May contain multiple space separated names and any of Gaffer's standard wildcards." +msgstr "El nombre de la fila. Se compara con el `selector` para determinar qué fila se elige para pasar a la salida. Puede contener múltiples nombres separados por espacios y cualquiera de los comodines estándar de Gaffer." + +msgid "Whether this light illuminates all geometry by default. When toggled, the light will be added to the \\\"defaultLights\\\" set, which can be referenced in set expressions and manipulated by downstream nodes." +msgstr "Indica si esta luz ilumina toda la geometría por defecto. Cuando se activa, la luz se añadirá al conjunto \\\"defaultLights\\\", que puede referenciarse en expresiones de conjunto y ser manipulado por nodos posteriores." + +msgid "The maximum data channel value that will be mapped to 1. For float data only the first channel is used. For V2f data only the first and second channels are used. For V3f data all three channels are used." +msgstr "El valor máximo del canal de datos que se mapeará a 1. Para datos flotantes solo se usa el primer canal. Para datos V2f solo se usan el primer y segundo canales. Para datos V3f se usan los tres canales." + +msgid "Defines the start and end frames for the script. These don't enforce anything, but are typically used by dispatchers to control default frame ranges, and by the UI to define the range of the time slider." +msgstr "Define los fotogramas de inicio y fin del script. No imponen nada, pero normalmente son utilizados por los despachadores para controlar los rangos de fotogramas predeterminados, y por la interfaz para definir el rango del control deslizante de tiempo." + +msgid "The filter used to choose the meshes to be converted. Source locations are pruned from the output scene, unless they are reused as part of a destination location (or a separate source scene is connected)." +msgstr "El filtro utilizado para elegir las mallas a convertir. Las ubicaciones de origen se podan de la escena de salida, a menos que se reutilicen como parte de una ubicación de destino (o se conecte una escena de origen separada)." + +msgid "By default, values below the minimum value are clamped to the minimum value itself. If minClampToEnabled is on, they are instead set to this value. This can be useful for highlighting out-of-range values." +msgstr "Por defecto, los valores por debajo del mínimo se limitan al valor mínimo mismo. Si minClampToEnabled está activado, se establecen a este valor en su lugar. Esto puede ser útil para resaltar valores fuera de rango." + +msgid "The name of a per-vertex integer primitive variable used to determine which prototype is applied to the vertex. This plug is used in \"Indexed (Roots List)\" mode as well as \"Indexed (Roots Variable)\" mode." +msgstr "El nombre de una variable primitiva entera por vértice utilizada para determinar qué prototipo se aplica al vértice. Este conector se usa en el modo \"Indexed (Roots List)\" así como en el modo \"Indexed (Roots Variable)\"." + +msgid "By default, values above the maximum value are clamped to the maximum value itself. If maxClampToEnabled is on, they are instead set to this value. This can be useful for highlighting out-of-range values." +msgstr "Por defecto, los valores por encima del máximo se limitan al valor máximo mismo. Si maxClampToEnabled está activado, se establecen a este valor en su lugar. Esto puede ser útil para resaltar valores fuera de rango." + +msgid "Makes the Gaffer attributes at the object's location available to OSL through the getattribute function. Once this is on, you can use OSL nodes such as InFloat or InString to retrieve the attribute values." +msgstr "Hace disponibles los atributos de Gaffer en la ubicación del objeto para OSL mediante la función getattribute. Una vez activado, se pueden usar nodos OSL como InFloat o InString para recuperar los valores de los atributos." + +msgid "A shader used to simulate lens distortion effects. The shader is evaluated across a 0-1 UV range that is mapped to the camera's screen space, and should output a red/green UV image of distorted UV positions." +msgstr "Un shader utilizado para simular efectos de distorsión de lente. El shader se evalúa en un rango UV de 0-1 mapeado al espacio de pantalla de la cámara, y debe generar una imagen UV roja/verde de posiciones UV distorsionadas." + +msgid "Assigns a global atmosphere shader that applies to all objects in the scene. This is stored as an \"ai:atmosphere\" option in Gaffer's globals, and translated onto the `options.atmosphere` parameter in Arnold." +msgstr "Asigna un shader de atmósfera global que se aplica a todos los objetos en la escena. Se almacena como una opción \"ai:atmosphere\" en los globales de Gaffer, y se traduce al parámetro `options.atmosphere` en Arnold." + +msgid "The name of the set that will be created or edited. Multiple sets may be created or modified by entering their names separated by spaces. Wildcards may also be used to match multiple input sets to be modified." +msgstr "El nombre del conjunto que se creará o editará. Se pueden crear o modificar múltiples conjuntos ingresando sus nombres separados por espacios. También se pueden usar comodines para coincidir con múltiples conjuntos de entrada a modificar." + +msgid "A multiplier for the scale of the filter used. Scaling up gives a softer result, scaling down gives a sharper result ( likely to alias or even create black patches where no pixels can be found ). Less than 1 is not recommended unless you have a special technical reason." +msgstr "Un multiplicador para la escala del filtro utilizado. Escalar hacia arriba da un resultado más suave, escalar hacia abajo da un resultado más nítido (probable que genere aliasing o incluso parches negros donde no se encuentren píxeles). Menos de 1 no es recomendable a menos que haya una razón técnica especial." + +msgid "The base camera type. Supports two standard projections: orthographic and perspective. For less standard projections that require renderer-specific implementations, such as spherical, you will need to use a downstream CameraTweaks node to adjust this camera's parameters." +msgstr "El tipo base de cámara. Soporta dos proyecciones estándar: ortográfica y perspectiva. Para proyecciones menos estándar que requieren implementaciones específicas del renderizador, como la esférica, será necesario usar un nodo CameraTweaks posterior para ajustar los parámetros de esta cámara." + +msgid "The filter used to perform the resampling. The name of any OIIO filter may be specified, but this UI only exposes a limited range of 5 options which perform well for warping, ordered from softest to sharpest. Plus the extra \"bilinear\" mode which is lower quality, but fast." +msgstr "El filtro utilizado para realizar el remuestreo. Se puede especificar el nombre de cualquier filtro OIIO, pero esta interfaz solo expone un rango limitado de 5 opciones que funcionan bien para deformación, ordenadas de más suave a más nítida. Además del modo \"bilinear\" extra que es de menor calidad, pero rápido." + +msgid "The names of the primitive variables to be sampled from the source primitive. These should be separated by spaces and can use Gaffer's standard wildcards to match multiple variables. The sampled variables are prefixed with `prefix` before being added to the sampling object." +msgstr "Los nombres de las variables primitivas a muestrear de la primitiva de origen. Deben estar separados por espacios y pueden usar los comodines estándar de Gaffer para coincidir con múltiples variables. Las variables muestreadas se prefijan con `prefix` antes de añadirse al objeto de muestreo." + +msgid "Render meshes in Arnold, storing the results into images in the texture space of the meshes. Supports multiple meshes and UDIMs, and any AOVs output by Arnold. The file name and resolution can be overridden per mesh using the \"bake:fileName\" and \"bake:resolution\" attributes." +msgstr "Renderiza mallas en Arnold, almacenando los resultados en imágenes en el espacio de textura de las mallas. Soporta múltiples mallas y UDIMs, y cualquier VAS generada por Arnold. El nombre de archivo y la resolución pueden sobrescribirse por malla usando los atributos \"bake:fileName\" y \"bake:resolution\"." + +msgid "The location in the source scene that primitive variables are copied from. By default, variables are copied from the location equivalent to the one they are being copied to. It is not an error if the location to be copied from does not exist; instead, no variables are copied." +msgstr "La ubicación en la escena de origen de la que se copian las variables primitivas. Por defecto, las variables se copian de la ubicación equivalente a la que se están copiando. No es un error si la ubicación de origen no existe; simplemente no se copian variables." + +msgid "The horizontal field of view, in degrees. In the camera's parameters, projection is always stored as `aperture` and `focalLength`. When using the _Field of View_ perspective mode, the aperture has the fixed dimensions of `1, 1`, and this plug drives the `focalLength` parameter." +msgstr "El campo de visión horizontal, en grados. En los parámetros de la cámara, la proyección siempre se almacena como `aperture` y `focalLength`. Al usar el modo de perspectiva _Field of View_, la apertura tiene las dimensiones fijas de `1, 1`, y este conector controla el parámetro `focalLength`." + +msgid "The method used to merge attributes when the same location exists in multiple input scenes. Keep mode keeps the attributes from the first input, Replace mode replaces them with the attributes from the last input, and Merge mode merges all attributes together from first to last." +msgstr "El método utilizado para combinar atributos cuando la misma ubicación existe en múltiples escenas de entrada. El modo Conservar mantiene los atributos de la primera entrada, el modo Reemplazar los sustituye con los de la última entrada, y el modo Combinar fusiona todos los atributos de primera a última." + +msgid "The scene containing the prototypes to be applied to each vertex. Use the `prototypeMode` and associated plugs to control the mapping between prototypes and instances. Note that the prototypes are not limited to being a single object - they can have arbitrary child hierarchies." +msgstr "La escena que contiene los prototipos aplicados a cada vértice. Utilizar `prototypeMode` y los conectores asociados para controlar el mapeo entre prototipos e instancias. Los prototipos no están limitados a ser un solo objeto - pueden tener jerarquías secundarias arbitrarias." + +msgid "Outputs a flat image, instead of output a deep image with any samples within the range. Flattening as part of DeepSlice is up to 2X faster than flattening afterwards, and is convenient if you're using a DeepSlice to preview the contents of a deep image by scrubbing through depth." +msgstr "Genera una imagen plana, en lugar de una imagen profunda con muestras dentro del rango. Aplanar como parte de DeepSlice es hasta 2 veces más rápido que aplanar después, y es conveniente si se usa DeepSlice para previsualizar el contenido de una imagen profunda desplazándose por la profundidad." + +msgid "If true, newly copied primitive variables will only be created if the source object is differs in some of the suffix Contexts. If the source object never changes, it will be passed through unchanged ( since there is no variation, you can just use the original primitive variables )." +msgstr "Si es verdadero, las nuevas variables primitivas copiadas solo se crearán si el objeto de origen difiere en algunos de los contextos de sufijo. Si el objeto de origen nunca cambia, se pasará sin modificar (ya que no hay variación, se pueden usar las variables primitivas originales)." + +msgid "During baking, we first render exrs ( potentially multiple EXRs per udim if multiple objects are present ). We then combine them, fill in the background, and convert to textures. This causes all intermediate EXRs, and the index txt file to be removed, and just the final .tx to be kept." +msgstr "Durante el horneado, primero se renderizan EXRs (potencialmente múltiples EXRs por UDIM si hay múltiples objetos). Luego se combinan, se rellena el fondo y se convierten a texturas. Esto causa que todos los EXRs intermedios y el archivo txt de índice se eliminen, conservando solo el .tx final." + +msgid "The renderer to use. Default mode uses the `render:defaultRenderer` option from the input scene globals to choose the renderer. This can be authored using the StandardOptions node. > Note : Changing renderer currently requires that the current render is > manually stopped and restarted." +msgstr "El renderizador a utilizar. El modo predeterminado usa la opción `render:defaultRenderer` de los globales de la escena de entrada. Puede configurarse usando el nodo StandardOptions. > Nota: Cambiar de renderizador actualmente requiere que el render actual se detenga manualmente y se reinicie." + +msgid "Chooses how to select points to delete. - VertexPrimitiveVariable : Deletes points with a non-zero value in the `points` primitive variable. - IdListPrimitiveVariable : Deletes points with Ids in the `idListVariable` primitive variable. - IdList : Deletes points with Ids in the `idList`." +msgstr "Elige cómo seleccionar puntos a eliminar. - VertexPrimitiveVariable: Elimina puntos con un valor distinto de cero en la variable primitiva `points`. - IdListPrimitiveVariable: Elimina puntos con ids en la variable primitiva `idListVariable`. - IdList: Elimina puntos con ids en la `idList`." + +msgid "A shader used to weight the samples taken by an Arnold camera. This can be used to create vignetting effects or to completely mask out areas of the render, causing no rays to be fired for those pixels. The shader is evaluated across a 0-1 UV range that is mapped to the camera's screen space." +msgstr "Un shader utilizado para ponderar las muestras tomadas por una cámara de Arnold. Puede usarse para crear efectos de viñeteado o para enmascarar completamente áreas del render. El shader se evalúa en un rango UV de 0-1 mapeado al espacio de pantalla de la cámara." + +msgid "The options to be queried - arbitrary numbers of options may be added as children of this plug via the user interface, or via python. Each child is a `NameValuePlug` whose `name` plug is the option to query, and whose `value` plug is the default value to use if the option can not be retrieved." +msgstr "Las opciones a consultar - se pueden añadir números arbitrarios de opciones como secundarios de este conector a través de la interfaz, o mediante Python. Cada secundario es un `NameValuePlug` cuyo conector `name` es la opción a consultar, y cuyo conector `value` es el valor predeterminado a usar si no se puede recuperar." + +msgid "By default, the bounding boxes of ancestor locations are automatically updated when children are removed. This can be turned off if necessary to get improved performance - in this case the bounding boxes will still wholly contain the contents at each location, but may be bigger than necessary." +msgstr "Por defecto, las cajas de límites de ubicaciones ancestrales se actualizan automáticamente cuando se eliminan secundarios. Puede desactivarse para mejorar el rendimiento - las cajas de límites seguirán conteniendo completamente el contenido en cada ubicación, pero pueden ser más grandes de lo necesario." + +msgid "Performs a simple per-channel colour grading operation as follows : A = multiply * (gain - lift) / (whitePoint - blackPoint) B = offset + lift - A * blackPoint result = pow( A * input + B, 1/gamma ) See the descriptions for individual plug for a slightly more practical explanation of the formula." +msgstr "Realiza una operación simple de gradación de color por canal: A = multiply * (gain - lift) / (whitePoint - blackPoint) B = offset + lift - A * blackPoint resultado = pow( A * entrada + B, 1/gamma ) Consultar las descripciones de cada conector para una explicación más práctica de la fórmula." + +msgid "The coordinates of the pixel to sample. These can have fractional values and bilinear interpolation will be used to interpolate between adjacent pixels. Note though that the coordinates at pixel centres are not integers. For example, the centre of the bottom left pixel of an image is at 0.5, 0.5." +msgstr "Las coordenadas del píxel a muestrear. Pueden tener valores fraccionarios y se usará interpolación bilineal entre píxeles adyacentes. Sin embargo, las coordenadas en los centros de los píxeles no son enteros. Por ejemplo, el centro del píxel inferior izquierdo de una imagen está en 0.5, 0.5." + +msgid "The most important plug for achieving interesting variation. Should be set to the name of a Context Variable which will be different for each evaluation of the node. Good examples are \"scene:path\" to generate a different value per scene location, or \"frame\" to generate a different value per frame." +msgstr "El conector más importante para lograr variación interesante. Debe establecerse con el nombre de una variable de contexto que será diferente para cada evaluación del nodo. Buenos ejemplos son \"scene:path\" para generar un valor diferente por ubicación de escena, o \"frame\" para un valor diferente por fotograma." + +msgid "The most important plug for achieving interesting variation. Should be set to the name of a context variable which will be different for each evaluation of the node. Good examples are `scene:path` to generate a different value per scene location, or `frame` to generate a different value per frame." +msgstr "El conector más importante para lograr variación interesante. Debe establecerse con el nombre de una variable de contexto que será diferente para cada evaluación del nodo. Buenos ejemplos son `scene:path` para generar un valor diferente por ubicación de escena, o `frame` para un valor diferente por fotograma." + +msgid "How to weight the multiple faces that contribute to the normal of a vertex. \"Equal\" averages all faces connected to the vertex - simple to compute, but low quality. \"Angle\" gives good results for most meshes. \"Area\" may give good results on hard edge models with tight chamfers and large flat faces." +msgstr "Cómo ponderar las múltiples caras que contribuyen a la normal de un vértice. \"Equal\" promedia todas las caras conectadas al vértice - simple de calcular, pero baja calidad. \"Angle\" da buenos resultados para la mayoría de mallas. \"Area\" puede dar buenos resultados en modelos de bordes duros con chaflanes estrechos y caras planas grandes." + +msgid "Specifies context variables to be created from primitive variables. These variables are available to upstream prototypes network, allowing the prototypes scene to be generated differently depending on the source point. Supports quantization to avoid re-evaluating the prototypes scene too many times." +msgstr "Especifica variables de contexto a crear a partir de variables primitivas. Estas variables están disponibles para la red de prototipos anterior, permitiendo que la escena de prototipos se genere de forma diferente según el punto de origen. Soporta cuantización para evitar reevaluar la escena de prototipos demasiadas veces." + +msgid "A space separated list of colon separated pairs of image name and data to render. For example, you could set this to \"myName1:RGBA myName2:diffuse myName3:diffuse_albedo\", to render 3 sets of images for every UDIM and mesh baked, containing all lighting, just diffuse lighting, and the diffuse albedo." +msgstr "Una lista separada por espacios de pares separados por dos puntos de nombre de imagen y datos a renderizar. Por ejemplo, \"myName1:RVAA myName2:diffuse myName3:diffuse_albedo\", para renderizar 3 conjuntos de imágenes por cada UDIM y malla horneada, conteniendo toda la iluminación, solo iluminación difusa, y el albedo difuso." + +msgid "The names of the views to be deleted (or kept if the mode is set to Keep). Names should be separated by spaces and may contain any of Gaffer's standard wildcards. Note that if you delete all views from an image, you will be unable to evaluate attributes of the image, because it will have no data left." +msgstr "Los nombres de las vistas a eliminar (o conservar si el modo está en Conservar). Los nombres deben estar separados por espacios y pueden contener cualquiera de los comodines estándar de Gaffer. Si se eliminan todas las vistas de una imagen, no se podrán evaluar los atributos de la imagen, porque no quedarán datos." + +msgid "Enable this in rare cases when it is required to pass through every single id directly into the seed context variable. This is very expensive, because every single instance will need a separate context, but is sometimes useful, and may be an acceptable cost if there isn't a huge number of total instances." +msgstr "Activar en casos raros cuando se requiere pasar cada id individual directamente a la variable de contexto de semilla. Es muy costoso, porque cada instancia necesitará un contexto separado, pero a veces es útil, y puede ser un costo aceptable si no hay un gran número total de instancias." + +msgid "Controls how the output globals are generated from the collected scenes. By default, the globals from the first scene alone are passed through. When `mergeGlobals` is on, the globals from all collected scenes are merged, with the last scene winning in the case of multiple scenes specifying the same global." +msgstr "Controla cómo se generan los globales de salida a partir de las escenas recopiladas. Por defecto, solo se pasan los globales de la primera escena. Cuando `mergeGlobals` está activado, los globales de todas las escenas se combinan, con la última escena ganando en caso de conflicto." + +msgid "Changes between polygon and subdivision representations for mesh objects, and optionally recalculates vertex normals for polygon meshes. Note that currently the Gaffer viewport does not display subdivision meshes with smoothing, so the results of using this node will not be seen until a render is performed." +msgstr "Cambia entre representaciones poligonales y de subdivisión para objetos de malla, y opcionalmente recalcula las normales de vértice para mallas poligonales. Actualmente el visor de Gaffer no muestra mallas de subdivisión con suavizado, por lo que los resultados no se verán hasta que se realice un render." + +msgid "The step between successive values when the mode is set to \"Int Range\". Values are generated by adding this step to the minimum value until the maximum value is exceeded. Note that if (max - min) is not exactly divisible by the step then the maximum value may not be used at all. Has no effect in other modes." +msgstr "El paso entre valores sucesivos cuando el modo está en \"Int Range\". Los valores se generan sumando este paso al valor mínimo hasta que se supera el máximo. Si (max - min) no es exactamente divisible por el paso, el valor máximo puede no usarse. No tiene efecto en otros modos." + +msgid "The paths to the root locations to create in the output scene. The input scene is copied underneath each of these root locations. Often the rootNames will be driven by an expression that generates a dynamic number of root locations, perhaps by querying an asset management system or listing cache files on disk." +msgstr "Las rutas a las ubicaciones raíz a crear en la escena de salida. La escena de entrada se copia debajo de cada una de estas ubicaciones raíz. A menudo los rootNames serán controlados por una expresión que genera un número dinámico de ubicaciones raíz, quizás consultando un sistema de gestión de recursos o listando archivos de caché en disco." + +msgid "The name of a Context Variable that is set to the current attribute name when evaluating the transform. This can be used in upstream expressions and string substitutions to vary the transform. For example, you could drive a TimeWarp with this variable in order create copies of the transform at different times." +msgstr "El nombre de una variable de contexto que se establece con el nombre del atributo actual al evaluar la transformación. Puede usarse en expresiones anteriores para variar la transformación. Por ejemplo, se podría controlar un TimeWarp con esta variable para crear copias de la transformación en diferentes tiempos." + +msgid "If you want to preserve the uv positions of the points while the mesh animates, you can set up an alternate reference position primitive variable ( usually the same as P, but not animated ). This primitive variable will be used to compute the areas of the faces, and therefore how many points each face receives." +msgstr "Si se desea preservar las posiciones UV de los puntos mientras la malla se anima, se puede configurar una variable primitiva de posición de referencia alternativa (generalmente igual a P, pero no animada). Esta variable primitiva se usará para calcular las áreas de las caras, y por lo tanto cuántos puntos recibe cada cara." + +msgid "A list of ids for the elements to affect, corresponding to the current interpolation. For example, if you choose \"Vertex\" interpolation, these will be vertex ids. By default, ids are based on the index, but if you specify an id primitive variable below, the ids in this list will match the id primitive variable." +msgstr "Una lista de ids para los elementos a afectar, correspondientes a la interpolación actual. Por ejemplo, si se elige \"Vertex\", serán ids de vértice. Por defecto, los ids se basan en el índice, pero si se especifica una variable primitiva de id abajo, los ids en esta lista coincidirán con ella." + +msgid "Controls the contents of the output depth channels. \"Depth Range\" outputs the minimum and maximum depth values of any sample in the pixel as Z and ZBack. \"Filtered Depth\" outputs just a Z channel with the average depth for the pixel, based on the alpha values of the samples. \"None\" outputs no Z or ZBack channel." +msgstr "Controla el contenido de los canales de profundidad de salida. \"Depth Range\" genera los valores de profundidad mínimo y máximo como Z y ZBack. \"Filtered Depth\" genera solo un canal Z con la profundidad promedio del píxel, basada en los valores alfa de las muestras. \"None\" no genera canal Z ni ZBack." + +msgid "If specified, this channel will be used to compute the pixel index to select for all channels. You would probably want to use this with a channel that represents the overall luminance of the image. It will produce a rank filter which is lower quality, but preserves additivity between channels, and is a bit faster." +msgstr "Si se especifica, este canal se usará para calcular el índice de píxel a seleccionar para todos los canales. Probablemente se querrá usar con un canal que represente la luminancia general de la imagen. Producirá un filtro de rango de menor calidad, pero que preserva la aditividad entre canales, y es un poco más rápido." + +msgid "May be connected to a BoxIn node to define an input that is passed through when the Box is disabled. Defining a pass-through also activates the following behaviours : - If the Box is deleted, the input and output nodes are reconnected automatically. - The Box can be dragged onto an existing connection to insert it." +msgstr "Puede conectarse a un nodo BoxIn para definir una entrada que se pasa cuando el Box está desactivado. Definir un paso directo también activa los siguientes comportamientos: - Si se elimina el Box, los nodos de entrada y salida se reconectan automáticamente. - El Box puede arrastrarse sobre una conexión existente para insertarlo." + +msgid "Controls how the output metadata is generated from the collected images. By default, the metadata from the first image alone is passed through. When `mergeMetadata` is on, the metadata from all collected images is merged, with the last image winning in the case of multiple image specifying the same piece of metadata." +msgstr "Controla cómo se generan los metadatos de salida a partir de las imágenes recopiladas. Por defecto, solo se pasan los metadatos de la primera imagen. Cuando `mergeMetadata` está activado, los metadatos de todas las imágenes se combinan, con la última imagen ganando en caso de que múltiples imágenes especifiquen el mismo metadato." + +msgid "The interpolation of the target primitive variables. Using \"Any\" allows you to operate on any primitive variable, but if you know your target, using a more specific interpolation offers benefits: you can specify an idList to operate on specific elements, and you can use \"Create\" mode to create new primitive variables." +msgstr "La interpolación de las variables primitivas objetivo. Usar \"Any\" permite operar sobre cualquier variable primitiva, pero si se conoce el objetivo, una interpolación más específica ofrece beneficios: se puede especificar una idList para operar en elementos específicos, y usar el modo \"Create\" para crear nuevas variables primitivas." + +msgid "Creates a seed context variable based on a hash of the instance ID, which could come from the primitive varable specified in the `id` plug or otherwise the point index. This integer is available to the upstream prototypes network, and might typically be used with a Random node to randomise properties of the prototype." +msgstr "Crea una variable de contexto de semilla basada en un hash del ID de instancia, que puede provenir de la variable primitiva especificada en el conector `id` o del índice del punto. Este entero está disponible para la red de prototipos anterior, y típicamente se usaría con un nodo Random para aleatorizar propiedades del prototipo." + +msgid "When processing a deep image, you may use this to multiply by the visibility of the current sample, taking into account the alpha of all previous samples. This is a pretty special case, it's mostly useful for converting deep images to incandescence, by multiplying RGB by visibility, and then wiping out the 'A' channel." +msgstr "Al procesar una imagen profunda, se puede usar para multiplicar por la visibilidad de la muestra actual, teniendo en cuenta el alfa de todas las muestras anteriores. Es un caso especial, principalmente útil para convertir imágenes profundas a incandescencia, multiplicando RVA por la visibilidad, y luego eliminando el canal 'A'." + +msgid "The location where the points primitives will be placed in the output scene. When the destination is evaluated, the `${scene:path}` variable holds the location of the source mesh, so the default value parents the points under the mesh. > Tip : `${scene:path}/..` may be used to place the points alongside the > source mesh." +msgstr "La ubicación donde se colocarán las primitivas de puntos en la escena de salida. Cuando se evalúa el destino, la variable `${scene:path}` contiene la ubicación de la malla de origen, así que el valor predeterminado emparenta los puntos bajo la malla. > Consejo: `${scene:path}/..` puede usarse para colocar los puntos junto a la malla de origen." + +msgid "Clipping planes for cameras implied by lights. When creating a perspective camera, a near clip <= 0 is invalid, and will be replaced with 0.01. Also, certain lights only start casting light at some distance - if near clip is less than this, it will be increased. May be overridden by the visualisation setting on the light." +msgstr "Planos de recorte para cámaras implícitas por luces. Al crear una cámara de perspectiva, un recorte cercano <= 0 es inválido y se reemplazará con 0.01. Además, ciertas luces solo emiten luz a cierta distancia - si el recorte cercano es menor, se incrementará. Puede ser sobrescrito por la configuración de visualización de la luz." + +msgid "Calculate normals based on the limit surface. If there are existing normals, they will be overwritten. If this is not set, existing normals will be interpolated like any other primvar. Note that we currently output Vertex normals, which makes sense for most subdivs, but does not accurately capture infinitely sharp creases." +msgstr "Calcular normales basándose en la superficie límite. Si existen normales, serán sobrescritas. Si esto no está establecido, las normales existentes se interpolarán como cualquier otra variable primitiva. Actualmente se generan normales Vertex, lo cual tiene sentido para la mayoría de subdivisiones, pero no captura pliegues infinitamente agudos." + +msgid "The attributes to be shuffled - arbitrary numbers of attributes may be shuffled via the source/destination plugs. The deleteSource plug may be used to remove the original attribute(s). The replaceDestination plug may be used to specify whether each shuffle should replace already written destination data with the same name." +msgstr "Los atributos a reorganizar - se pueden reorganizar números arbitrarios de atributos mediante los conectores de origen/destino. El conector deleteSource puede usarse para eliminar los atributos originales. El conector replaceDestination puede especificar si cada reorganización debe reemplazar datos de destino ya escritos con el mismo nombre." + +msgid "An optional filter input used to provide multiple root locations which the `paths` are relative to. This can be useful when working on a single asset in isolation, and then placing it into multiple locations within a layout. When no filter is connected, all `paths` are treated as being relative to `/`, the true scene root." +msgstr "Una entrada de filtro opcional para proporcionar múltiples ubicaciones raíz a las que las `paths` son relativas. Útil al trabajar en un recurso individual de forma aislada, y luego colocarlo en múltiples ubicaciones dentro de un diseño. Cuando no hay filtro conectado, todas las `paths` se tratan como relativas a `/`, la raíz verdadera de la escena." + +msgid "Generates repeatable random values from a seed. This can be very useful for the procedural generation of variation. Numeric or colour values may be generated. The random values are generated from a seed and a Context Variable - to get useful variation either the seed or the value of the Context Variable must be varied too." +msgstr "Genera valores aleatorios repetibles a partir de una semilla. Puede ser muy útil para la generación procedural de variación. Se pueden generar valores numéricos o de color. Los valores aleatorios se generan a partir de una semilla y una variable de contexto - para obtener variación útil se debe variar la semilla o el valor de la variable de contexto." + +msgid "A directory of JSON files containing Cryptomatte manifests. If a `manif_file` metadata entry exists for the selected Cryptomatte layer, it will be appended to this directory. The manifest is read from the file at the resulting path. If this is not specified, the directory will be inferred from the image's `filePath` metadata." +msgstr "Un directorio de archivos JSON que contienen manifiestos Cryptomatte. Si existe una entrada de metadatos `manif_file` para la capa Cryptomatte seleccionada, se añadirá a este directorio. El manifiesto se lee del archivo en la ruta resultante. Si no se especifica, el directorio se inferirá de los metadatos `filePath` de la imagen." + +msgid "Overriding the data type for depth channels is useful because many of the things depth is used for require greater precision. This is a simple override which sets Z and ZBack to float precision. If you want to do something more complex, set this to `Use Default`, and connect an expression or spreadsheet to the `Data Type` plug." +msgstr "Sobrescribir el tipo de datos para canales de profundidad es útil porque muchos usos de la profundidad requieren mayor precisión. Es una sobrescritura simple que establece Z y ZBack en precisión float. Si se desea algo más complejo, establecer esto en `Use Default` y conectar una expresión o hoja de cálculo al conector `Data Type`." + +msgid "The name given to the copies. If this is left empty, the name from the target will be used instead. The names will have a numeric suffix applied to distinguish between the different copies, unless only a single copy is being made. Even in the case of a single copy, a suffix will be applied if necessary to keep the names unique." +msgstr "El nombre dado a las copias. Si se deja vacío, se usará el nombre del objetivo. Los nombres tendrán un sufijo numérico para distinguir entre las diferentes copias, a menos que solo se haga una copia. Incluso con una sola copia, se aplicará un sufijo si es necesario para mantener los nombres únicos." + +msgid "How the camera frustum is fit to the target. `Sphere` approximates the bounding box of the target with a sphere. `Box` uses the actual bounding box, which allows framing closer, but means the camera will move closer or farther depending on the exact alignment of the box to the view ( which makes for a bumpy looking turntable )." +msgstr "Cómo se ajusta el frustum de la cámara al objetivo. `Sphere` aproxima la caja de límites del objetivo con una esfera. `Box` usa la caja de límites real, lo que permite encuadrar más cerca, pero la cámara se moverá según la alineación exacta de la caja con la vista (lo que produce una mesa giratoria con aspecto irregular)." + +msgid "Causes the root location to also be kept in the output scene, in addition to its children. For instance, if the scene contains only `/city/street/house` and the root is set to `/city/street`, then the new scene will by default contain only `/house` - but the `includeRoot` setting will cause it to contain `/street/house` instead." +msgstr "Hace que la ubicación raíz también se conserve en la escena de salida, además de sus secundarios. Por ejemplo, si la escena contiene solo `/city/street/house` y la raíz es `/city/street`, la nueva escena por defecto contendrá solo `/house` - pero la configuración `includeRoot` hará que contenga `/street/house` en su lugar." + +msgid "The standard mode selects locations based on an `id` layer with a corresponding manifest. `Instance` mode instead picks instance ids based on an `instanceID` layer ( this will only contain information for encapsulated instancers, which don't pass multiple locations to the renderer, but do set up special instance id information )." +msgstr "El modo estándar selecciona ubicaciones basándose en una capa `id` con un manifiesto correspondiente. El modo `Instance` selecciona ids de instancia basándose en una capa `instanceID` (esto solo contendrá información para instanciadores encapsulados, que no pasan múltiples ubicaciones al renderizador, pero configuran información especial de id de instancia)." + +msgid "Padding added to an object's bounding box to take into account displacement. Arnold will subdivide and displace an object the first time a ray intersects its bounding box, so if the padding is too small, parts of the object will be clipped. If the padding is too large, rendertime will suffer and Arnold will emit a warning message." +msgstr "Relleno añadido a la caja de límites de un objeto para tener en cuenta el desplazamiento. Arnold subdividirá y desplazará un objeto la primera vez que un rayo intersecte su caja de límites, así que si el relleno es muy pequeño, partes del objeto se recortarán. Si es muy grande, el tiempo de render se verá afectado y Arnold emitirá una advertencia." + +msgid "A multiplier applied to the step size. This is most useful when the step size is computed automatically. Typically stepScale would be increased above 1 to give improved render times when it is known that the VDB file doesn't have a lot of fine detail at the voxel level - a value of 4 might be a good starting point for such a file." +msgstr "Un multiplicador aplicado al tamaño de paso. Es más útil cuando el tamaño de paso se calcula automáticamente. Normalmente stepScale se incrementaría por encima de 1 para mejorar los tiempos de render cuando se sabe que el archivo VDB no tiene mucho detalle fino a nivel de vóxel - un valor de 4 podría ser un buen punto de partida." + +msgid "An additional set of variables to be created. These are defined as key/value pairs in an `IECore::CompoundData` object, which allows a single expression to define a dynamic number of variables. If the same variable is defined by both the `variables` and the `extraVariables` plugs, then the value from the `variables` plug is taken." +msgstr "Un conjunto adicional de variables a crear. Se definen como pares clave/valor en un objeto `IECore::CompoundData`, lo que permite que una sola expresión defina un número dinámico de variables. Si la misma variable está definida por los conectores `variables` y `extraVariables`, se toma el valor del conector `variables`." + +msgid "The new name for the location. If this name is non-empty then it takes precedence, and all other renaming operations are ignored. > Tip : The `${scene:path}` context variable contains the > location's original name, and can be used in a Spreadsheet's > `selector` to allow each row to define the new name for a > particular location." +msgstr "El nuevo nombre para la ubicación. Si este nombre no está vacío, tiene prioridad y se ignoran todas las demás operaciones de renombrado. > Consejo: La variable de contexto `${scene:path}` contiene el nombre original de la ubicación, y puede usarse en el `selector` de una hoja de cálculo para permitir que cada fila defina el nuevo nombre para una ubicación particular." + +msgid "Define image channels to output by adding child plugs and connecting corresponding OSL shaders. You can drive RGB layers with a color, or connect individual channels to a float. If you want to add multiple channels at once, you can also add a closure plug, which can accept a connection from an OSLCode with a combined output closure." +msgstr "Definir canales de imagen a generar añadiendo conectores secundarios y conectando los shaders OSL correspondientes. Se pueden controlar capas RVA con un color, o conectar canales individuales a un flotante. Para añadir múltiples canales a la vez, también se puede añadir un conector de closure, que acepta una conexión de un OSLCode con una closure de salida combinada." + +msgid "How many tasks the bake process will be split into. UDIMs cannot be split across tasks, so if you have few UDIMs available, the extra tasks won't do anything, but if you have a large number of UDIMs, and are dispatching to a pool of machines, increasing the number of tasks used will speed up bakes, at the cost of using more machines." +msgstr "En cuántas tareas se dividirá el proceso de horneado. Los UDIMs no pueden dividirse entre tareas, así que si hay pocos UDIMs disponibles, las tareas extra no harán nada, pero si hay muchos UDIMs y se despacha a un grupo de máquinas, aumentar el número de tareas acelerará los horneados, a costa de usar más máquinas." + +msgid "Determines how missing frames are handled when the input fileName is a file sequence (uses the '#' character). The default behaviour is to throw an exception, but it can also hold the last valid frame in the sequence, or return a black image which matches the data window and display window of the previous valid frame in the sequence." +msgstr "Determina cómo se manejan los fotogramas faltantes cuando el fileName de entrada es una secuencia de archivos (usa el carácter '#'). El comportamiento predeterminado es lanzar una excepción, pero también puede mantener el último fotograma válido, o devolver una imagen negra que coincida con las ventanas de datos y visualización del fotograma válido anterior." + +msgid "Whether accurate filter sizes should be computed that take into account the amount of distortion in the size and shape of pixels. Should have minimal impact on warps that mostly preserve the size of pixels, but could have a large impact if there is heavy distortion. Fixes problems with aliasing, at the cost of some extra calculations." +msgstr "Indica si se deben calcular tamaños de filtro precisos que tengan en cuenta la distorsión en el tamaño y forma de los píxeles. Debería tener un impacto mínimo en deformaciones que mayormente preservan el tamaño de los píxeles, pero podría tener un gran impacto si hay mucha distorsión. Corrige problemas de aliasing, a costa de algunos cálculos extra." + +msgid "Create tightly fitted bounding boxes that exactly fit each split child mesh. This requires visiting the vertices of the input mesh, so is more expensive. If false, the bounding box of the original mesh is used for all new meshes - this is technically correct, since they are all contained within this bounding box, but isn't as informative." +msgstr "Crear cajas de límites ajustadas que se adapten exactamente a cada malla secundaria dividida. Requiere visitar los vértices de la malla de entrada, por lo que es más costoso. Si es falso, la caja de límites de la malla original se usa para todas las nuevas mallas - técnicamente correcto, ya que todas están contenidas dentro, pero no es tan informativo." + +msgid "The method for displaying the data. - Auto : Chooses the most appropriate mode based on the data and primitive type. - Color : Values are remapped from the range `[valueMin, valueMax]` to `[0, 1]`. - Color (Auto Range) : Float, integer, V2f and color data is displayed without modification. Vector data is remapped from `[-1, 1]` to `[0, 1]`." +msgstr "El método para mostrar los datos. - Auto: Elige el modo más apropiado según el tipo de dato y primitiva. - Color: Los valores se reasignan del rango `[valueMin, valueMax]` a `[0, 1]`. - Color (Auto Range): Los datos flotante, entero, V2f y color se muestran sin modificación. Los datos vectoriales se reasignan de `[-1, 1]` a `[0, 1]`." + +msgid "The name of a Context Variable that is set to the current suffix when evaluating the input object. This can be used in upstream expressions and string substitutions to vary the object while creating the primvar copies. For example, you could drive a TimeWarp with this variable in order create copies of a primitive variable at different times." +msgstr "El nombre de una variable de contexto que se establece con el sufijo actual al evaluar el objeto de entrada. Puede usarse en expresiones anteriores para variar el objeto mientras se crean copias de variables primitivas. Por ejemplo, se podría controlar un TimeWarp con esta variable para crear copias de una variable primitiva en diferentes tiempos." + +msgid "The method used to apply an optional label to the dot. Using a node name is recommended, because it encourages the use of descriptive node names, and updates automatically when nodes are renamed or upstream connections change. The custom label does however provide more flexibility, since node names are restricted in the characters they can use." +msgstr "El método utilizado para aplicar una etiqueta opcional al punto. Se recomienda usar un nombre de nodo, porque fomenta el uso de nombres descriptivos y se actualiza automáticamente cuando se renombran los nodos o cambian las conexiones. La etiqueta personalizada ofrece más flexibilidad, ya que los nombres de nodo están restringidos en los caracteres que pueden usar." + +msgid "Interactively displays images as they are rendered. This node runs a server on a background thread, allowing it to receive images from both local and remote render processes. To set up a render to output to the Display node, use an Outputs node with an Interactive output configured to render to the same port as is specified on the Display node." +msgstr "Muestra imágenes interactivamente mientras se renderizan. Este nodo ejecuta un servidor en un hilo de fondo, permitiéndole recibir imágenes de procesos de render locales y remotos. Para configurar un render que envíe salida al nodo Display, usar un nodo Outputs con una salida Interactive configurada al mismo puerto especificado en el nodo Display." + +msgid "Searches an input scene for all locations matched by a filter. > Caution : This can be an arbitrarily expensive operation depending on the size of the input scene and the filter used. In particular it should be noted that the usage of `...` in a PathFilter will cause the entire input scene to be searched even if there are no matches to be found." +msgstr "Busca en una escena de entrada todas las ubicaciones coincidentes con un filtro. > Precaución: Puede ser una operación arbitrariamente costosa dependiendo del tamaño de la escena de entrada y el filtro utilizado. El uso de `...` en un PathFilter causará que toda la escena de entrada sea buscada incluso si no hay coincidencias." + +msgid "The name of the data to visualise. Primitive variable names must be prefixed by `primitiveVariable:`. For example, `primitiveVariable:uv` would display the `uv` primitive variable. Primitive variables of type int, float, V2f, Color3f or V3f can be visualised. To visualise vertex indices instead of a primitive variable, use the value `vertex:index`." +msgstr "El nombre de los datos a visualizar. Los nombres de variables primitivas deben estar prefijados por `primitiveVariable:`. Por ejemplo, `primitiveVariable:uv` mostraría la variable primitiva `uv`. Se pueden visualizar variables primitivas de tipo int, float, V2f, Color3f o V3f. Para visualizar índices de vértice, usar el valor `vertex:index`." + +msgid "The primitive variables to be shuffled - arbitrary numbers of primitive variables may be shuffled via the source/destination plugs. The deleteSource plug may be used to remove the original primitive variable(s). The replaceDestination plug may be used to specify whether each shuffle should replace already written destination data with the same name." +msgstr "Las variables primitivas a reorganizar - se pueden reorganizar números arbitrarios de variables primitivas mediante los conectores de origen/destino. El conector deleteSource puede usarse para eliminar las variables primitivas originales. El conector replaceDestination puede especificar si cada reorganización debe reemplazar datos de destino ya escritos con el mismo nombre." + +msgid "The destination location where filtered locations will be merged to. The destination location will be created if it doesn't exist already. If the name overlaps with an existing location that isn't filtered, the name will get a suffix. May depend on the current value of scene:path in order to individually map input locations to different destinations." +msgstr "La ubicación de destino donde se combinarán las ubicaciones filtradas. Se creará si aún no existe. Si el nombre se superpone con una ubicación existente no filtrada, el nombre recibirá un sufijo. Puede depender del valor actual de scene:path para mapear individualmente las ubicaciones de entrada a diferentes destinos." + +msgid "The primitive variables to be queried - arbitrary numbers of primitive variables may be added as children of this plug via the user interface, or via python. Each child is a `NameValuePlug` whose `name` plug is the name of the primitive variable to query, and whose `value` plug is the default value to use if the primitive variable can not be retrieved." +msgstr "Las variables primitivas a consultar - se pueden añadir números arbitrarios como secundarios de este conector a través de la interfaz, o mediante Python. Cada secundario es un `NameValuePlug` cuyo conector `name` es el nombre de la variable primitiva a consultar, y cuyo conector `value` es el valor predeterminado si no se puede recuperar." + +msgid "The context variables to be queried - arbitrary numbers of context variables may be added as children of this plug via the user interface, or via python. Each child is a `NameValuePlug` whose `name` plug is the context variable to query, and whose `value` plug is the default value to use if the variable does not exist in the context with an appropriate type." +msgstr "Las variables de contexto a consultar - se pueden añadir números arbitrarios como secundarios de este conector a través de la interfaz, o mediante Python. Cada secundario es un `NameValuePlug` cuyo conector `name` es la variable de contexto a consultar, y cuyo conector `value` es el valor predeterminado si la variable no existe en el contexto con un tipo apropiado." + +msgid "Vertex id used in \\\"Vertex\\\" target mode. The node will error if the specified vertex id is out of range unless ignoreMissingTarget is true. The node will error if the specified primitive does not have a set of uvs named \\\"uv\\\" with FaceVarying or Vertex interpolation unless ignoreMissingTarget is true. The uvs will be used to construct a local coordinate frame." +msgstr "Id de vértice utilizado en el modo objetivo \\\"Vertex\\\". El nodo generará un error si el id de vértice está fuera de rango a menos que ignoreMissingTarget sea verdadero. El nodo generará un error si la primitiva no tiene un conjunto de UVs llamado \\\"uv\\\" con interpolación FaceVarying o Vertex a menos que ignoreMissingTarget sea verdadero. Los UVs se usarán para construir un marco de coordenadas local." + +msgid "The name of a constant primitive variable containing a list of ids for the elements to affect, corresponding to the current interpolation. For example, if you choose \"Vertex\" interpolation, these will be vertex ids. By default, ids are based on the index, but if you specify an id primitive variable below, the ids in this list will match the id primitive variable." +msgstr "El nombre de una variable primitiva constante que contiene una lista de ids para los elementos a afectar, correspondientes a la interpolación actual. Por ejemplo, si se elige \"Vertex\", serán ids de vértice. Por defecto, los ids se basan en el índice, pero si se especifica una variable primitiva de id abajo, los ids en esta lista coincidirán con ella." + +msgid "The inputs to the shader. Any number of inputs may be created by adding child plugs. Supported plug types and the corresponding OSL types are : - FloatPlug (`float`) - IntPlug (`int`) - ColorPlug (`color`) - V3fPlug (`vector`) - M44fPlug (`matrix`) - StringPlug (`string`) - ClosurePlug (`closure color`) - SplinefColor3f ( triplet of `float [], color [], string` )" +msgstr "Las entradas del shader. Se puede crear cualquier número de entradas añadiendo conectores secundarios. Los tipos de conector soportados y los tipos OSL correspondientes son: - FloatPlug (`float`) - IntPlug (`int`) - ColorPlug (`color`) - V3fPlug (`vector`) - M44fPlug (`matrix`) - StringPlug (`string`) - ClosurePlug (`closure color`) - SplinefColor3f (tripleta de `float [], color [], string`)" + +msgid "The interpolation type of the primitive variables created by this node. For instance, Uniform interpolation means that the shader is run once per face on a mesh, allowing it to output primitive variables with a value per face. All non-constant input primitive variables are resampled to match the selected interpolation so that they can be accessed from the shader." +msgstr "El tipo de interpolación de las variables primitivas creadas por este nodo. Por ejemplo, la interpolación Uniform significa que el shader se ejecuta una vez por cara en una malla, permitiéndole generar variables primitivas con un valor por cara. Todas las variables primitivas de entrada no constantes se remuestrean para coincidir con la interpolación seleccionada." + +msgid "Determines the active frame range to be dispatched as follows : - CurrentFrame dispatches the current frame only, as specified by the `${frame}` context variable. - FullRange uses the full frame range as specified by the `${frameRange:start}` and `${frameRange:end}` context variables. - CustomRange uses a user defined range, as specified by the `frameRange` plug." +msgstr "Determina el rango de fotogramas activo a despachar: - CurrentFrame despacha solo el fotograma actual, según la variable de contexto `${frame}`. - FullRange usa el rango completo según las variables `${frameRange:start}` y `${frameRange:end}`. - CustomRange usa un rango definido por el usuario, según el conector `frameRange`." + +msgid "The file name to use for each texture file written. will be replaced by the UDIM number, and will be replaced by the aov name specified in \"aovs\". If you want to do an animated bake, you can also use #### which will be replaced by the frame number. May be overridden per mesh by specifying the \"bake:fileName\" string attribute on the meshes to be baked." +msgstr "El nombre de archivo para cada textura escrita. se reemplazará por el número UDIM, y se reemplazará por el nombre de VAS especificado en \"aovs\". Para un horneado animado, también se puede usar #### que se reemplazará por el número de fotograma. Puede sobrescribirse por malla especificando el atributo de cadena \"bake:fileName\" en las mallas a hornear." + +msgid "A container for \"subgraphs\" - node networks which exist inside the Box and can be exposed by promoting selected internal plugs onto the outside of the Box. Boxes can be used as an organisational tool for simplifying large graphs by collapsing them into sections which perform distinct tasks. They are also used for authoring files to be used with the Reference node." +msgstr "Un contenedor para \"subgrafos\" - redes de nodos que existen dentro del Box y pueden exponerse promoviendo conectores internos seleccionados hacia el exterior del Box. Los Boxes pueden usarse como herramienta organizativa para simplificar grafos grandes colapsándolos en secciones que realizan tareas distintas. También se usan para crear archivos para usar con el nodo Reference." + +msgid "The mode used to combine the `imager` input with any imagers that already exist in the globals. - Replace : Removes all pre-existing imagers, and replaces them with the new ones. - InsertFirst : Inserts the new imagers so that they will be run before any pre-existing imagers. - InsertLast : Inserts the new imagers so that they will be run after any pre-existing imagers." +msgstr "El modo para combinar la entrada `imager` con cualquier imager que ya exista en los globales. - Replace: Elimina todos los imagers preexistentes y los reemplaza con los nuevos. - InsertFirst: Inserta los nuevos imagers para que se ejecuten antes de los preexistentes. - InsertLast: Inserta los nuevos imagers para que se ejecuten después de los preexistentes." + +msgid "The name of a `float` primitive variable specifying the width of each point. The primitive variable may have either `Vertex` or `Constant` interpolation. If the primitive variable doesn't exist, a width of 1.0 is used. > Note : A point's width needs to be at least 3x `voxelSize` to contribute to > the level set. Smaller points will be ignored, and reported as a warning." +msgstr "El nombre de una variable primitiva `float` que especifica el ancho de cada punto. Puede tener interpolación `Vertex` o `Constant`. Si no existe, se usa un ancho de 1.0. > Nota: El ancho de un punto necesita ser al menos 3 veces `voxelSize` para contribuir al conjunto de nivel. Los puntos más pequeños serán ignorados y se reportarán como advertencia." + +msgid "Outputs the source of the value returned by the query. - None (`0`) : No source was found. Either the parameter does not exist and has no default value, or the camera does not exist. - Camera (`1`) : The camera. - Globals (`2`) : An option in the scene globals. - Fallback (`3`) : The query did not find a result and fell back to returning the default value of the parameter." +msgstr "Genera la fuente del valor devuelto por la consulta. - None (`0`): No se encontró ninguna fuente. El parámetro no existe y no tiene valor predeterminado, o la cámara no existe. - Camera (`1`): La cámara. - Globals (`2`): Una opción en los globales de la escena. - Fallback (`3`): La consulta no encontró resultado y recurrió al valor predeterminado del parámetro." + +msgid "An output containing the index of the row that matches the selector in the current context. > Tip : The default row has index `0`, which converts to `False` > when used to drive a BoolPlug via a connection (all other values > convert to `True`). Therefore `Spreadsheet.activeRowIndex` can > be connected to a Node's `enabled` plug to disable the node when > no row is matched." +msgstr "Una salida que contiene el índice de la fila que coincide con el selector en el contexto actual. > Consejo: La fila predeterminada tiene índice `0`, que se convierte a `False` al controlar un BoolPlug (los demás valores se convierten a `True`). Por lo tanto, `Spreadsheet.activeRowIndex` puede conectarse al conector `enabled` de un nodo para desactivarlo cuando ninguna fila coincide." + +msgid "The current frame. > Note : To perform a computation at a particular time, > you should create your own Context rather than change > the value of this plug. > > ``` > with Gaffer.Context( script.context() ) as c : > c.setFrame( f ) > ... > ``` > > Likewise, you should never refer to this plug from > an expression. Always retrieve the frame with > `context.getFrame()` instead." +msgstr "El fotograma actual. > Nota: Para realizar un cálculo en un momento particular, se debe crear un contexto propio en lugar de cambiar el valor de este conector. > > ``` > with Gaffer.Context( script.context() ) as c : > c.setFrame( f ) > ... > ``` > > De igual forma, nunca referenciar este conector desde una expresión. Siempre recuperar el fotograma con `context.getFrame()`." + +msgid "The image channels to be converted to primitive variables on the points. The chosen channels are converted using the following rules : - The main `RGB` channels are converted to a colour primitive variable called `Cs`. - `.RGB` channels are converted to a colour primitive variable called ``. - Other channels are converted to individual float primitive variables." +msgstr "Los canales de imagen a convertir en variables primitivas en los puntos. Los canales elegidos se convierten según estas reglas: - Los canales `RVA` principales se convierten en una variable primitiva de color llamada `Cs`. - Los canales `.RVA` se convierten en una variable primitiva de color llamada ``. - Los demás canales se convierten en variables primitivas flotantes individuales." + +msgid "The input values to use in defining the perspective projection. They can be either a horizontal field of view (`fieldOfView`), or a film back/sensor (`aperture`) and focal length (`focalLength`). The latter two can take the exact measurements from a real camera and lens setup. With either perspective mode, perspective is stored as `aperture` and `focalLength` parameters on the camera." +msgstr "Los valores de entrada para definir la proyección de perspectiva. Pueden ser un campo de visión horizontal (`fieldOfView`), o un respaldo de película/sensor (`aperture`) y longitud focal (`focalLength`). Los últimos dos pueden tomar medidas exactas de una cámara real. Con cualquier modo de perspectiva, esta se almacena como parámetros `aperture` y `focalLength` en la cámara." + +msgid "Define primitive varibles to output by adding child plugs and connecting corresponding OSL shaders. Supported plug types are : - FloatPlug - IntPlug - ColorPlug - V3fPlug ( outputting vector, normal or point ) - M44fPlug - StringPlug If you want to add multiple outputs at once, you can also add a closure plug, which can accept a connection from an OSLCode with a combined output closure." +msgstr "Definir variables primitivas a generar añadiendo conectores secundarios y conectando los shaders OSL correspondientes. Tipos de conector soportados: - FloatPlug - IntPlug - ColorPlug - V3fPlug (generando vector, normal o punto) - M44fPlug - StringPlug Para añadir múltiples salidas a la vez, también se puede añadir un conector de closure, que acepta una conexión de un OSLCode con una closure de salida combinada." + +msgid "Use \"Fixed\" mode for a curve with a constant vertex count. Use \"Variable\" mode for a curve sampled at regular `step` intervals. > Note : This curve may have a changing vertex count over a frame range. > Caution : In \"Variable\" mode it may not be possible to render with deformation blur enabled. Be sure to disable it via `StandardAttributes` if you want to render a variable sampled curve." +msgstr "Usar modo \"Fixed\" para una curva con un conteo de vértices constante. Usar modo \"Variable\" para una curva muestreada a intervalos regulares de `step`. > Nota: Esta curva puede tener un conteo de vértices cambiante en un rango de fotogramas. > Precaución: En modo \"Variable\" puede no ser posible renderizar con desenfoque de deformación activado. Desactivarlo mediante `StandardAttributes` si se desea renderizar una curva de muestreo variable." + +msgid "Create mode creates a new set containing only the specified paths. If a set with the same name already exists, it is replaced. Add mode adds the specified paths to an existing set, keeping the paths already in the set. If the set does not exist yet, this is the same as create mode. Remove mode removes the specified paths from an existing set. If the set does not exist yet, nothing is done." +msgstr "El modo Crear crea un nuevo conjunto conteniendo solo las rutas especificadas. Si ya existe uno con el mismo nombre, se reemplaza. El modo Añadir añade las rutas especificadas a un conjunto existente, conservando las existentes. Si el conjunto aún no existe, es igual que Crear. El modo Eliminar elimina las rutas especificadas de un conjunto existente. Si no existe, no se hace nada." + +msgid "Enables debug output. The HorizontalPass setting outputs an intermediate image filtered just in the horizontal direction - this is an internal optimisation used when filtering with a separable filter. The SinglePass setting forces all filtering to be done in a single pass (as if the filter was non-separable) and can be used for validating the results of the the two-pass (default) approach." +msgstr "Activa la salida de depuración. HorizontalPass genera una imagen intermedia filtrada solo en dirección horizontal - optimización interna usada al filtrar con un filtro separable. SinglePass fuerza todo el filtrado en un solo paso (como si el filtro fuera no separable) y puede usarse para validar los resultados del enfoque de dos pasos (predeterminado)." + +msgid "How far Arnold steps away from the surface before tracing back. If too large for your scene, you will incorrectly capture occluders near the mesh instead of the mesh itself. If too small, everything will go speckly because Arnold has insufficient precision to hit the mesh. For objects which are fairly large and simple, the default 0.1 should work. Smaller objects may require smaller values." +msgstr "Qué tan lejos se aleja Arnold de la superficie antes de trazar de vuelta. Si es demasiado grande, se capturarán incorrectamente oclusores cerca de la malla en lugar de la malla misma. Si es muy pequeño, todo se verá moteado porque Arnold no tiene suficiente precisión para alcanzar la malla. Para objetos grandes y simples, el valor predeterminado 0.1 debería funcionar. Objetos más pequeños pueden requerir valores menores." + +msgid "The image channels to be converted to primitive variables on the points primitive. The chosen channels are converted using the following rules : - The main `RGB` channels are converted to a colour primitive variable called `Cs`. - `.RGB` channels are converted to a colour primitive variable called ``. - Other channels are converted to individual float primitive variables." +msgstr "Los canales de imagen a convertir en variables primitivas en la primitiva de puntos. Los canales elegidos se convierten según estas reglas: - Los canales `RVA` principales se convierten en una variable primitiva de color llamada `Cs`. - Los canales `.RVA` se convierten en una variable primitiva de color llamada ``. - Los demás canales se convierten en variables primitivas flotantes individuales." + +msgid "Filters the displayed properties. The filter may contain any of Gaffer's standard wildcards, and may either be used to match individual property names or entire paths. Examples -------- - `samples` : Shows all properties which have `samples` anywhere in their name, be they options, outputs or anything else. - `/Options/Standard` : Shows standard options. - `/Outputs/.../Data` : Shows the Data field for all outputs." +msgstr "Filtra las propiedades mostradas. El filtro puede contener cualquiera de los comodines estándar de Gaffer, y puede usarse para coincidir con nombres de propiedades individuales o rutas completas. Ejemplos -------- - `samples`: Muestra todas las propiedades que contienen `samples` en su nombre, ya sean opciones, salidas o cualquier otra cosa. - `/Options/Standard`: Muestra opciones estándar. - `/Outputs/.../Data`: Muestra el campo Data de todas las salidas." + +msgid "Filters the input scene to isolate locations with matching names. The filter may contain any of Gaffer's standard wildcards, and may either be used to match individual location names or entire paths. Examples -------- - `building` : Matches any location in the scene which has the text `building` anywhere in its name. - `/cityA/.../building*` : Matches only locations within `cityA` whose name starts with `building`." +msgstr "Filtra la escena de entrada para aislar ubicaciones con nombres coincidentes. El filtro puede contener cualquiera de los comodines estándar de Gaffer, y puede usarse para coincidir con nombres de ubicación individuales o rutas completas. Ejemplos -------- - `building`: Coincide con cualquier ubicación en la escena que contenga `building` en su nombre. - `/cityA/.../building*`: Coincide solo con ubicaciones dentro de `cityA` cuyo nombre comience con `building`." + +msgid "The setting equivalent to the f-number on a camera, which ultimately determines the strength of the depth of field blur. A lower value produces more blur. As in a real camera, `fStop` is defined as `focalLength / lens aperture`. To enable depth of field blur (if your renderer supports it), give this plug a value greater than 0, and, on a downstream StandardOptions node, enable the _Depth Of Field_ plug and turn it on." +msgstr "El ajuste equivalente al número f en una cámara, que determina la intensidad del desenfoque de profundidad de campo. Un valor menor produce más desenfoque. Como en una cámara real, `fStop` se define como `focalLength / apertura de lente`. Para activar el desenfoque de profundidad de campo (si el renderizador lo soporta), dar a este conector un valor mayor que 0, y en un nodo StandardOptions posterior, activar el conector _Depth Of Field_." + +msgid "Overrides the subdivision scheme that determines the shape of the surface. By default, the subdivision scheme used comes from the mesh's interpolation property, which should be set with a MeshType node, so it will apply to rendering the surface, and also this node. Overriding is useful if a mesh has not been tagged correctly ( for example, if you want to force a mesh to be smooth, you can set scheme to CatmullClark )." +msgstr "Sobrescribe el esquema de subdivisión que determina la forma de la superficie. Por defecto, el esquema proviene de la propiedad de interpolación de la malla, que debe establecerse con un nodo MeshType, y se aplicará tanto al renderizado de la superficie como a este nodo. Sobrescribir es útil si una malla no ha sido etiquetada correctamente (por ejemplo, para forzar que una malla sea suave, se puede establecer el esquema en CatmullClark)." + +msgid "How blocked does a sample have to be before it is omitted. By default, only 100% occluded samples are omitted, but if you select 0.99, then samples with only 1% visibility would also be omitted. The composited result is preserved by combining the values of any omitted samples with the last sample generated. Using a threshold lower than 0.99 before doing a DeepMerge or DeepHoldout could introduce large errors, however." +msgstr "Qué tan bloqueada debe estar una muestra antes de ser omitida. Por defecto, solo se omiten muestras 100% ocluidas, pero si se selecciona 0.99, las muestras con solo 1% de visibilidad también se omitirán. El resultado compuesto se preserva combinando los valores de las muestras omitidas con la última muestra generada. Sin embargo, usar un umbral menor que 0.99 antes de un DeepMerge o DeepHoldout podría introducir errores grandes." + +msgid "A space separated list of names of primitive variables specifying instances to make inactive. Inactive instances are not output from the instancer or rendered. Each primitive variable either must be a constant vector of type Int or Int64 with a list of matching ids to deactivate, or it must be a vertex bool primitive variable, in which case it will deactivate the instance for the corresponding vertex if the value is true." +msgstr "Una lista separada por espacios de nombres de variables primitivas que especifican instancias a desactivar. Las instancias inactivas no se generan desde el instanciador ni se renderizan. Cada variable primitiva debe ser un vector constante de tipo Int o Int64 con una lista de ids coincidentes a desactivar, o una variable primitiva bool por vértice, que desactivará la instancia del vértice correspondiente si el valor es verdadero." + +msgid "An output plug containing the resolved cell values for all enabled rows, This can be used to drive expressions in situations where the standard `out` plug is not useful, or would be awkward to use. The values are formatted as follows : ``` { \"row1Name\" : { \"columnName\" : columnValue, ... }, \"row2Name\" : { \"columnName\" : columnValue, ... }, ... } ``` > Note : The output is completely independent of the value of > `selector`." +msgstr "Un conector de salida que contiene los valores de celda resueltos para todas las filas activadas. Puede usarse para controlar expresiones en situaciones donde el conector `out` estándar no es útil. Los valores se formatean así: ``` { \"row1Name\" : { \"columnName\" : columnValue, ... }, \"row2Name\" : { \"columnName\" : columnValue, ... }, ... } ``` > Nota: La salida es completamente independiente del valor de `selector`." + +msgid "By default, vdbs will be replaced with a mesh in place, using the destination `${scene:path}`. The destination can be modified to change where the outputs are placed. If multiple filtered locations have the same destination, the vdbs will be merged into one mesh. The destination location will be created if it doesn't exist already. If the name overlaps with an existing location that isn't filtered, the name will get a suffix." +msgstr "Por defecto, los VDBs se reemplazarán con una malla en su lugar, usando el destino `${scene:path}`. El destino puede modificarse para cambiar dónde se colocan las salidas. Si múltiples ubicaciones filtradas tienen el mismo destino, los VDBs se combinarán en una malla. La ubicación de destino se creará si no existe. Si el nombre se superpone con una ubicación existente no filtrada, recibirá un sufijo." + +msgid "Creates displacements to be applied to meshes for rendering in Arnold. A displacement consists of a shader to provide the displacement map and several attributes to control the height and other displacement properties. Use an ArnoldAttributes node to control the subdivision settings of the mesh, which in turn controls the detail of the displacement. Use a ShaderAssignment node to assign the ArnoldDisplacement to specific objects." +msgstr "Crea desplazamientos para aplicar a mallas para renderizado en Arnold. Un desplazamiento consiste en un shader que proporciona el mapa de desplazamiento y varios atributos para controlar la altura y otras propiedades. Utilizar un nodo ArnoldAttributes para controlar la configuración de subdivisión de la malla, que a su vez controla el detalle del desplazamiento. Utilizar un nodo ShaderAssignment para asignar el ArnoldDisplacement a objetos específicos." + +msgid "Additional metadata to be added, specified within a single `IECore.CompoundObject`. This is convenient when using an expression to define the metadata and when the number of items might be dynamic. It can also be used to create options whose type cannot be handled by the `metadata` CompoundDataPlug. If the same option is defined by both the `metadata` and the `extraMetadata` plugs, then the value from the `extraMetadata` is taken." +msgstr "Metadatos adicionales a añadir, especificados dentro de un solo `IECore.CompoundObject`. Esto es conveniente al usar una expresión para definir los metadatos y cuando el número de elementos puede ser dinámico. También puede usarse para crear opciones cuyo tipo no puede ser manejado por el CompoundDataPlug `metadata`. Si la misma opción está definida por ambos conectores `metadata` y `extraMetadata`, se toma el valor de `extraMetadata`." + +msgid "An additional set of variables to be added. Arbitrary numbers of variables may be specified within a single IECore::CompoundData object, where each key/value pair in the object defines a variable. This is convenient when using an expression to define the variables and the variable count might be dynamic. If the same variable is defined by both the variables and the extraVariables plugs, then the value from the extraVariables is taken." +msgstr "Un conjunto adicional de variables a añadir. Se puede especificar un número arbitrario de variables dentro de un solo objeto IECore::CompoundData, donde cada par clave/valor define una variable. Esto es conveniente al usar una expresión para definir las variables y el conteo puede ser dinámico. Si la misma variable está definida por ambos conectores variables y extraVariables, se toma el valor de extraVariables." + +msgid "The ray marching step size. This should be small enough to capture the smallest details in the volume. Values which are too large will cause aliasing artifacts, and values which are too small will cause rendering to be excessively slow. The default value of 0 causes the size to be calculated automatically based on the resolution of the VDB file. The step scale can then be used to make relative adjustments on top of this automatic size." +msgstr "El tamaño del paso de marcha de rayos. Debe ser suficientemente pequeño para capturar los detalles más pequeños en el volumen. Valores demasiado grandes causarán artefactos de aliasing, y valores demasiado pequeños causarán que el renderizado sea excesivamente lento. El valor predeterminado de 0 causa que el tamaño se calcule automáticamente según la resolución del archivo VDB. El step scale puede usarse para hacer ajustes relativos sobre este tamaño automático." + +msgid "By default, meshes will be replaced with a level set in place, using the destination `${scene:path}`. The destination can be modified to change where the outputs are placed. If multiple filtered locations have the same destination, the meshes will be merged into one level set. The destination location will be created if it doesn't exist already. If the name overlaps with an existing location that isn't filtered, the name will get a suffix." +msgstr "Por defecto, las mallas se reemplazarán con un conjunto de nivel en su lugar, usando el destino `${scene:path}`. El destino puede modificarse para cambiar dónde se colocan las salidas. Si múltiples ubicaciones filtradas tienen el mismo destino, las mallas se combinarán en un conjunto de nivel. La ubicación de destino se creará si no existe. Si el nombre se superpone con una ubicación existente no filtrada, recibirá un sufijo." + +msgid "The name of an index Context Variable defined by the wedge. This is assigned values starting at 0 and incrementing for each new value - for instance a wedged float range might assign variable values of `0.25, 0,5, 0.75` or `0.1, 0,2, 0.3` but the corresponding index variable would take on values of `0, 1, 2` in both cases. The index variable is particularly useful for generating unique filenames when using a float range to perform wedged renders." +msgstr "El nombre de una variable de contexto de índice definida por la cuña. Se le asignan valores empezando en 0 e incrementando para cada nuevo valor - por ejemplo, un rango de flotantes con cuña podría asignar valores de variable `0.25, 0.5, 0.75` o `0.1, 0.2, 0.3` pero la variable de índice correspondiente tomaría valores de `0, 1, 2` en ambos casos. La variable de índice es particularmente útil para generar nombres de archivo únicos al usar un rango flotante para realizar renders con cuña." + +msgid "If `prototypeMode` is set to \"Indexed (Roots Variable)\", then this should specify the name of a constant string array primitive variable used to map between `prototypeIndex` and paths in the prototypes scene. If `prototypeMode` is set to \"Root per Vertex\", then this should specify the name of a per-vertex string primitive variable used to specify a path in the prototypes scene for each instance. This plug is not used in \"Indexed (Roots List)\" mode." +msgstr "Si `prototypeMode` está establecido en \"Indexed (Roots Variable)\", debe especificar el nombre de una variable primitiva de array de cadenas constante usada para mapear entre `prototypeIndex` y rutas en la escena de prototipos. Si `prototypeMode` está en \"Root per Vertex\", debe especificar el nombre de una variable primitiva de cadena por vértice usada para especificar una ruta en la escena de prototipos para cada instancia. Este conector no se usa en modo \"Indexed (Roots List)\"." + +msgid "Whether or not the files exists and can be read into memory, value calculated per frame if an image sequence. Behaviour changes if a frame mask of ClampToFrame or Black is selected, if outside the frame mask fileValid will be set to True if the nearest frame is valid. > Note : When the file is not valid, the image will also contain a `fileValid` > metadata value of `False`. This can be easier to access from downstream > nodes than the `fileValid` plug itself." +msgstr "Indica si los archivos existen y pueden leerse en memoria, valor calculado por fotograma si es una secuencia de imágenes. El comportamiento cambia si se selecciona una máscara de fotograma ClampToFrame o Black, si está fuera de la máscara fileValid se establecerá en True si el fotograma más cercano es válido. > Nota: Cuando el archivo no es válido, la imagen también contendrá un valor de metadatos `fileValid` de `False`. Esto puede ser más fácil de acceder desde nodos posteriores que el propio conector `fileValid`." + +msgid "Chooses how to select which elements are affected. Only takes effect if you choose an interpolation other than \"Any\" or \"Constant\". \"Id List\" shows a list plug to manually select ids. \"Id List Primitive Variable\" takes the name of a constant array primitive variable containing a list of ids. \"Mask Primitive Variable\" takes the name of a primvar that must match the selected interpolation - the tweak will apply to all elements where the primitive variable is non-zero." +msgstr "Elige cómo seleccionar qué elementos se afectan. Solo tiene efecto si se elige una interpolación diferente a \"Any\" o \"Constant\". \"Id List\" muestra un conector de lista para seleccionar ids manualmente. \"Id List Primitive Variable\" toma el nombre de una variable primitiva constante de array que contiene una lista de ids. \"Mask Primitive Variable\" toma el nombre de una variable primitiva que debe coincidir con la interpolación seleccionada - el ajuste se aplicará a todos los elementos donde la variable primitiva sea distinta de cero." + +msgid "Quantizing to a large interval reduces the number of variations created. For example, if the primvar varies from 0 to 1, and you quantize to 0.2, then only 6 unique variations will be created, even if there are millions of instances. This dramatically improves performance, but if you need to see more continuous changes in the primvar values, you will need to reduce quantize, or in extreme cases where you need full accuracy and don't care about performance, set it to 0." +msgstr "Cuantizar a un intervalo grande reduce el número de variaciones creadas. Por ejemplo, si la variable primitiva varía de 0 a 1, y se cuantiza a 0.2, solo se crearán 6 variaciones únicas, incluso si hay millones de instancias. Esto mejora dramáticamente el rendimiento, pero si se necesitan cambios más continuos en los valores de la variable primitiva, se deberá reducir la cuantización, o en casos extremos donde se necesite precisión total y no importe el rendimiento, establecerlo en 0." + +msgid "The replacement for strings matched by the `find` plug. When `useRegularExpressions` is on, this can refer to captured patterns using Python's standard string formatting syntax : - `{0}` : The entire string matched by the regular expresion. - `{1}` : The 1st subgroup captured within `()` brackets by the `find` string. - `{N}` : The Nth subgroup captured within `()` brackets by the `find` string. - `{1:0>4}` : The 1st subgroup, aligned to the right and padded to width 4." +msgstr "El reemplazo para las cadenas coincidentes con el conector `find`. Cuando `useRegularExpressions` está activado, puede referenciar patrones capturados usando la sintaxis de formato de cadena estándar de Python: - `{0}`: La cadena completa coincidente con la expresión regular. - `{1}`: El primer subgrupo capturado dentro de paréntesis `()` por la cadena `find`. - `{N}`: El N-ésimo subgrupo capturado. - `{1:0>4}`: El primer subgrupo, alineado a la derecha y rellenado a ancho 4." + +msgid "The style of how to calculate the Tangents. (UV) calculates the tangents based on the gradient of the the corresponding UVs (FirstEdge) defines the vector to the first neighbor as tangent and the bitangent orthogonal to tangent and normal (TwoEdges) defines the vector between the first two neighbors as tangent and the bitangent orthogonal to tangent and normal (PrimitiveCentroid) points the tangent towards the primitive centroid and the bitangent orthogonal to tangent and normal" +msgstr "El estilo de cómo calcular las tangentes. (UV) calcula las tangentes basándose en el gradiente de los UVs correspondientes (FirstEdge) define el vector al primer vecino como tangente y la bitangente ortogonal a tangente y normal (TwoEdges) define el vector entre los primeros dos vecinos como tangente y la bitangente ortogonal a tangente y normal (PrimitiveCentroid) apunta la tangente hacia el centroide de la primitiva y la bitangente ortogonal a tangente y normal" + +msgid "When enabled, the specified command is interpreted as a shell command and run in a child shell. This allows semantics such as pipes to be used. Otherwise the supplied command is invoked directly as an executable and its args. > Note: On MacOS with System Integrity Protection enabled, child > shells will not inherit `DYLD_LIBRARY_PATH` from the Gaffer > process. If the executable you are running relies on this, > disabling _shell_ should allow it to inherit the full Gaffer > environment." +msgstr "Cuando está activado, el comando especificado se interpreta como un comando de shell y se ejecuta en un shell secundario. Esto permite usar semánticas como tuberías. De lo contrario, el comando proporcionado se invoca directamente como un ejecutable y sus argumentos. > Nota: En MacOS con System Integrity Protection activado, los shells secundarios no heredarán `DYLD_LIBRARY_PATH` del proceso Gaffer. Si el ejecutable depende de esto, desactivar _shell_ debería permitirle heredar el entorno completo de Gaffer." + +msgid "Look Syntax: Multiple looks are combined with commas: 'neutral, primary' Direction is specified with +/- prefixes: '+neutral, -primary' Missing look 'fallbacks' specified with |: 'neutral, -primary | -primary'" +msgstr "Sintaxis de Look: Múltiples looks se combinan con comas: 'neutral, primary' La dirección se especifica con prefijos +/-: '+neutral, -primary' Los 'respaldos' de looks faltantes se especifican con |: 'neutral, -primary | -primary'" + +msgid "Specifies the camera to look through when lookThrough.enabled is on. The default value means that the current render camera will be used - the paths to other cameras may be specified to choose another camera.\"" +msgstr "Especifica la cámara a través de la cual mirar cuando lookThrough.enabled está activado. El valor predeterminado significa que se usará la cámara de render actual - se pueden especificar las rutas a otras cámaras para elegir otra cámara.\"" + +msgid "The location within the scene to query the transform for relative space mode. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values." +msgstr "La ubicación dentro de la escena en la que consultar la transformación para el modo de espacio relativo. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "Whether to center the output image (based on the existing display window) inside the new display window format. This plug is only used if 'Area Source' is set to Format, and 'Affect Display Window' it checked." +msgstr "Indica si se debe centrar la imagen de salida (basada en la ventana de visualización existente) dentro del nuevo formato de ventana de visualización. Este conector solo se usa si 'Area Source' está establecido en Format, y 'Affect Display Window' está marcado." + +msgid "The method used to merge transforms when the same location exists in multiple input scenes. Keep mode keeps the transform from the first input, and Replace mode replaces it with the transform of the last input." +msgstr "El método utilizado para combinar transformaciones cuando la misma ubicación existe en múltiples escenas de entrada. El modo Conservar mantiene la transformación de la primera entrada, y el modo Reemplazar la sustituye con la transformación de la última entrada." + +msgid "The filter used to choose the source locations to be merged. Source locations are pruned from the output scene, unless they are reused as part of a destination location (or a separate source scene is connected)." +msgstr "El filtro utilizado para elegir las ubicaciones de origen a combinar. Las ubicaciones de origen se podan de la escena de salida, a menos que se reutilicen como parte de una ubicación de destino (o se conecte una escena de origen separada)." + +msgid "Vertex interpolated int, float or bool primitive variable to choose which points to delete. Note a non-zero value indicates the point will be deleted. Only used when `selectionMode` is \"VertexPrimitiveVariable\"." +msgstr "Variable primitiva de tipo int, float o bool con interpolación Vertex para elegir qué puntos eliminar. Un valor distinto de cero indica que el punto se eliminará. Solo se usa cuando `selectionMode` es \"VertexPrimitiveVariable\"." + +msgid "Turn on to allow location-specific tweaks to be made to inherited shaders. Shaders will be localised to locations matching the node's filter prior to tweaking. The original inherited shader will remain untouched." +msgstr "Activar para permitir ajustes específicos por ubicación a shaders heredados. Los shaders se localizarán en las ubicaciones que coincidan con el filtro del nodo antes de ajustar. El shader heredado original permanecerá intacto." + +msgid "LightFilter that can be positioned in space to filter light in a particular region. Note that this is a non-physical effect. LightFilters need to get linked to lights which you can do via a StandardAttributes node." +msgstr "Filtro de luz que puede posicionarse en el espacio para filtrar la luz en una región particular. Esto es un efecto no físico. Los filtros de luz necesitan vincularse a luces, lo cual puede hacerse mediante un nodo StandardAttributes." + +msgid "The interpolation of the normal primitive variable we are creating. Affects the shape of the resulting normals, because Uniform ( Per-Face ) normals are inherently faceted, whereas Vertex normals are always smooth." +msgstr "La interpolación de la variable primitiva de normal que estamos creando. Afecta la forma de las normales resultantes, porque las normales Uniform (por cara) son inherentemente facetadas, mientras que las normales Vertex son siempre suaves." + +msgid "The outputs from the shader. Any number of outputs may be created by adding child plugs. Supported plug types are as for the input parameters, with the exception of SplinefColor3f, which cannot be used as an output." +msgstr "Las salidas del shader. Se puede crear cualquier número de salidas añadiendo conectores secundarios. Los tipos de conector soportados son los mismos que para los parámetros de entrada, con la excepción de SplinefColor3f, que no puede usarse como salida." + +msgid "The name of a Context Variable used to specify the index of the current iteration. This can be referenced from expressions within the loop network to modify the operations performed during each iteration of the loop." +msgstr "El nombre de una variable de contexto utilizada para especificar el índice de la iteración actual. Puede referenciarse desde expresiones dentro de la red del bucle para modificar las operaciones realizadas durante cada iteración del bucle." + +msgid "The name of a `V3f` primitive variable specifying the velocity of each point. Velocity is specified in local-space units per second, and the trail is automatically scaled to represent the motion within a single frame." +msgstr "El nombre de una variable primitiva `V3f` que especifica la velocidad de cada punto. La velocidad se especifica en unidades de espacio local por segundo, y la estela se escala automáticamente para representar el movimiento dentro de un solo fotograma." + +msgid "Enables or disables collection. This may be varied based on the context variable, so that collection may be disabled in some contexts but not others. Only values for enabled contexts are included in the output arrays." +msgstr "Activa o desactiva la recopilación. Puede variarse según la variable de contexto, para que la recopilación se desactive en algunos contextos pero no en otros. Solo los valores de contextos activados se incluyen en los arreglos de salida." + +msgid "The method used to merge scene globals. Keep mode keeps the globals from the first input, Replace mode replaces them with the globals from the last input, and Merge mode merges all globals together from first to last." +msgstr "El método utilizado para combinar los globales de la escena. El modo Conservar mantiene los globales de la primera entrada, el modo Reemplazar los sustituye con los de la última entrada, y el modo Combinar fusiona todos los globales de primera a última." + +msgid "For multi-view images, sets the data windows to be the same for all views, by expanding them all to include the union of all views. Wastes disk space and processing time, but is required by Nuke for multi-view images." +msgstr "Para imágenes de múltiples vistas, establece las ventanas de datos iguales para todas las vistas, expandiéndolas para incluir la unión de todas las vistas. Desperdicia espacio en disco y tiempo de procesamiento, pero es requerido por Nuke para imágenes de múltiples vistas." + +msgid "The method used to merge objects when the same location exists in multiple input scenes. Keep mode keeps the object from the first input, and Replace mode replaces it with the object from the last input which has one." +msgstr "El método utilizado para combinar objetos cuando la misma ubicación existe en múltiples escenas de entrada. El modo Conservar mantiene el objeto de la primera entrada, y el modo Reemplazar lo sustituye con el objeto de la última entrada que tenga uno." + +msgid "When tidying, omits fully transparent samples. This is usually just an optimization, but it could affect the composited result if you start with purely additive samples that have zero alpha, but still add to the color." +msgstr "Al ordenar, omite muestras completamente transparentes. Normalmente es solo una optimización, pero podría afectar el resultado compuesto si se comienza con muestras puramente aditivas que tienen alfa cero, pero aún añaden al color." + +msgid "A node which removes named items from the globals. To delete outputs or options specifically, prefer the DeleteOutputs and DeleteOptions nodes respectively, as they provide improved interfaces for their specific tasks." +msgstr "Un nodo que elimina elementos con nombre de los globales. Para eliminar salidas u opciones específicamente, preferir los nodos DeleteOutputs y DeleteOptions respectivamente, ya que proporcionan interfaces mejoradas para sus tareas específicas." + +msgid "The filter used to perform the resampling. The name of any OIIO filter may be specified. The default automatically picks an appropriate high-quality filter based on whether or not the image is being enlarged or reduced." +msgstr "El filtro utilizado para realizar el remuestreo. Se puede especificar el nombre de cualquier filtro OIIO. El valor predeterminado elige automáticamente un filtro de alta calidad apropiado según si la imagen se está ampliando o reduciendo." + +msgid "Output containing all the names of the images in the Catalogue. Possible uses include : - Looping over all images using a Wedge and a CatalogueSelect. - Making a ContactSheet using the Collect mode and a CatalogueSelect." +msgstr "Salida que contiene todos los nombres de las imágenes en el catálogo. Posibles usos incluyen: - Iterar sobre todas las imágenes usando un Wedge y un CatalogueSelect. - Crear una hoja de contacto usando el modo Collect y un CatalogueSelect." + +msgid "Assigns an imager. This is stored as an `ai:imager` option in Gaffer's globals, and applied to all render outputs. > Tip : Use the `layer_selection` parameter on each imager to control > which AOVs the imager applies to." +msgstr "Asigna un imager. Se almacena como una opción `ai:imager` en los globales de Gaffer, y se aplica a todas las salidas de render. > Consejo: Utilizar el parámetro `layer_selection` en cada imager para controlar a qué VAS se aplica el imager." + +msgid "Creates an arbitrary clipping plane. This is like the near and far clipping planes provided by the Camera node, but can be positioned arbitrarily in space. All geometry on the positive Z side of the plane is clipped away." +msgstr "Crea un plano de recorte arbitrario. Es similar a los planos de recorte cercano y lejano proporcionados por el nodo Camera, pero puede posicionarse arbitrariamente en el espacio. Toda la geometría en el lado Z positivo del plano se recorta." + +msgid "The shape of the light. Typically, disks should be used with spotlight shaders and spheres should be used with point light shaders. The \"Geometry\" shape allows the use of custom geometry specific to a particular renderer." +msgstr "La forma de la luz. Normalmente, los discos deben usarse con shaders de foco y las esferas con shaders de luz puntual. La forma \"Geometry\" permite el uso de geometría personalizada específica de un renderizador particular." + +msgid "UV coordinate used in \\\"UV\\\" target mode. The node will error if the specified uv coordinate is out of range or does not map unambiguously to a single position on the primitive's surface unless ignoreMissingTarget is true." +msgstr "Coordenada UV utilizada en el modo objetivo \\\"UV\\\". El nodo generará un error si la coordenada UV especificada está fuera de rango o no mapea de forma inequívoca a una sola posición en la superficie de la primitiva, a menos que ignoreMissingTarget sea verdadero." + +msgid "Used to decide whether edges are smooth or sharp when generating a normal primvar with FaceVarying interpolation. FaceVertices with normals that differ by less than this angle will be averaged together into a smooth normal." +msgstr "Se utiliza para decidir si los bordes son suaves o agudos al generar una variable primitiva de normal con interpolación FaceVarying. Los vértices de cara con normales que difieren por menos de este ángulo se promediarán juntos en una normal suave." + +msgid "descripción" +msgstr "descripción" + +msgid "spreadsheet:columnLabel" +msgstr "spreadsheet:columnLabel" + +msgid "The value to output if the parameter does not exist." +msgstr "El valor a generar si el parámetro no existe." + +msgid "Rotation component of requested transform (degrees)." +msgstr "Componente de rotación de la transformación solicitada (grados)." + +msgid "The name of the normal primitive variable to output." +msgstr "El nombre de la variable primitiva de normal a generar." + +msgid "The scene location to which the cameras are pointed." +msgstr "La ubicación de la escena a la que se apuntan las cámaras." + +msgid "The interpolation mode for the color transformation." +msgstr "El modo de interpolación para la transformación de color." + +msgid "Suffix for the attribute used for shader assignment." +msgstr "Sufijo para el atributo utilizado para la asignación de shader." + +msgid "An additional multiplier on the width of each point." +msgstr "Un multiplicador adicional sobre el ancho de cada punto." + +msgid "Hides render passes that are disabled for rendering." +msgstr "Oculta los pases de render que están desactivados para renderizar." + +msgid "The OSL shader to be assigned to the light geometry." +msgstr "El shader OSL a asignar a la geometría de la luz." + +msgid "Base class for interactive tools used in the Viewer." +msgstr "Clase base para herramientas interactivas usadas en el visor." + +msgid "The resolution and aspect ratio of the output image." +msgstr "La resolución y relación de aspecto de la imagen de salida." + +msgid "The image used to drive the point scattering process." +msgstr "La imagen utilizada para controlar el proceso de dispersión de puntos." + +msgid "Mirrors vertically, flipping the image top to bottom." +msgstr "Refleja verticalmente, volteando la imagen de arriba a abajo." + +msgid "Local center of the sphere level set in object space." +msgstr "Centro local del conjunto de nivel de esfera en espacio de objeto." + +msgid "The location of the camera to use for the projection." +msgstr "La ubicación de la cámara a utilizar para la proyección." + +msgid "Controls tesselation of the sphere when type is Mesh." +msgstr "Controla la teselación de la esfera cuando el tipo es Mesh." + +msgid "Holds a child RowPlug for each row in the spreadsheet." +msgstr "Contiene un RowPlug secundario para cada fila en la hoja de cálculo." + +msgid "Applies color transformations provided by OpenColorIO." +msgstr "Aplica transformaciones de color proporcionadas por OpenColorIO." + +msgid "Bounding box at specified location in specified space." +msgstr "Caja de límites en la ubicación especificada en el espacio especificado." + +msgid "Name of the context variable to put the seed value in." +msgstr "Nombre de la variable de contexto donde colocar el valor de semilla." + +msgid "The input scene containing the render passes to wedge." +msgstr "La escena de entrada que contiene los pases de render para cuña." + +msgid "Tangent slope and scale can be independently adjusted." +msgstr "La pendiente y la escala de la tangente pueden ajustarse independientemente." + +msgid "The colour of the lines forming the border of the grid." +msgstr "El color de las líneas que forman el borde de la cuadrícula." + +msgid "Mirrors horizontally, flopping the image left to right." +msgstr "Refleja horizontalmente, volteando la imagen de izquierda a derecha." + +msgid "Name of the level set grid to offset in the VDB object." +msgstr "Nombre de la cuadrícula de conjunto de nivel a desplazar en el objeto VDB." + +msgid "Name of the level set grid to create in the VDB object." +msgstr "Nombre de la cuadrícula de conjunto de nivel a crear en el objeto VDB." + +msgid "The light group that the mesh light will contribute to." +msgstr "El grupo de luz al que contribuirá la luz de malla." + +msgid "Refer to Cycles's documentation of the emission shader." +msgstr "Consultar la documentación de Cycles sobre el shader de emisión." + +msgid "The bounding box of the external procedural or archive." +msgstr "La caja de límites del procedural externo o archivo." + +msgid "Removes everything with Z less than the near clip depth." +msgstr "Elimina todo con Z menor que la profundidad de recorte cercano." + +msgid "Enables or disables this row. Disabled rows are ignored." +msgstr "Activa o desactiva esta fila. Las filas desactivadas se ignoran." + +msgid "The width of the curves used to represent the wireframe." +msgstr "El ancho de las curvas utilizadas para representar la malla de alambre." + +msgid "Whether or not the mesh light is visible to camera rays." +msgstr "Indica si la luz de malla es visible o no para los rayos de cámara." + +msgid "2d position for the end of the ramp color interpolation." +msgstr "Posición 2D para el final de la interpolación de color de la rampa." + +msgid "The scene from which the primitive variables are copied." +msgstr "La escena de la cual se copian las variables primitivas." + +msgid "Documented in ImageReader, where it is exposed to users." +msgstr "Documentado en ImageReader, donde se expone a los usuarios." + +msgid "The compression method to use when writing the PNG file." +msgstr "El método de compresión a utilizar al escribir el archivo PNG." + +msgid "Isolates the search to this location and its descendants." +msgstr "Aísla la búsqueda a esta ubicación y sus descendientes." + +msgid "Chooses an RGBA layer or an auxiliary channel to display." +msgstr "Elige una capa RVAA o un canal auxiliar para mostrar." + +msgid "The compression method to use when writing the TIFF file." +msgstr "El método de compresión a utilizar al escribir el archivo TIFF." + +msgid "The size of the space between adjacent lines in the grid." +msgstr "El tamaño del espacio entre líneas adyacentes en la cuadrícula." + +msgid "The write mode for the IFF file - scanline or tiled data." +msgstr "El modo de escritura para el archivo IFF - datos por barrido o en bloques." + +msgid "The render type for the newly converted points primitives." +msgstr "El tipo de render para las primitivas de puntos recién convertidas." + +msgid "Refer to Arnold's documentation for the mesh_light shader." +msgstr "Consultar la documentación de Arnold para el shader mesh_light." + +msgid "The write mode for the TIFF file - scanline or tiled data." +msgstr "El modo de escritura para el archivo TIFF - datos por barrido o en bloques." + +msgid "2d position for the start of the ramp color interpolation." +msgstr "Posición 2D para el inicio de la interpolación de color de la rampa." + +msgid "The colour of the lines forming the main part of the grid." +msgstr "El color de las líneas que forman la parte principal de la cuadrícula." + +msgid "The area of the rectangle before the transform is applied." +msgstr "El área del rectángulo antes de aplicar la transformación." + +msgid "The compression method to use when writing the Targa file." +msgstr "El método de compresión a utilizar al escribir el archivo Targa." + +msgid "The screen window at a distance of 1 unit from the camera." +msgstr "La ventana de pantalla a una distancia de 1 unidad de la cámara." + +msgid "Base class for nodes which apply warps to the input image." +msgstr "Clase base para nodos que aplican deformaciones a la imagen de entrada." + +msgid "Defines the interior width of the level set in voxel units." +msgstr "Define el ancho interior del conjunto de nivel en unidades de vóxel." + +msgid "Utility node for computing values via scripted expressions." +msgstr "Nodo utilitario para calcular valores mediante expresiones programadas." + +msgid "Chooses locations by matching them against a list of paths." +msgstr "Elige ubicaciones comparándolas con una lista de rutas." + +msgid "Specifies the color space in which Gaffer processes images." +msgstr "Especifica el espacio de color en el que Gaffer procesa las imágenes." + +msgid "Name of the level set grid to create a mesh primitive from." +msgstr "Nombre de la cuadrícula de conjunto de nivel de la cual crear una primitiva de malla." + +msgid "The number of times the loop is applied to form the output." +msgstr "El número de veces que se aplica el bucle para formar la salida." + +msgid "Defines the exterior width of the level set in voxel units." +msgstr "Define el ancho exterior del conjunto de nivel en unidades de vóxel." + +msgid "Name of grid in VDBObject in which points will be scattered." +msgstr "Nombre de la cuadrícula en VDBObject en la cual se dispersarán los puntos." + +msgid "The mode used detemine the mask behaviour for the end frame." +msgstr "El modo utilizado para determinar el comportamiento de la máscara para el fotograma final." + +msgid "The filter to be used when searching for matching locations." +msgstr "El filtro a utilizar al buscar ubicaciones coincidentes." + +msgid "The frame range to be used when framesMode is \"CustomRange\"." +msgstr "El rango de fotogramas a utilizar cuando framesMode es \"CustomRange\"." + +msgid "The compression method to use when writing the OpenEXR file." +msgstr "El método de compresión a utilizar al escribir el archivo OpenEXR." + +msgid "The value to output if the primitive variable does not exist." +msgstr "El valor a generar si la variable primitiva no existe." + +msgid "Default value to use if attribute or location does not exist." +msgstr "Valor predeterminado a utilizar si el atributo o la ubicación no existe." + +msgid "The write mode for the Field3D file - scanline or tiled data." +msgstr "El modo de escritura para el archivo Field3D - datos por barrido o en bloques." + +msgid "A pair of primitive variable name to query and default value." +msgstr "Un par de nombre de variable primitiva a consultar y valor predeterminado." + +msgid "Contains a child CellPlug for each column in the spreadsheet." +msgstr "Contiene un CellPlug secundario para cada columna en la hoja de cálculo." + +msgid "A match pattern for which primitive variables will be copied." +msgstr "Un patrón de coincidencia para las variables primitivas que se copiarán." + +msgid "Base class for nodes which draw a shape over the input image." +msgstr "Clase base para nodos que dibujan una forma sobre la imagen de entrada." + +msgid "The write mode for the OpenEXR file - scanline or tiled data." +msgstr "El modo de escritura para el archivo OpenEXR - datos por barrido o en bloques." + +msgid "Defines the locations to be added to or removed from the set." +msgstr "Define las ubicaciones a añadir o eliminar del conjunto." + +msgid "A node which produces scenes with exactly one object in them." +msgstr "Un nodo que produce escenas con exactamente un objeto en ellas." + +msgid "The +- range over which the hue of the base colour is varied." +msgstr "El rango +/- sobre el cual varía el tono del color base." + +msgid "The name given to the external plug that this node represents." +msgstr "El nombre dado al conector externo que este nodo representa." + +msgid "The mode used detemine the mask behaviour for the start frame." +msgstr "El modo utilizado para determinar el comportamiento de la máscara para el fotograma inicial." + +msgid "The name of the output channel containing the extracted matte." +msgstr "El nombre del canal de salida que contiene la máscara extraída." + +msgid "The name of the primitive variable holding the UV coordinates." +msgstr "El nombre de la variable primitiva que contiene las coordenadas UV." + +msgid "The view within the image to be used by the scattering process." +msgstr "La vista dentro de la imagen a utilizar por el proceso de dispersión." + +msgid "Allows light projections to be scaled to better suit the scene." +msgstr "Permite escalar las proyecciones de luz para adaptarse mejor a la escena." + +msgid "Outputs true if the specified location exists, otherwise false." +msgstr "Genera verdadero si la ubicación especificada existe, de lo contrario falso." + +msgid "The +- range over which the value of the base colour is varied." +msgstr "El rango +/- sobre el cual varía el valor del color base." + +msgid "Outputs true if the primitive variable exists, otherwise false." +msgstr "Genera verdadero si la variable primitiva existe, de lo contrario falso." + +msgid "The name of the sphere levelset grid in the created VDB object." +msgstr "El nombre de la cuadrícula de conjunto de nivel de esfera en el objeto VDB creado." + +msgid "An additional multiplier applied to the velocity of each point." +msgstr "Un multiplicador adicional aplicado a la velocidad de cada punto." + +msgid "Tangent slopes are kept equal and scales are kept proportional." +msgstr "Las pendientes de las tangentes se mantienen iguales y las escalas se mantienen proporcionales." + +msgid "Transforms objects so that they are aimed at a specified target." +msgstr "Transforma objetos para que apunten a un objetivo especificado." + +msgid "The field of view for the viewport's default perspective camera." +msgstr "El campo de visión para la cámara de perspectiva predeterminada del visor." + +msgid "A prefix applied to the names of the copied primitive variables." +msgstr "Un prefijo aplicado a los nombres de las variables primitivas copiadas." + +msgid "Controls whether the camera draws a visualisation of its frustum." +msgstr "Controla si la cámara dibuja una visualización de su frustum." + +msgid "The per-channel mean values computed from the input image region." +msgstr "Los valores medios por canal calculados de la región de imagen de entrada." + +msgid "The method used when the filter references pixels outside the input data window." +msgstr "El método utilizado cuando el filtro referencia píxeles fuera de la ventana de datos de entrada." + +msgid "Deletes all attributes from the input scene before adding the copied attributes." +msgstr "Elimina todos los atributos de la escena de entrada antes de añadir los atributos copiados." + +msgid "The resolution and aspect ratio to output when there is no input image provided." +msgstr "La resolución y relación de aspecto a generar cuando no se proporciona imagen de entrada." + +msgid "Enables the `config.value` plug, allowing the OpenColorIO config to be specified." +msgstr "Activa el conector `config.value`, permitiendo especificar la configuración de OpenColorIO." + +msgid "Container of array outputs corresponding to the inputs provided by the `in` plug." +msgstr "Contenedor de salidas de arreglo correspondientes a las entradas proporcionadas por el conector `in`." + +msgid "The list of values used when in \"String List\" mode. Has no effect in other modes." +msgstr "La lista de valores utilizados en el modo \"String List\". No tiene efecto en otros modos." + +msgid "The width and height of the orthographic camera's aperture, in world space units." +msgstr "El ancho y alto de la apertura de la cámara ortográfica, en unidades de espacio mundial." + +msgid "Enables the rendering of a drop shadow which can be coloured, offset and blurred." +msgstr "Activa el renderizado de una sombra paralela que puede colorearse, desplazarse y desenfocarse." + +msgid "A list of sets to include the object in. The names should be separated by spaces." +msgstr "Una lista de conjuntos en los que incluir el objeto. Los nombres deben estar separados por espacios." + +msgid "Base class for nodes which process an input image to to generate an output image." +msgstr "Clase base para nodos que procesan una imagen de entrada para generar una imagen de salida." + +msgid "The name of the output on the shader we are fetching, or \"auto\" for an auto proxy." +msgstr "El nombre de la salida del shader que se está obteniendo, o \"auto\" para un proxy automático." + +msgid "Turns on the effect of maxClampTo, allowing out of range values to be highlighted." +msgstr "Activa el efecto de maxClampTo, permitiendo resaltar valores fuera de rango." + +msgid "Enables the `workingSpace.value` plug, allowing the working space to be specified." +msgstr "Activa el conector `workingSpace.value`, permitiendo especificar el espacio de trabajo." + +msgid "Turns on the effect of minClampTo, allowing out of range values to be highlighted." +msgstr "Activa el efecto de minClampTo, permitiendo resaltar valores fuera de rango." + +msgid "Visualisers that load textures will respect this setting to limit their resolution." +msgstr "Los visualizadores que cargan texturas respetarán esta configuración para limitar su resolución." + +msgid "Filters the displayed sets by name. Accepts standard wildcards such as `*` and `?`." +msgstr "Filtra los conjuntos mostrados por nombre. Acepta comodines estándar como `*` y `?`." + +msgid "The location to be made accessible from OSL. This must exist in the `source` scene." +msgstr "La ubicación a hacer accesible desde OSL. Debe existir en la escena `source`." + +msgid "A scene containing locations representing the contents of the Cryptomatte manifest." +msgstr "Una escena que contiene ubicaciones que representan el contenido del manifiesto Cryptomatte." + +msgid "Outputs the value of the option, or the default value if the option does not exist." +msgstr "Genera el valor de la opción, o el valor predeterminado si la opción no existe." + +msgid "Controls whether `end.frame` is relative to the current frame or an absolute value." +msgstr "Controla si `end.frame` es relativo al fotograma actual o un valor absoluto." + +msgid "The bounding box of the geometry. Only relevant when the shape is set to \"Geometry\"." +msgstr "La caja de límites de la geometría. Solo relevante cuando la forma está establecida en \"Geometry\"." + +msgid "The ancestor to isolate the objects from. Only locations below this will be removed." +msgstr "El ancestro del cual aislar los objetos. Solo se eliminarán las ubicaciones debajo de este." + +msgid "A prefix added to all per-instance attributes specified via the \"attributes\" plug." +msgstr "Un prefijo añadido a todos los atributos por instancia especificados mediante el conector \"attributes\"." + +msgid "Applies a transformation to the local matrix of all locations matched by the filter." +msgstr "Aplica una transformación a la matriz local de todas las ubicaciones coincidentes con el filtro." + +msgid "Modify the current time when evaluating the prototypes network, by adding a primvar." +msgstr "Modificar el tiempo actual al evaluar la red de prototipos, añadiendo una variable primitiva." + +msgid "Filters the displayed render passes. Accepts standard wildcards such as `*` and `?`." +msgstr "Filtra los pases de render mostrados. Acepta comodines estándar como `*` y `?`." + +msgid "Scales non-geometric visualisations in the viewport to make them easier to work with." +msgstr "Escala las visualizaciones no geométricas en el visor para facilitar el trabajo con ellas." + +msgid "Base class for nodes which modify the Context in which upstream tasks are dispatched." +msgstr "Clase base para nodos que modifican el contexto en el que se despachan las tareas anteriores." + +msgid "Ignores tweaks that would normally cause an error if the input parameter was missing." +msgstr "Ignora los ajustes que normalmente causarían un error si el parámetro de entrada faltara." + +msgid "The shader to be assigned. This will be stored as an option within the scene globals." +msgstr "El shader a asignar. Se almacenará como una opción dentro de los globales de la escena." + +msgid "Creates an object containing a polygon representation of an arbitrary string of text." +msgstr "Crea un objeto que contiene una representación poligonal de una cadena de texto arbitraria." + +msgid "Controls whether `start.frame` is relative to the current frame or an absolute value." +msgstr "Controla si `start.frame` es relativo al fotograma actual o un valor absoluto." + +msgid "The name(s) of the source data to be shuffled. Accepts standard matching syntax (eg \\" +msgstr "Los nombres de los datos de origen a reorganizar. Acepta la sintaxis de coincidencia estándar (ej. \\" + +msgid "Visualises attribute values by applying a constant shader to display them as a colour." +msgstr "Visualiza valores de atributos aplicando un shader constante para mostrarlos como un color." + +msgid "Curve is extended as a line with slope matching tangent in direction of extrapolation." +msgstr "La curva se extiende como una línea con pendiente que coincide con la tangente en la dirección de extrapolación." + +msgid "Text describing the contents of the backdrop - this will be displayed below the title." +msgstr "Texto que describe el contenido del telón de fondo - se mostrará debajo del título." + +msgid "Expands the data window to include the external pixels which the blur will bleed onto." +msgstr "Expande la ventana de datos para incluir los píxeles externos sobre los cuales el desenfoque se extenderá." + +msgid "Expands the data window to include the external pixels which the filter radius covers." +msgstr "Expande la ventana de datos para incluir los píxeles externos que cubre el radio del filtro." + +msgid "The default row. This provides output values when no other row matches the `selector`." +msgstr "La fila predeterminada. Proporciona valores de salida cuando ninguna otra fila coincide con el `selector`." + +msgid "Automatically connected to the Box.enabled plugs to control the pass-through behaviour." +msgstr "Conectado automáticamente a los conectores Box.enabled para controlar el comportamiento de paso directo." + +msgid "Random floating point output derived from seed, Context Variable and float range plugs." +msgstr "Salida de punto flotante aleatorio derivada de la semilla, la variable de contexto y los conectores de rango flotante." + +msgid "Base class for nodes which modify PrimitiveVariables on objects in the scene hierarchy." +msgstr "Clase base para nodos que modifican variables primitivas en objetos de la jerarquía de escena." + +msgid "Sets up global shaders in the Arnold options which can be used to populate global AOVs." +msgstr "Configura shaders globales en las opciones de Arnold que pueden usarse para poblar VAS globales." + +msgid "Render settings specified here will override their corresponding global render options." +msgstr "Las configuraciones de render especificadas aquí sobrescribirán sus opciones de render globales correspondientes." + +msgid "The framerate used to convert between the current frame number and the time in seconds." +msgstr "La velocidad de fotogramas utilizada para convertir entre el número de fotograma actual y el tiempo en segundos." + +msgid "The on/off state of the filter. When it is off, the filter does not match any locations." +msgstr "El estado activado/desactivado del filtro. Cuando está desactivado, el filtro no coincide con ninguna ubicación." + +msgid "Enable to replace already written destination data with the same name as destination(s)." +msgstr "Activar para reemplazar datos de destino ya escritos con el mismo nombre que los destinos." + +msgid "Output connections to downstream nodes which must not be executed until after this node." +msgstr "Conexiones de salida a nodos posteriores que no deben ejecutarse hasta después de este nodo." + +msgid "Combines several input filters, matching the union of all the locations matched by them." +msgstr "Combina varios filtros de entrada, coincidiendo con la unión de todas las ubicaciones coincidentes." + +msgid "The primitive variable that provides the UV positions to sample on the source primitive." +msgstr "La variable primitiva que proporciona las posiciones UV a muestrear en la primitiva de origen." + +msgid "When on, locations are treated as being in a set if an ancestor location is in that set." +msgstr "Cuando está activado, las ubicaciones se tratan como pertenecientes a un conjunto si una ubicación ancestral está en ese conjunto." + +msgid "Queries inherited shader assignments if the location has no local assignment of its own." +msgstr "Consulta asignaciones de shader heredadas si la ubicación no tiene asignación local propia." + +msgid "Outputs `True` if the filter matches an ancestor of the location, and `False` otherwise." +msgstr "Genera `True` si el filtro coincide con un ancestro de la ubicación, y `False` en caso contrario." + +msgid "Modifies the standard attributes on objects - these should be respected by all renderers." +msgstr "Modifica los atributos estándar en objetos - estos deben ser respetados por todos los renderizadores." + +msgid "A scale factor applied to the velocity grids, to either increase or decrease motion blur." +msgstr "Un factor de escala aplicado a las cuadrículas de velocidad, para aumentar o disminuir el desenfoque de movimiento." + +msgid "Uses this channel as a ZBack channel, defining the end of the depth range for each pixel." +msgstr "Usa este canal como canal ZBack, definiendo el final del rango de profundidad para cada píxel." + +msgid "The distance from the camera at which objects are in perfect focus, in world space units." +msgstr "La distancia desde la cámara a la que los objetos están en foco perfecto, en unidades de espacio mundial." + +msgid "Adds a simple denoising filter to the texture bake. Mostly preserves high-contrast edges." +msgstr "Añade un filtro de eliminación de ruido simple al horneado de textura. Mayormente preserva bordes de alto contraste." + +msgid "The on/off state of the node. When it is off, the node outputs the input scene unchanged." +msgstr "El estado activado/desactivado del nodo. Cuando está desactivado, el nodo genera la escena de entrada sin cambios." + +msgid "Outputs `True` if the filter matches a descendant of the location, and `False` otherwise." +msgstr "Genera `True` si el filtro coincide con un descendiente de la ubicación, y `False` en caso contrario." + +msgid "Deletes the input primitive variables, so that they are not present on the output object." +msgstr "Elimina las variables primitivas de entrada, para que no estén presentes en el objeto de salida." + +msgid "The format of the image ( as a FormatPlug, compatible with inputs on Constant or Resize )." +msgstr "El formato de la imagen (como un FormatPlug, compatible con entradas en Constant o Resize)." + +msgid "Threshold used to exclude pixels from the points primitive when `ignoreTransparent` is on." +msgstr "Umbral utilizado para excluir píxeles de la primitiva de puntos cuando `ignoreTransparent` está activado." + +msgid "Views to add. In the case of multiple views with the same name, the last one will override." +msgstr "Vistas a añadir. En caso de múltiples vistas con el mismo nombre, la última sobrescribirá." + +msgid "Curve is repeated indefinitely with each repetition offset in value to preserve continuity." +msgstr "La curva se repite indefinidamente con cada repetición desplazada en valor para preservar la continuidad." + +msgid "Convenience node for representing input plugs visually in the internal node graph of a Box." +msgstr "Nodo de conveniencia para representar visualmente conectores de entrada en el grafo de nodos interno de un Box." + +msgid "The scene that contains the source primitive that primitive variables will be sampled from." +msgstr "La escena que contiene la primitiva de origen de la cual se muestrearán las variables primitivas." + +msgid "The outputs from the spreadsheet. Contains a child plug for each column in the spreadsheet." +msgstr "Las salidas de la hoja de cálculo. Contiene un conector secundario para cada columna." + +msgid "Base class for nodes which process only flat image data and so will error on non-flat data." +msgstr "Clase base para nodos que procesan solo datos de imagen plana y generarán error con datos no planos." + +msgid "The transform for the group itself. This will be inherited by the objects parented under it." +msgstr "La transformación para el grupo en sí. Será heredada por los objetos emparentados debajo de él." + +msgid "Creates a wireframe representation of a mesh. The wireframe is created as a CurvesPrimitive." +msgstr "Crea una representación de malla de alambre de una malla. La malla de alambre se crea como CurvesPrimitive." + +msgid "Applies color transformations provided by OpenColorIO via a LUT file and OCIO FileTransform." +msgstr "Aplica transformaciones de color proporcionadas por OpenColorIO mediante un archivo LUT y OCIO FileTransform." + +msgid "The transform used to position the cache. This is applied to all children of the cache root." +msgstr "La transformación utilizada para posicionar la caché. Se aplica a todos los secundarios de la raíz de la caché." + +msgid "The name of the group to be created. All the input scenes will be parented under this group." +msgstr "El nombre del grupo a crear. Todas las escenas de entrada se emparentarán bajo este grupo." + +msgid "The name of the per-vertex primitive variable used to specify the position of each instance." +msgstr "El nombre de la variable primitiva por vértice utilizada para especificar la posición de cada instancia." + +msgid "The thickness (in pixels) of the stripes used to indicate an object is in more than one set." +msgstr "El grosor (en píxeles) de las franjas utilizadas para indicar que un objeto está en más de un conjunto." + +msgid "Ignores tweaks targeting missing options. When off, missing options cause the node to error." +msgstr "Ignora ajustes dirigidos a opciones faltantes. Cuando está desactivado, las opciones faltantes causan error en el nodo." + +msgid "Limits the extent of the sphere around the pole axis. Valid values are in the range [0,360]." +msgstr "Limita la extensión de la esfera alrededor del eje polar. Los valores válidos están en el rango [0,360]." + +msgid "Convenience node for representing output plugs visually in the internal node graph of a Box." +msgstr "Nodo de conveniencia para representar visualmente conectores de salida en el grafo de nodos interno de un Box." + +msgid "Enables the creation of trails behind the points, based on the `velocity` primitive variable." +msgstr "Activa la creación de estelas detrás de los puntos, basadas en la variable primitiva `velocity`." + +msgid "The values of the context variable. Collection will be performed once for each context value." +msgstr "Los valores de la variable de contexto. La recopilación se realizará una vez por cada valor de contexto." + +msgid "The name of the primitive variable which contains the UV set used to calculate UV distortion." +msgstr "El nombre de la variable primitiva que contiene el conjunto UV utilizado para calcular la distorsión UV." + +msgid "The input scene which provides the locations to be referenced by the `sourceLocations` plugs." +msgstr "La escena de entrada que proporciona las ubicaciones a referenciar por los conectores `sourceLocations`." + +msgid "Container for user-defined variables which can be used in expressions anywhere in the script." +msgstr "Contenedor para variables definidas por el usuario que pueden usarse en expresiones en cualquier parte del script." + +msgid "Curve span is smoothly interpolated between values of in key and out key using tangent slope." +msgstr "El tramo de la curva se interpola suavemente entre los valores de la clave de entrada y la clave de salida usando la pendiente de la tangente." + +msgid "The name of the primitive variable which contains the deformed vertex positions for the mesh." +msgstr "El nombre de la variable primitiva que contiene las posiciones de vértice deformadas de la malla." + +msgid "The area of the image to be analysed. This plug is only used if 'Area Source' is set to Area." +msgstr "El área de la imagen a analizar. Este conector solo se usa si 'Area Source' está establecido en Area." + +msgid "Controls the amount of displacement. Only used when performing displacement along the normal." +msgstr "Controla la cantidad de desplazamiento. Solo se usa al realizar desplazamiento a lo largo de la normal." + +msgid "The size of the filter in pixels. This can be varied independently in the x and y directions." +msgstr "El tamaño del filtro en píxeles. Puede variarse independientemente en las direcciones x e y." + +msgid "The text to output. This is triangulated into a mesh representation using the specified font." +msgstr "El texto a generar. Se triangula en una representación de malla usando la fuente especificada." + +msgid "The size of the squares in pixels. This can be varied independently in the x and y directions." +msgstr "El tamaño de los cuadrados en píxeles. Puede variarse independientemente en las direcciones x e y." + +msgid "Deep images must have a Z channel - it can be set either as a fixed depth, or using a channel." +msgstr "Las imágenes profundas deben tener un canal Z - puede establecerse como una profundidad fija, o usando un canal." + +msgid "Outputs an array of the context values for which collection was enabled by the `enabled` plug." +msgstr "Genera un arreglo de los valores de contexto para los cuales la recopilación fue activada por el conector `enabled`." + +msgid "The name of the primitive variable which contains the undeformed vertex positions for the mesh." +msgstr "El nombre de la variable primitiva que contiene las posiciones de vértice no deformadas de la malla." + +msgid "The range of colours used when the mode is set to \"Colour Range\". Has no effect in other modes." +msgstr "El rango de colores utilizado cuando el modo está en \"Colour Range\". No tiene efecto en otros modos." + +msgid "The transform to be applied to the input image. This must contain only translation and scaling." +msgstr "Transformación aplicada a la imagen de entrada. Debe contener solo traslación y escala." + +msgid "Base type for nodes which constrain objects to a target object by manipulating their transform." +msgstr "Tipo base para nodos que restringen objetos a un objeto objetivo manipulando su transformación." + +msgid "The part of the scene to be duplicated. > Caution : Deprecated. Please connect a filter instead." +msgstr "La parte de la escena a duplicar. > Precaución: Obsoleto. Conectar un filtro en su lugar." + +msgid "Invert the condition used to delete faces. If the primvar is zero then the face will be deleted." +msgstr "Invertir la condición usada para eliminar caras. Si la variable primitiva es cero, la cara se eliminará." + +msgid "The name of the LUT file to be read. Only OpenColorIO supported files will function as expected." +msgstr "El nombre del archivo LUT a leer. Solo los archivos soportados por OpenColorIO funcionarán como se espera." + +msgid "Controls whether applicable lights draw a representation of their light projection in the viewer." +msgstr "Controla si las luces aplicables dibujan una representación de su proyección de luz en el visor." + +msgid "Enables a wipe tool to hide part of the image, for comparing with the background image. Hotkey W." +msgstr "Activa una herramienta de barrido para ocultar parte de la imagen, para comparar con la imagen de fondo. Atajo W." + +msgid "A 3 level dictionary of results stored in a CompoundObject, as described in the node description." +msgstr "Un diccionario de 3 niveles de resultados almacenados en un CompoundObject, como se describe en la descripción del nodo." + +msgid "Name of the primitive variable which contains the normals used to calculate tangents & binormals." +msgstr "Nombre de la variable primitiva que contiene las normales utilizadas para calcular tangentes y binormales." + +msgid "A space separated list of grids to be loaded and made available as channels in the volume shader." +msgstr "Una lista separada por espacios de cuadrículas a cargar y hacer disponibles como canales en el shader de volumen." + +msgid "Ignores tweaks targeting missing parameters. When off, missing parameters cause the node to error." +msgstr "Ignora ajustes dirigidos a parámetros faltantes. Cuando está desactivado, los parámetros faltantes causan error en el nodo." + +msgid "Invert the condition used to delete curves. If the primvar is zero then the curve will be deleted." +msgstr "Invertir la condición usada para eliminar curvas. Si la variable primitiva es cero, la curva se eliminará." + +msgid "Ignores tweaks targeting missing attributes. When off, missing attributes cause the node to error." +msgstr "Ignora ajustes dirigidos a atributos faltantes. Cuando está desactivado, los atributos faltantes causan error en el nodo." + +msgid "Invert the condition used to delete points. If the primvar is zero then the point will be deleted." +msgstr "Invertir la condición usada para eliminar puntos. Si la variable primitiva es cero, el punto se eliminará." + +msgid "Base class for nodes which allow the user to make modifications to the upstream evaluation Context." +msgstr "Clase base para nodos que permiten al usuario hacer modificaciones al contexto de evaluación anterior." + +msgid "Utility node used internally within GafferImage, but not intended to be used directly by end users." +msgstr "Nodo utilitario usado internamente dentro de GafferImage, pero no destinado a ser usado directamente por usuarios finales." + +msgid "Specifies the index of the currently selected image. This forms the output from the catalogue node." +msgstr "Especifica el índice de la imagen actualmente seleccionada. Esto forma la salida del nodo catálogo." + +msgid "Outputs the value of the specified parameter, or the default value if the parameter does not exist." +msgstr "Genera el valor del parámetro especificado, o el valor predeterminado si el parámetro no existe." + +msgid "Name of the primitive variable that will be created to store the output orientations as quaternions." +msgstr "Nombre de la variable primitiva que se creará para almacenar las orientaciones de salida como cuaterniones." + +msgid "Expands the data window by the filter radius, to include the external pixels affected by the filter." +msgstr "Expande la ventana de datos por el radio del filtro, para incluir los píxeles externos afectados por el filtro." + +msgid "Determines whether the text is aligned to the bottom or top of the text area, or centered within it." +msgstr "Determina si el texto se alinea a la parte inferior o superior del área de texto, o se centra dentro de ella." + +msgid "Hides the parts of the main input which are behind this image, based on its Z, ZBack and A channels." +msgstr "Oculta las partes de la entrada principal que están detrás de esta imagen, basándose en sus canales Z, ZBack y A." + +msgid "The compositing operation used to merge the image together. See node documentation for more details." +msgstr "La operación de composición utilizada para combinar la imagen. Consultar la documentación del nodo para más detalles." + +msgid "Defines a \"script\" - a Gaffer node network which can be saved to disk as a \".gfr\" file and reloaded." +msgstr "Define un \"script\" - una red de nodos Gaffer que puede guardarse en disco como un archivo \".gfr\" y recargarse." + +msgid "This density is multiplied with the value of the grid to produce a number of points per unit volume." +msgstr "Esta densidad se multiplica con el valor de la cuadrícula para producir un número de puntos por unidad de volumen." + +msgid "Copies channels from the secondary input images onto the primary input image and outputs the result." +msgstr "Copia canales de las imágenes de entrada secundarias sobre la imagen de entrada primaria y genera el resultado." + +msgid "The name of the primitive variable to use as ids. Affects which elements are selected by the idList." +msgstr "El nombre de la variable primitiva a usar como ids. Afecta qué elementos son seleccionados por la idList." + +msgid "Specifies the aperture used when looking through this light. Overrides the Viewer's Camera Settings." +msgstr "Especifica la apertura utilizada al mirar a través de esta luz. Sobrescribe la configuración de cámara del visor." + +msgid "Determines whether the text is aligned to the left or right of the text area, or centered within it." +msgstr "Determina si el texto se alinea a la izquierda o derecha del área de texto, o se centra dentro de ella." + +msgid "Base class for nodes which can compute the values of output plugs based on the values of input plugs." +msgstr "Clase base para nodos que pueden calcular los valores de conectores de salida basándose en los valores de conectores de entrada." + +msgid "The command to be run. This may reference values from substitutions with '{substitutionName}' syntax." +msgstr "El comando a ejecutar. Puede referenciar valores de sustituciones con la sintaxis '{substitutionName}'." + +msgid "Enables a comparison mode to view two images at once - they can be composited under or over, or subtracted for a difference view. Or replace mode just shows the front image, which is useful in combination with the Wipe tool." +msgstr "Activa un modo de comparación para ver dos imágenes a la vez - pueden compositar debajo o encima, o restarse para una vista de diferencia. O el modo reemplazar solo muestra la imagen frontal, útil en combinación con la herramienta de barrido." + +msgid "A space separated list of sets to consider membership of. This supports wild cards, eg: asset:* to allow membership display to focus on a specific group of sets. Right-click to insert the name of any sets in the input scene." +msgstr "Una lista separada por espacios de conjuntos para considerar la pertenencia. Soporta comodines, ej: asset:* para permitir que la visualización de pertenencia se enfoque en un grupo específico de conjuntos. Hacer clic derecho para insertar el nombre de cualquier conjunto en la escena de entrada." + +msgid "The name of the per-vertex primitive variable used to specify the orientation of each instance. This must be provided as a quaternion : use an upstream Orientation node to convert from other representations before instancing." +msgstr "El nombre de la variable primitiva por vértice utilizada para especificar la orientación de cada instancia. Debe proporcionarse como un cuaternión: utilizar un nodo Orientation anterior para convertir desde otras representaciones antes de instanciar." + +msgid "Determines the drawing order of overlapping backdrops. > Note : Larger backdrops are _automatically_ drawn behind smaller ones, > so it is only necessary to manually assign a depth in rare cases where > this is not desirable." +msgstr "Determina el orden de dibujo de telones de fondo superpuestos. > Nota: Los telones de fondo más grandes se dibujan _automáticamente_ detrás de los más pequeños, por lo que solo es necesario asignar manualmente una profundidad en casos raros." + +msgid "The names of the render passes to be wedged. > Note : Render pass names are queried at the > script's start frame to ensure they do not vary > over time and to prevent scenes with expensive > globals from slowing task dispatch." +msgstr "Los nombres de los pases de render a los que aplicar cuña. > Nota: Los nombres de pases de render se consultan en el fotograma inicial del script para asegurar que no varíen en el tiempo y para evitar que escenas con globales costosos ralenticen el despacho de tareas." + +msgid "Clamps channel values so that they fit within a specified range. Clamping is performed for each channel individually, and out-of-range colours may be highlighted by setting them to a value different to the clamp threshold itself." +msgstr "Fija valores de canal para que quepan dentro de un rango especificado. La fijación se realiza para cada canal individualmente, y los colores fuera de rango pueden resaltarse estableciéndolos en un valor diferente al umbral de fijación." + +msgid "The name of a Context Variable that is set to the current root location when evaluating the input scene. This can be used in upstream expressions and string substitutions to generate a different hierarchy under each root location." +msgstr "El nombre de una variable de contexto que se establece con la ubicación raíz actual al evaluar la escena de entrada. Puede usarse en expresiones y sustituciones de cadena anteriores para generar una jerarquía diferente bajo cada ubicación raíz." + +msgid "The name of the file to be read. File sequences with arbitrary padding may be specified using the '#' character as a placeholder for the frame numbers. If this file sequence format is used, then missingFrameMode will be activated." +msgstr "El nombre del archivo a leer. Las secuencias de archivos con relleno arbitrario pueden especificarse usando el carácter '#' como marcador de posición para los números de fotograma. Si se usa este formato de secuencia, se activará missingFrameMode." + +msgid "The source of the area to crop to.\n\n\t\t\t- Area : A user-defined area specified by the `area` plug.\n\t\t\t- Format : A user-defined area specified by the `format` plug.\n\t\t\t- DataWindow : The data window of the input image.\n\t\t\t- DisplayWindow : The display window of the input image.\n\t\t\t- Auto : The minimal area that contains all the non-empty pixels\n\t\t\t of the input image. For flat images, this means pixels\n\t\t\t with a non-zero value in at least one channel, and for deep images\n\t\t\t it means pixels with at least one sample.\n\t\t\t" +msgstr "El origen del área de recorte.\n\n\t\t\t- Area: Un área definida por el usuario especificada por el conector `area`.\n\t\t\t- Format: Un área definida por el usuario especificada por el conector `format`.\n\t\t\t- DataWindow: La ventana de datos de la imagen de entrada.\n\t\t\t- DisplayWindow: La ventana de visualización de la imagen de entrada.\n\t\t\t- Auto: El área mínima que contiene todos los píxeles no vacíos\n\t\t\t de la imagen de entrada. Para imágenes planas, esto significa píxeles\n\t\t\t con un valor distinto de cero en al menos un canal, y para imágenes\n\t\t\t profundas significa píxeles con al menos una muestra.\n\t\t\t" + +msgid "The method to use for placing the light. - Shadow : Places the light so that it casts a shadow from the pivot point onto the target point. - Highlight : Places the light so that it creates a specular highlight at the target point." +msgstr "El método a utilizar para colocar la luz. - Shadow: Coloca la luz para que proyecte una sombra desde el punto de pivote hacia el punto objetivo. - Highlight: Coloca la luz para que cree un reflejo especular en el punto objetivo." + +msgid "This hidden plug is a CompoundObject that contains just the new transform attributes. It is primarily used for internal computation, but there are cases where you can improve performance by naughtily plugging it into an expression." +msgstr "Este conector oculto es un CompoundObject que contiene solo los nuevos atributos de transformación. Se usa principalmente para cálculos internos, pero hay casos donde se puede mejorar el rendimiento conectándolo a una expresión." + +msgid "Where to source the area to be analysed. If this is set to DataWindow, it will use the input's Data Window, if it is set to DisplayWindow, it will use the input's Display Window, and if it is set to Area, it will use the Area plug." +msgstr "De dónde obtener el área a analizar. Si está en DataWindow, usará la ventana de datos de la entrada; si está en DisplayWindow, usará la ventana de visualización de la entrada; y si está en Area, usará el conector Area." + +msgid "The paths to be added to or removed from the set. > Caution : This plug is deprecated and will be removed in a future release. No validity checks are performed on these paths, so it is possible to accidentally generate invalid sets." +msgstr "Las rutas a añadir o eliminar del conjunto. > Precaución: Este conector está obsoleto y se eliminará en una versión futura. No se realizan verificaciones de validez en estas rutas, por lo que es posible generar conjuntos inválidos accidentalmente." + +msgid "The scene location to which the objects are constrained. The world space transform of this location forms the basis of the constraint target, but is modified by the targetMode and targetOffset values before the constraint is applied." +msgstr "La ubicación de la escena a la que se restringen los objetos. La transformación en espacio mundial de esta ubicación forma la base del objetivo de restricción, pero se modifica por los valores targetMode y targetOffset antes de aplicar la restricción." + +msgid "The type of shader used to perform the visualisation. The default value is for an OpenGL shader which will be used in the viewport. It's possible to perform a visualisation for other renderers by entering a different shader type here." +msgstr "El tipo de shader utilizado para realizar la visualización. El valor predeterminado es un shader OpenGL que se usará en el visor. Es posible realizar una visualización para otros renderizadores introduciendo un tipo de shader diferente aquí." + +msgid "The colour space of the input image, used to convert the input to the working space. When set to `Automatic`, the colour space is determined automatically using the function registered with `ImageReader::setDefaultColorSpaceFunction()`." +msgstr "El espacio de color de la imagen de entrada, utilizado para convertir la entrada al espacio de trabajo. Cuando está en `Automatic`, el espacio de color se determina automáticamente usando la función registrada con `ImageReader::setDefaultColorSpaceFunction()`." + +msgid "The desired state. \"Sorted\" merely orders the samples. \"Tidy\" performs sorting, splitting, and merging, to produce non-overlapping samples, and optionally prunes useless samples. \"Flat\" composites samples into a single sample per pixel." +msgstr "El estado deseado. \"Sorted\" simplemente ordena las muestras. \"Tidy\" realiza ordenamiento, división y combinación para producir muestras no superpuestas, y opcionalmente elimina muestras inútiles. \"Flat\" compone muestras en una sola muestra por píxel." + +msgid "If true, new attributes will only be created if the transform differs in some of the Contexts. If the transform never changes, no new attributes will be created ( you can just use the transform instead of accessing the new attributes )." +msgstr "Si es verdadero, solo se crearán nuevos atributos si la transformación difiere en algunos de los contextos. Si la transformación nunca cambia, no se crearán nuevos atributos (se puede usar la transformación en lugar de acceder a los nuevos atributos)." + +msgid "Causes new vertex normals to be calculated for polygon meshes. Has no effect for subdivision surfaces, since those are naturally smooth and do not require surface normals. Vertex normals are represented as primitive variables named \"N\"." +msgstr "Hace que se calculen nuevas normales de vértice para mallas poligonales. No tiene efecto en superficies de subdivisión, ya que son naturalmente suaves y no requieren normales de superficie. Las normales de vértice se representan como variables primitivas llamadas \"N\"." + +msgid "Using the `parent` plug to select the source is now deprecated, please use a filter instead. This plug is still supported for backwards compatibility, but is incompatible with recent features, like accurately reporting variation counts." +msgstr "El uso del conector `parent` para seleccionar el origen está obsoleto, utilizar un filtro en su lugar. Este conector aún se soporta por compatibilidad, pero es incompatible con funciones recientes, como el reporte preciso de conteos de variación." + +msgid "An optional alternate scene to provide the vdbs to be converted. When connected : - The `filter` chooses locations to be merged from the `source` scene rather than then `in` scene. - Source locations are not pruned from the output scene." +msgstr "Una escena alternativa opcional para proporcionar los VDBs a convertir. Cuando está conectada: - El `filter` elige ubicaciones a combinar de la escena `source` en lugar de la escena `in`. - Las ubicaciones de origen no se podan de la escena de salida." + +msgid "The name of the shader used to perform the visualisation. The default value is for an OpenGL shader which will be used in the viewport. It's possible to perform a visualisation for other renderers by entering a different shader name here." +msgstr "El nombre del shader utilizado para realizar la visualización. El valor predeterminado es un shader OpenGL que se usará en el visor. Es posible realizar una visualización para otros renderizadores introduciendo un nombre de shader diferente aquí." + +msgid "An optional alternate scene to provide the locations to be merged. When connected : - The `filter` chooses locations to be merged from the `source` scene rather than then `in` scene. - Source locations are not pruned from the output scene." +msgstr "Una escena alternativa opcional para proporcionar las ubicaciones a combinar. Cuando está conectada: - El `filter` elige ubicaciones a combinar de la escena `source` en lugar de la escena `in`. - Las ubicaciones de origen no se podan de la escena de salida." + +msgid "An optional alternate scene to provide the meshes to be converted. When connected : - The `filter` chooses locations to be merged from the `source` scene rather than then `in` scene. - Source locations are not pruned from the output scene." +msgstr "Una escena alternativa opcional para proporcionar las mallas a convertir. Cuando está conectada: - El `filter` elige ubicaciones a combinar de la escena `source` en lugar de la escena `in`. - Las ubicaciones de origen no se podan de la escena de salida." + +msgid "The area of the image within which the text is rendered. The text will be word wrapped to fit within the area and justified as specified by the justification setting. If the area is empty, then the full display window will be used instead." +msgstr "El área de la imagen dentro de la cual se renderiza el texto. El texto se ajustará por palabras para caber dentro del área y se justificará según la configuración de justificación. Si el área está vacía, se usará la ventana de visualización completa." + +msgid "Seed for the random number generator. Different seeds produce different random numbers. When controlling two different properties using the same context variable, different seeds may be used to ensure that the generated values are different." +msgstr "Semilla para el generador de números aleatorios. Diferentes semillas producen diferentes números aleatorios. Al controlar dos propiedades diferentes usando la misma variable de contexto, se pueden usar diferentes semillas para asegurar que los valores generados sean diferentes." + +msgid "Seed for the random number generator. Different seeds produce different random numbers. When controlling two different properties using the same Context Variable, different seeds may be used to ensure that the generated values are different." +msgstr "Semilla para el generador de números aleatorios. Diferentes semillas producen diferentes números aleatorios. Al controlar dos propiedades diferentes usando la misma variable de contexto, se pueden usar diferentes semillas para asegurar que los valores generados sean distintos." + +msgid "Treat the light as a sphere. Disable to avoid sharp boundaries when the light intersects with other geometry. > Tip: Disabling this is equivalent to > enabling \"Soft Falloff\" in Blender and > matches the behaviour of Cycles 3.6 and > earlier." +msgstr "Tratar la luz como una esfera. Desactivar para evitar bordes agudos cuando la luz intersecta con otra geometría. > Consejo: Desactivar esto es equivalente a activar \"Soft Falloff\" en Blender y coincide con el comportamiento de Cycles 3.6 y anteriores." + +msgid "Tool for selecting objects. - Click or drag to set selection - Shift-click or shift-drag to add to selection - Drag and drop selected objects - Drag to Python Editor to get their names - Drag to PathFilter or Set node to add/remove their paths" +msgstr "Herramienta para seleccionar objetos. - Hacer clic o arrastrar para establecer la selección - Shift-clic o shift-arrastrar para añadir a la selección - Arrastrar y soltar objetos seleccionados - Arrastrar al editor de Python para obtener sus nombres - Arrastrar a PathFilter o nodo Set para añadir/eliminar sus rutas" + +msgid "The subset of frames that will be executed by upstream tasks. Any frames not included here will be ignored, regardless of the dispatcher's frame range. > Note : This can only remove frames. To add frames, edit the > settings on the Dispatcher." +msgstr "El subconjunto de fotogramas que serán ejecutados por las tareas anteriores. Los fotogramas no incluidos aquí serán ignorados, independientemente del rango de fotogramas del despachador. > Nota: Esto solo puede eliminar fotogramas. Para añadir fotogramas, editar la configuración del despachador." + +msgid "The location within the scene containing a camera to query. > Note : If the location does not exist then the query will not be > performed and all outputs will be set to their default values with > each output `source` plug set to \"None\" (`0`)." +msgstr "La ubicación dentro de la escena que contiene una cámara a consultar. > Nota: Si la ubicación no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados con cada conector de salida `source` establecido en \"None\" (`0`)." + +msgid "Specifies the channel name to be given to EXR. To match the standard, this should just be exactly the Gaffer channel name. But some other software like Nuke omits the layer prefix, and assumes that the part name will be prefixed to the channel." +msgstr "Especifica el nombre de canal a dar al EXR. Para coincidir con el estándar, debe ser exactamente el nombre de canal de Gaffer. Pero otro software como Nuke omite el prefijo de capa y asume que el nombre de la parte se prefijará al canal." + +msgid "If true, the resulting meshes will be named based on the value of the primitive variable chosen by `segment`. Requires that the chosen primitive variable be a string. Otherwise, the resulting meshes will just be named based on an integer index." +msgstr "Si es verdadero, las mallas resultantes se nombrarán según el valor de la variable primitiva elegida por `segment`. Requiere que la variable primitiva elegida sea una cadena. De lo contrario, las mallas resultantes simplemente se nombrarán según un índice entero." + +msgid "The maximum acceptable error caused by omitting anti-aliasing for a particular disk. Since very large disks often contribute very little to each individual output pixel, omitting anti-aliasing for them can provide a substantial speed improvement." +msgstr "El error máximo aceptable causado por omitir el antialiasing para un disco particular. Dado que los discos muy grandes a menudo contribuyen muy poco a cada píxel de salida individual, omitir el antialiasing para ellos puede proporcionar una mejora sustancial de velocidad." + +msgid "The colour space of the output image, used to convert the input image from the working space. The default behaviour is to automatically determine the colorspace by calling the function registered with `ImageWriter::setDefaultColorSpaceFunction()`." +msgstr "El espacio de color de la imagen de salida, utilizado para convertir la imagen de entrada desde el espacio de trabajo. El comportamiento predeterminado es determinar automáticamente el espacio de color llamando a la función registrada con `ImageWriter::setDefaultColorSpaceFunction()`." + +msgid "Applies a node network to an input iteratively. > Caution : This should _not_ be your first choice of tool. > For many use cases the Instancer, CollectScenes and CollectImages > nodes are more suitable and offer _significantly_ better performance." +msgstr "Aplica una red de nodos a una entrada iterativamente. > Precaución: Esto _no_ debería ser la primera opción de herramienta. Para muchos casos de uso los nodos Instancer, CollectScenes y CollectImages son más adecuados y ofrecen un rendimiento _significativamente_ mejor." + +msgid "Defines a value that will cause no displacement to occur. For instance, if the displacement map contains a greyscale noise between 0 and 1, a zero value of 0.5 will mean that the displacement pushes into the object in some places and out in others." +msgstr "Define un valor que no causará desplazamiento. Por ejemplo, si el mapa de desplazamiento contiene un ruido en escala de grises entre 0 y 1, un valor cero de 0.5 significará que el desplazamiento empuja hacia dentro del objeto en algunos lugares y hacia fuera en otros." + +msgid "Masks frames which follow the specified end frame. The default is to treat them based on the MissingFrameMode, but they can also be clamped to the end frame, or return a black image which matches the data window and display window of the end frame." +msgstr "Enmascara fotogramas que siguen al fotograma final especificado. El predeterminado es tratarlos según MissingFrameMode, pero también pueden fijarse al fotograma final, o devolver una imagen negra que coincida con las ventanas de datos y visualización del fotograma final." + +msgid "The colour transform used for showing colours in the UI - in swatches and colour pickers etc. This is a combination of an OpenColorIO Display and an OpenColorIO View. > Note : The Viewer has its own display transform configured in the Viewer itself." +msgstr "La transformación de color utilizada para mostrar colores en la interfaz - en muestras y selectores de color, etc. Es una combinación de un Display de OpenColorIO y una View de OpenColorIO. > Nota: El visor tiene su propia transformación de visualización configurada en el propio visor." + +msgid "Converts mesh primitives into points primitives. Primitive variables with FaceVarying or Uniform interpolation are discarded (because they have the wrong size for the new primitive), but all other primitive variables are preserved during conversion." +msgstr "Convierte primitivas de malla en primitivas de puntos. Las variables primitivas con interpolación FaceVarying o Uniform se descartan (porque tienen el tamaño incorrecto para la nueva primitiva), pero todas las demás variables primitivas se preservan durante la conversión." + +msgid "The channel to use as the alpha channel. The selected channel does not have to be 'A', but whichever channel is chosen will act as the alpha for the sake of this node. This channel will never be divided by itself - it will remain the same as the input." +msgstr "El canal a usar como canal alfa. El canal seleccionado no tiene que ser 'A', pero el canal que se elija actuará como alfa para este nodo. Este canal nunca se dividirá por sí mismo - permanecerá igual que la entrada." + +msgid "The location of the mesh to scatter the points over. The generated points will be parented under this location. This is ignored when a filter is connected, in which case the filter may specify multiple locations containing meshes to scatter points over." +msgstr "La ubicación de la malla sobre la cual dispersar los puntos. Los puntos generados se emparentarán bajo esta ubicación. Esto se ignora cuando hay un filtro conectado, en cuyo caso el filtro puede especificar múltiples ubicaciones con mallas para dispersar puntos." + +msgid "The channel to use as the alpha channel. The selected channel does not have to be 'A', but whichever channel is chosen will act as the alpha for the sake of this node. This channel will never be multiplied by itself - it will remain the same as the input." +msgstr "El canal a usar como canal alfa. El canal seleccionado no tiene que ser 'A', pero el canal que se elija actuará como alfa para este nodo. Este canal nunca se multiplicará por sí mismo - permanecerá igual que la entrada." + +msgid "Tool for showing color values. - Mouse over a pixel to show the color value. - Supports dragging color values from a pixel. - Ctrl + click to create a persistent pixel inspector. - Ctrl + drag to create a persistent region inspector." +msgstr "Herramienta para mostrar valores de color. - Pasar el ratón sobre un píxel para mostrar el valor de color. - Soporta arrastrar valores de color desde un píxel. - Ctrl + clic para crear un inspector de píxel persistente. - Ctrl + arrastrar para crear un inspector de región persistente." + +msgid "A prefix applied to the names of the sampled primitive variables before they are added to the sampling object. This is particularly useful when sampling something like \"P\", and not not wanting to modify the true vertex positions of the sampling primitive." +msgstr "Un prefijo aplicado a los nombres de las variables primitivas muestreadas antes de añadirlas al objeto de muestreo. Es particularmente útil al muestrear algo como \"P\" sin querer modificar las posiciones de vértice verdaderas de la primitiva de muestreo." + +msgid "Masks frames which preceed the specified start frame. The default is to treat them based on the MissingFrameMode, but they can also be clamped to the start frame, or return a black image which matches the data window and display window of the start frame." +msgstr "Enmascara fotogramas que preceden al fotograma inicial especificado. El predeterminado es tratarlos según MissingFrameMode, pero también pueden fijarse al fotograma inicial, o devolver una imagen negra que coincida con las ventanas de datos y visualización del fotograma inicial." + +msgid "The result from the previous iteration of the loop, or the primary input if no iterations have been performed yet. The content of the loop is defined by feeding this previous result through the processing nodes of choice and back around into the next plug." +msgstr "El resultado de la iteración anterior del bucle, o la entrada primaria si no se han realizado iteraciones aún. El contenido del bucle se define alimentando este resultado anterior a través de los nodos de procesamiento elegidos y de vuelta al conector next." + +msgid "Clipping planes for the created cameras. When creating a perspective camera, a near clip <= 0 is invalid, and will be replaced with 0.01. Also, certain lights only start casting light at some distance - if near clip is less than this, it will be increased." +msgstr "Planos de recorte para las cámaras creadas. Al crear una cámara de perspectiva, un recorte cercano <= 0 es inválido y se reemplazará con 0.01. Además, ciertas luces solo emiten luz a cierta distancia - si el recorte cercano es menor, se incrementará." + +msgid "Resets the transforms at the specified scene locations, baking the old transforms into the vertices of any child objects so that they remain the same in world space. Essentially this turns transforms in the hierarchy into rigid deformations of the objects." +msgstr "Reinicia las transformaciones en las ubicaciones de escena especificadas, horneando las transformaciones antiguas en los vértices de cualquier objeto secundario para que permanezcan iguales en espacio mundial. Esencialmente convierte transformaciones en la jerarquía en deformaciones rígidas de los objetos." + +msgid "The names of context variables to be deleted before accessing the array of inputs. Names should be space-separated and may use Gaffer's standard wildcards. > Tip : This is convenient for cleaning up context variables only needed to compute the switch index." +msgstr "Los nombres de variables de contexto a eliminar antes de acceder al arreglo de entradas. Los nombres deben estar separados por espacios y pueden usar los comodines estándar de Gaffer. > Consejo: Es conveniente para limpiar variables de contexto solo necesarias para calcular el índice del switch." + +msgid "Turn on to allow location-specific tweaks to be made to attributes inherited from ancestors or the scene globals. Attributes will be localised to locations matching the node's filter prior to tweaking. The original inherited attributes will remain untouched." +msgstr "Activar para permitir ajustes específicos por ubicación a atributos heredados de ancestros o los globales de la escena. Los atributos se localizarán en las ubicaciones que coincidan con el filtro del nodo antes de ajustar. Los atributos heredados originales permanecerán intactos." + +msgid "Determines behaviour when the source channel doesn't exist : - Ignore : No change is made to the destination channel. - Error : The node errors. - Black : Black is shuffled into the destination channel. > Note : Does not apply when source contains wildcards." +msgstr "Determina el comportamiento cuando el canal de origen no existe: - Ignore: No se hace cambio en el canal de destino. - Error: El nodo genera error. - Black: Se envía negro al canal de destino. > Nota: No aplica cuando el origen contiene comodines." + +msgid "Determines whether a missing source location will trigger an error (the default) or be ignored. When a missing source is ignored, the `pointcloud_search()` and `pointcloud_get()` OSL functions will return `0`, allowing the shader to handle the problem itself." +msgstr "Determina si una ubicación de origen faltante generará un error (predeterminado) o será ignorada. Cuando se ignora un origen faltante, las funciones OSL `pointcloud_search()` y `pointcloud_get()` devolverán `0`, permitiendo que el shader maneje el problema." + +msgid "The name of a per-vertex integer primitive variable used to give each instance a unique identity. This is useful when points are added and removed over time, as is often the case in a particle simulation. The id is used to name the instance in the output scene." +msgstr "El nombre de una variable primitiva entera por vértice utilizada para dar a cada instancia una identidad única. Es útil cuando se añaden y eliminan puntos con el tiempo, como suele ocurrir en una simulación de partículas. El id se usa para nombrar la instancia en la escena de salida." + +msgid "The primitive variable containing the positions to use for the wireframe. This must have either Vertex or FaceVarying interpolation and contain either V3fVectorData or V2fVectorData. > Tip : Use \"uv\" to create a wireframe representation of the > UVs for a mesh." +msgstr "La variable primitiva que contiene las posiciones usadas para la malla de alambre. Debe tener interpolación Vertex o FaceVarying y contener V3fVectorData o V2fVectorData. > Consejo: Usar \"uv\" para crear una representación de malla de alambre de los UVs de una malla." + +msgid "Adjusts bounding boxes to account for the changes made to the object. > Caution : Adjusting boundings boxes has a performance penalty. > If you do not need accurate bounds or you know that the bounds > will only change slightly, you may prefer to turn this off." +msgstr "Ajusta las cajas de límites para tener en cuenta los cambios realizados al objeto. > Precaución: Ajustar las cajas de límites tiene una penalización de rendimiento. Si no se necesitan límites precisos o se sabe que solo cambiarán ligeramente, se puede preferir desactivar esto." + +msgid "Used to distinguish between catalogues, so that when multiple catalogues exist, it is possible to send a render to just one of them. Renders are matched to catalogues by comparing the \"catalogue:name\" parameter from the renderer output with the value of this plug." +msgstr "Se usa para distinguir entre catálogos, para que cuando existan múltiples catálogos, sea posible enviar un render a solo uno de ellos. Los renders se emparejan con catálogos comparando el parámetro \"catalogue:name\" de la salida del renderizador con el valor de este conector." + +msgid "An offset applied to the target transform before the constraint is applied. The offset is measured in the object space of the target location unless the target mode is UV or Vertex in which case the offset is measured relative to the local surface coordinate frame." +msgstr "Un desplazamiento aplicado a la transformación del objetivo antes de aplicar la restricción. El desplazamiento se mide en el espacio de objeto de la ubicación objetivo a menos que el modo objetivo sea UV o Vertex, en cuyo caso se mide relativo al marco de coordenadas local de la superficie." + +msgid "The imager to be assigned. The output of an ArnoldShader node holding an imager should be connected here. Multiple imagers may be assigned at once by chaining them together via their `input` parameters, and then assigning the final imager via the ArnoldImager node." +msgstr "El imager a asignar. La salida de un nodo ArnoldShader que contiene un imager debe conectarse aquí. Se pueden asignar múltiples imagers encadenándolos mediante sus parámetros `input`, y luego asignando el imager final mediante el nodo ArnoldImager." + +msgid "The UV image. The R and G channel are used to provide the U and V values, and these determine the source pixel in the main input image. A UV values of ( 0, 0 ) corresponds to the bottom left corner of the input image, and ( 1, 1 ) corresponds to the top right corner." +msgstr "La imagen UV. Los canales R y G se usan para proporcionar los valores U y V, y estos determinan el píxel de origen en la imagen de entrada principal. Un valor UV de (0, 0) corresponde a la esquina inferior izquierda de la imagen de entrada, y (1, 1) corresponde a la esquina superior derecha." + +msgid "Combines the processing for a series of ImageTransforms so that transformation and filtering is only applied once. This gives better image quality and performance. > Note : When concatenation is in effect, the filter settings on upstream > ImageTransforms are ignored." +msgstr "Combina el procesamiento de una serie de ImageTransforms para que la transformación y el filtrado se apliquen solo una vez. Esto da mejor calidad de imagen y rendimiento. > Nota: Cuando la concatenación está en efecto, las configuraciones de filtro en ImageTransforms anteriores se ignoran." + +msgid "Context variables used to customise the [OpenColorIO context](https://opencolorio.readthedocs.io/en/latest/guides/authoring/overview.html#environment) used by upstream nodes. OpenColorIO refers to these variously as \"string vars\", \"context vars\" or \"environment vars\"." +msgstr "Variables de contexto utilizadas para personalizar el [contexto de OpenColorIO](https://opencolorio.readthedocs.io/en/latest/guides/authoring/overview.html#environment) usado por nodos anteriores. OpenColorIO se refiere a estas como \"string vars\", \"context vars\" o \"environment vars\"." + +msgid "The sampling rate between `start.frame` and `end.frame`. > Note : `start.frame` and `end.frame` will always be sampled even if the `step` does not exactly fit the range. > Caution : With a small `step` size it may not be possible to render with deformation blur enabled." +msgstr "La tasa de muestreo entre `start.frame` y `end.frame`. > Nota: `start.frame` y `end.frame` siempre se muestrearán incluso si el `step` no se ajusta exactamente al rango. > Precaución: Con un `step` pequeño puede no ser posible renderizar con desenfoque de deformación activado." + +msgid "The vertical field of view, according to the ratio `(horizontal FOV) / (vertical FOV)`. A value of 1 would result in a square aperture, while a value of 1.778 would result in a 16:9 aperture. \"Aperture\" in this sense is equivalent to film back/sensor. The final projection of a render using this camera will depend on these settings in combination with the `resolution` and `filmFit` render settings." +msgstr "El campo de visión vertical, según la relación `(FOV horizontal) / (FOV vertical)`. Un valor de 1 resultaría en una apertura cuadrada, mientras que 1.778 resultaría en una apertura 16:9. \"Aperture\" en este sentido es equivalente al respaldo de película/sensor. La proyección final de un render usando esta cámara dependerá de estos ajustes en combinación con las configuraciones de render `resolution` y `filmFit`." + +msgid "Variables used to customise the default [OpenColorIO context](https://opencolorio.readthedocs.io/en/latest/guides/authoring/overview.html#environment). OpenColorIO refers to these variously as \"string vars\", \"context vars\" or \"environment vars\". > Note : An OpenColorIOContext node can be used to define variables within specific parts of the node graph, or to perform wedging across several variable values." +msgstr "Variables utilizadas para personalizar el [contexto de OpenColorIO](https://opencolorio.readthedocs.io/en/latest/guides/authoring/overview.html#environment) predeterminado. OpenColorIO se refiere a estas como \"string vars\", \"context vars\" o \"environment vars\". > Nota: Un nodo OpenColorIOContext puede usarse para definir variables dentro de partes específicas del grafo de nodos, o para realizar cuñas a través de varios valores de variables." + +msgid "The source of the Cryptomatte manifest. - None: No manifest will be loaded. - Metadata: From the first of the following image metadata entries that exist for the selected Cryptomatte layer : - `manifest` : The manifest data. - `manif_file` : The name of a JSON manifest file stored in a directory specified on the `manifestDirectory` plug. - Sidecar File: From a JSON file specified on the `sidecarFile` plug." +msgstr "La fuente del manifiesto Cryptomatte. - None: No se cargará ningún manifiesto. - Metadata: Del primero de las siguientes entradas de metadatos de imagen que existan para la capa Cryptomatte seleccionada: - `manifest`: Los datos del manifiesto. - `manif_file`: El nombre de un archivo JSON de manifiesto almacenado en un directorio especificado en el conector `manifestDirectory`. - Sidecar File: De un archivo JSON especificado en el conector `sidecarFile`." + +msgid "The data type to be written to the OpenEXR file. If you want to use different data types for different channels, you can drive this with an expression or spreadsheet, which may use the same context variables as the layout plugs ( the useful ones are `${imageWriter:channelName}`, `${imageWriter:layerName}` and `${imageWriter:baseName}`, for the whole channel name, and for the prefix and suffix respectively )." +msgstr "Tipo de datos escrito en el archivo OpenEXR. Si se desea usar diferentes tipos de datos para diferentes canales, se puede controlar con una expresión o hoja de cálculo, que puede usar las mismas variables de contexto que los conectores de diseño (las útiles son `${imageWriter:channelName}`, `${imageWriter:layerName}` y `${imageWriter:baseName}`, para el nombre de canal completo, y para el prefijo y sufijo respectivamente)." + +msgid "The UV set used to distribute points. The size of faces in 3D space is used to determine the number of points on each face, so the UV set should not affect the overall look of the distribution for a particular seed, but using the UVs provides continuity when adjusting density. If polygons that are large in 3D space are small and narrow in UV space for the given UV set, you may encounter performance problems." +msgstr "El conjunto UV utilizado para distribuir puntos. El tamaño de las caras en espacio 3D se usa para determinar el número de puntos en cada cara, así que el conjunto UV no debería afectar el aspecto general de la distribución para una semilla particular, pero usar los UVs proporciona continuidad al ajustar la densidad. Si los polígonos que son grandes en espacio 3D son pequeños y estrechos en espacio UV para el conjunto UV dado, se pueden encontrar problemas de rendimiento." + +msgid "Causes this node to be executed immediately upon dispatch, rather than have its execution be scheduled normally by the dispatcher. For instance, when using the LocalDispatcher, the node will be executed immediately in the dispatching process and not in a background process as usual. When a node is made immediate, all upstream nodes are automatically considered to be immediate too, regardless of their settings." +msgstr "Hace que este nodo se ejecute inmediatamente al despachar, en lugar de programar su ejecución normalmente por el despachador. Por ejemplo, al usar LocalDispatcher, el nodo se ejecutará inmediatamente en el proceso de despacho y no en un proceso de fondo como es habitual. Cuando un nodo se hace inmediato, todos los nodos anteriores se consideran automáticamente inmediatos también, independientemente de su configuración." + +msgid "Specifies the root of the subtree to be copied from the input scene. The default value causes the whole scene to be collected. The rootName variable may be used in expressions and string substitutions for this plug, allowing different subtrees to be collected for each root location in the output. > Tip : > By specifying a leaf location as the root, it is possible to > collect single objects from the input scene." +msgstr "Especifica la raíz del subárbol a copiar de la escena de entrada. El valor predeterminado causa que toda la escena se recopile. La variable rootName puede usarse en expresiones y sustituciones de cadena para este conector, permitiendo recopilar diferentes subárboles para cada ubicación raíz en la salida. > Consejo: Al especificar una ubicación hoja como raíz, es posible recopilar objetos individuales de la escena de entrada." + +msgid "The name of a float primitive variable that specifies the parametric position on the curve to be sampled. A value of 0 corresponds to the start of the curve, and a value of 1 corresponds to the end. If left unspecified, a value of 0 is used. > Note : Values outside the `0-1` range are invalid and cannot > be sampled. In this case, the `status` output primitive variable > will contain `False` to indicate failure." +msgstr "El nombre de una variable primitiva float que especifica la posición paramétrica en la curva a muestrear. Un valor de 0 corresponde al inicio de la curva, y un valor de 1 corresponde al final. Si no se especifica, se usa un valor de 0. > Nota: Los valores fuera del rango `0-1` son inválidos y no pueden muestrearse. En este caso, la variable primitiva de salida `status` contendrá `False` para indicar fallo." + +msgid "Force bilinear tessellation of meshes without subdivision schemes. If there is no subdivision scheme stored on the mesh ( `interpolation = \"linear\"` ), and you haven't overridden the scheme, we interpret that to mean no tessellation is required. Bilinear tessellation won't change the shape of the surface, but sometimes forcing tessellation is useful anyways ( for example, to apply deformation on a denser mesh )." +msgstr "Forzar la teselación bilineal de mallas sin esquemas de subdivisión. Si no hay un esquema de subdivisión almacenado en la malla (`interpolation = \"linear\"`), y no se ha sobrescrito el esquema, se interpreta que no se requiere teselación. La teselación bilineal no cambiará la forma de la superficie, pero a veces forzar la teselación es útil de todas formas (por ejemplo, para aplicar deformación en una malla más densa)." + +msgid "The pattern to match the string against. This can use any of Gaffer's standard wildcards : | Pattern | Usage | |:----------|:---------------------------------------------| | * | Matches any string | | ? | Matches any single character | | [ABC] | Matches any single character from a list | | [!ABC] | Matches any single character not from a list | | [a-z] | Matches any single character in a range | | [!a-z] | Matches any single character not in a range | | \\\\ | Escapes the next character |" +msgstr "El patrón contra el cual comparar la cadena. Puede usar cualquiera de los comodines estándar de Gaffer: | Patrón | Uso | |:----------|:---------------------------------------------| | * | Coincide con cualquier cadena | | ? | Coincide con cualquier carácter individual | | [ABC] | Coincide con cualquier carácter de una lista | | [!ABC] | Coincide con cualquier carácter no en la lista | | [a-z] | Coincide con cualquier carácter en un rango | | [!a-z] | Coincide con cualquier carácter no en un rango | | \\\\ | Escapa el siguiente carácter |" + +msgid "The name of the backup file to be created. This may use any of the following variables : - `${script:directory}` : the directory that contains the script to be backed up. - `${script:name}` : the current filename of the script to be backed up. Note that this variable _must_ be used, otherwise backups for different scripts will be saved over the top of each other. - `${backup:number}` : the number of this backup, used to keep more than one backup per file. - `#` : the same as `${backup:number}`." +msgstr "El nombre del archivo de respaldo a crear. Puede usar cualquiera de las siguientes variables: - `${script:directory}`: el directorio que contiene el script a respaldar. - `${script:name}`: el nombre de archivo actual del script a respaldar. Esta variable _debe_ usarse, de lo contrario los respaldos de diferentes scripts se sobrescribirán entre sí. - `${backup:number}`: el número de este respaldo, para mantener más de un respaldo por archivo. - `#`: lo mismo que `${backup:number}`." + +msgid "Tool for selecting objects based on image data. Requires one of the following : - An `id` image layer with associated render manifest (enabled using the StandardOptions node). - An ObjectID Cryptomatte image. - An `instanceID` image layer. Supports the same interactions as the 3D scene selection tool: - Click or drag to set selection - Shift-click or shift-drag to add to selection - Drag and drop selected objects - Drag to Python Editor to get their names - Drag to PathFilter or Set node to add/remove their paths" +msgstr "Herramienta para seleccionar objetos basándose en datos de imagen. Requiere uno de los siguientes: - Una capa de imagen `id` con manifiesto de render asociado (activado usando el nodo StandardOptions). - Una imagen Cryptomatte ObjectID. - Una capa de imagen `instanceID`. Soporta las mismas interacciones que la herramienta de selección 3D: - Hacer clic o arrastrar para establecer la selección - Shift-clic o shift-arrastrar para añadir a la selección - Arrastrar y soltar objetos seleccionados - Arrastrar al editor de Python para obtener sus nombres - Arrastrar a PathFilter o nodo Set para añadir/eliminar sus rutas" + +msgid "An additional set of options to be added. Arbitrary numbers of options may be specified within a single `IECore.CompoundObject`, where each key/value pair in the object defines an option. This is convenient when using an expression to define the options and the option count might be dynamic. It can also be used to create options whose type cannot be handled by the `options` CompoundDataPlug. If the same option is defined by both the `options` and the `extraOptions` plugs, then the value from the `extraOptions` is taken." +msgstr "Un conjunto adicional de opciones a añadir. Se puede especificar un número arbitrario de opciones dentro de un solo `IECore.CompoundObject`, donde cada par clave/valor define una opción. Es conveniente al usar una expresión para definir las opciones y el conteo puede ser dinámico. También puede usarse para crear opciones cuyo tipo no puede ser manejado por el CompoundDataPlug `options`. Si la misma opción está definida por ambos conectores `options` y `extraOptions`, se toma el valor de `extraOptions`." + +msgid "Quantizes the variable value before adding it to the time. Quantizing to a large interval reduces the number of variations created. For example, if the primvar varies from 0 to 1, and you quantize to 0.2, then only 6 unique variations will be created, even if there are millions of instances. This dramatically improves performance, but if you need to see more continuous changes in the primvar values, you will need to reduce quantize, or in extreme cases where you need full accuracy and don't care about performance, set it to 0." +msgstr "Cuantiza el valor de la variable antes de añadirlo al tiempo. Cuantizar a un intervalo grande reduce el número de variaciones creadas. Por ejemplo, si la variable primitiva varía de 0 a 1, y se cuantiza a 0.2, solo se crearán 6 variaciones únicas, incluso si hay millones de instancias. Esto mejora dramáticamente el rendimiento, pero si se necesitan cambios más continuos en los valores de la variable primitiva, se deberá reducir la cuantización, o en casos extremos donde se necesite precisión total, establecerlo en 0." + +msgid "The name of the primitive variable which will determine the segmentation. You may specify an empty string, or any vertex primitive variable to use the vertex topology to determine segments, or use an indexed face-varying primitive variable - this will segment based on which face-vertices are connected ( for example, using indexed UVs will produce UV islands ). Uniform and constant primitive variables are also supported for consistency, but they just output which faces have the same uniform value, or put all faces in one segment." +msgstr "El nombre de la variable primitiva que determinará la segmentación. Se puede especificar una cadena vacía, o cualquier variable primitiva de vértice para usar la topología de vértices para determinar segmentos, o usar una variable primitiva face-varying indexada - esto segmentará según qué vértices de cara están conectados (por ejemplo, usar UVs indexados producirá islas UV). Las variables primitivas uniform y constant también se soportan por consistencia, pero solo generan qué caras tienen el mismo valor uniform, o colocan todas las caras en un segmento." + +msgid "Converts instances into a capsule, which won't be expanded until you Unencapsulate or render. When keeping these locations encapsulated, downstream nodes can't see the instance locations, which prevents editing but improves performance. This option should be preferred to a downstream Encapsulate node because it has the following benefits : - Substantially improved performance when the prototypes define sets. - Fewer unnecessary updates during interactive rendering. - Faster performance in renderer backends with special instancer capsule support ( ie. Arnold )" +msgstr "Convierte instancias en una cápsula, que no se expandirá hasta que se desencapsule o renderice. Al mantener estas ubicaciones encapsuladas, los nodos posteriores no pueden ver las ubicaciones de instancia, lo que previene la edición pero mejora el rendimiento. Esta opción debe preferirse a un nodo Encapsulate posterior porque tiene los siguientes beneficios: - Rendimiento sustancialmente mejorado cuando los prototipos definen conjuntos. - Menos actualizaciones innecesarias durante el renderizado interactivo. - Rendimiento más rápido en backends de renderizador con soporte especial de cápsulas de instanciador (ej. Arnold)." + +msgid "Filters the displayed properties. The filter may contain any of Gaffer's standard wildcards, and may either be used to match individual property names or entire paths. Examples -------- - `velocity` : Shows all properties which have `velocity` anywhere in their name, be they attributes, primitive variables or anything else. - `/Object/Primitive Variables` : Shows primitive variables. - `/Attributes/Standard` : Shows standard attributes. - `/Attributes/*/*surface/*/*color*` : Shows surface shader parameters whose name contains `color`." +msgstr "Filtra las propiedades mostradas. El filtro puede contener cualquiera de los comodines estándar de Gaffer, y puede usarse para coincidir con nombres de propiedades individuales o rutas completas. Ejemplos -------- - `velocity`: Muestra todas las propiedades que contienen `velocity` en su nombre, ya sean atributos, variables primitivas o cualquier otra cosa. - `/Object/Primitive Variables`: Muestra variables primitivas. - `/Attributes/Standard`: Muestra atributos estándar. - `/Attributes/*/*surface/*/*color*`: Muestra parámetros de shader de superficie cuyo nombre contiene `color`." + +msgid "The space in which the randomisation is specified. This defines how it is combined with the input orientations. Local : The randomisation is specified in local space and is therefore post-multiplied onto the input orientations. When using the Instancer, this is equivalent to randomising the prototypes before they are instanced. Parent : The transformation is specified in parent space and is therefore pre-multiplied onto the input orientations. When using the Instancer, this is equivalent to randomising the instances after they are positioned." +msgstr "El espacio en el que se especifica la aleatorización. Esto define cómo se combina con las orientaciones de entrada. Local: La aleatorización se especifica en espacio local y por lo tanto se post-multiplica sobre las orientaciones de entrada. Al usar el Instancer, esto es equivalente a aleatorizar los prototipos antes de instanciarlos. Parent: La transformación se especifica en espacio primario y por lo tanto se pre-multiplica sobre las orientaciones de entrada. Al usar el Instancer, esto es equivalente a aleatorizar las instancias después de posicionarlas." + +msgid "Offsets the aperture parallel to the image plane, to achieve a skewed viewing frustum. The scale of the offset depends on the projection and perspective mode: - Perspective projection: - _Field Of View_ mode: 1 offset = 1 horizontal field of view. - _Aperture and Focal Length_ mode: 1 offset = 1 aperture unit of measure (for example, 1mm). - Orthographic projection: 1 offset = 1 world space unit. For use in special cases, such as simulating a tilt-shift lens, rendering tiles for a large panorama, or matching a plate that has been asymmetrically cropped." +msgstr "Desplaza la apertura paralela al plano de imagen, para lograr un frustum de visión inclinado. La escala del desplazamiento depende del modo de proyección y perspectiva: - Proyección de perspectiva: - Modo _Field Of View_: 1 desplazamiento = 1 campo de visión horizontal. - Modo _Aperture and Focal Length_: 1 desplazamiento = 1 unidad de medida de apertura (por ejemplo, 1mm). - Proyección ortográfica: 1 desplazamiento = 1 unidad de espacio mundial. Para uso en casos especiales, como simular una lente tilt-shift, renderizar bloques para un panorama grande, o coincidir con una placa recortada asimétricamente." + +msgid "Specifies where face varying primitive variables should use a simple linear interpolation instead of being smoothed. In order for UVs to correspond to approximately the same texture areas as the original polygons, usually you want to, at minimum, pin the outside corners. But pinning the entire boundary causes some pretty weird discontinuities, so finding the right compromise is tricky. See the OpenSubdiv docs for explanation of the details of options like `Corners Plus 1`: https://graphics.pixar.com/opensubdiv/docs/subdivision_surfaces.html#schemes-and-options" +msgstr "Especifica dónde las variables primitivas face varying deben usar una interpolación lineal simple en lugar de ser suavizadas. Para que los UVs correspondan aproximadamente a las mismas áreas de textura que los polígonos originales, normalmente se desea, como mínimo, fijar las esquinas exteriores. Pero fijar todo el borde causa discontinuidades bastante extrañas, así que encontrar el compromiso correcto es complicado. Consultar la documentación de OpenSubdiv para explicación de los detalles de opciones como `Corners Plus 1`: https://graphics.pixar.com/opensubdiv/docs/subdivision_surfaces.html#schemes-and-options" + +msgid "Specifies which parts of mesh boundaries are forced to exactly meet the boundary. Without this forcing, a subdivision surface will naturally shrink back from the boundary as it smooths out. Usually, you want to force both edges and corners to exactly meet the boundary. The main reasons to change this are to use `Edge Only` if you want to produce curved edges from polygonal boundaries, or to use `None` if you're doing something tricky with seamlessly splitting subdiv meshes by providing the split meshes with a border of shared polygons in order to get continuous tangents." +msgstr "Especifica qué partes de los bordes de la malla se fuerzan a coincidir exactamente con el borde. Sin este forzado, una superficie de subdivisión se contraerá naturalmente desde el borde al suavizarse. Normalmente, se desea forzar tanto bordes como esquinas a coincidir exactamente. Las razones principales para cambiar esto son usar `Edge Only` si se desea producir bordes curvos desde bordes poligonales, o usar `None` si se está haciendo algo complejo dividiendo mallas de subdivisión sin costuras proporcionando a las mallas divididas un borde de polígonos compartidos para obtener tangentes continuas." + +msgid "Applies modifications, also known as \"tweaks\" to camera parameters or render options in the scene. Supports any number of tweaks, and custom camera parameters. Tweaks to camera parameters apply to every camera specified by the filter. Can add new camera parameters or render options. Any existing parameters/options can be replaced or removed. Numeric parameters/options can also be added to, subtracted from, or multiplied. Tweaks are applied in order, so if there is more than one tweak to the same parameter/option, the first tweak will be applied first, then the second, etc." +msgstr "Aplica modificaciones, también conocidas como \"ajustes\" a parámetros de cámara u opciones de render en la escena. Soporta cualquier número de ajustes, y parámetros de cámara personalizados. Los ajustes a parámetros de cámara se aplican a cada cámara especificada por el filtro. Puede añadir nuevos parámetros de cámara u opciones de render. Cualquier parámetro/opción existente puede reemplazarse o eliminarse. Los parámetros/opciones numéricos también pueden sumarse, restarse o multiplicarse. Los ajustes se aplican en orden, así que si hay más de un ajuste al mismo parámetro/opción, el primero se aplica primero, luego el segundo, etc." + +msgid "An additional set of attributes to be added. Arbitrary numbers of attributes may be specified within a single `IECore.CompoundObject`, where each key/value pair in the object defines an attribute. This is convenient when using an expression to define the attributes and the attribute count might be dynamic. It can also be used to create attributes whose type cannot be handled by the `attributes` CompoundDataPlug, with `IECoreScene.ShaderNetwork` being one example. If the same attribute is defined by both the attributes and the extraAttributes plugs, then the value from the extraAttributes is taken." +msgstr "Un conjunto adicional de atributos a añadir. Se puede especificar un número arbitrario de atributos dentro de un solo `IECore.CompoundObject`, donde cada par clave/valor define un atributo. Es conveniente al usar una expresión para definir los atributos y el conteo puede ser dinámico. También puede usarse para crear atributos cuyo tipo no puede ser manejado por el CompoundDataPlug `attributes`, siendo `IECoreScene.ShaderNetwork` un ejemplo. Si el mismo atributo está definido por ambos conectores attributes y extraAttributes, se toma el valor de extraAttributes." + +msgid "Copies from an input scene onto the vertices of a target object, making one copy per vertex. Additional vertex primitive variables on the target object can be used to choose between multiple prototypes, to specify their orientation, scale and attributes, and to modify the context in which the prototypes are evaluated. > Note : The target object will be removed from the scene. > Tip : Primitive variables with `Varying` interpolation are > supported wherever a variable with `Vertex` interpolation > is expected, provided that the primitive variable has the > same size as the equivalent `Vertex` variable." +msgstr "Copia de una escena de entrada sobre los vértices de un objeto objetivo, haciendo una copia por vértice. Variables primitivas de vértice adicionales en el objeto objetivo pueden usarse para elegir entre múltiples prototipos, especificar su orientación, escala y atributos, y modificar el contexto en el que se evalúan los prototipos. > Nota: El objeto objetivo se eliminará de la escena. > Consejo: Las variables primitivas con interpolación `Varying` se soportan donde se espera una variable con interpolación `Vertex`, siempre que la variable primitiva tenga el mismo tamaño que la variable `Vertex` equivalente." + +msgid "The location where the children will be placed in the output scene. The default is to place the children under the parent, but they may be relocated anywhere while still inheriting the parent's transform. This is particularly useful when parenting lights to geometry but wanting to group them and control their visibility separately. When the destination is evaluated, the `${scene:path}` variable holds the source location matched by the filter. This allows the children to be placed relative to the \"parent\". For example, `${scene:path}/..` will place the children alongside the \"parent\" rather than under it." +msgstr "La ubicación donde se colocarán los secundarios en la escena de salida. El predeterminado es colocarlos bajo el primario, pero pueden reubicarse en cualquier lugar heredando aún la transformación del primario. Es particularmente útil al emparentar luces a geometría pero queriendo agruparlas y controlar su visibilidad por separado. Cuando se evalúa el destino, la variable `${scene:path}` contiene la ubicación de origen coincidente con el filtro. Esto permite colocar los secundarios relativos al \"primario\". Por ejemplo, `${scene:path}/..` colocará los secundarios junto al \"primario\" en lugar de debajo." + +msgid "The method used to turn the attribute value into a colour for visualisation. - Color : This only works for attributes which already contain a colour or numeric value. The value is converted directly to a colour, using the min and max values to perform a remapping. - FalseColor : This only works for numeric attributes. Values between min and max are used to look up a colour in the ramp below. - Random : This works for any attribute type - a random colour is chosen for each unique attribute value. - Shader Node Color : This only works when visualising a shader attribute. It uses the node colour for the shader node which is assigned." +msgstr "El método utilizado para convertir el valor del atributo en un color para visualización. - Color: Solo funciona para atributos que ya contienen un valor de color o numérico. El valor se convierte directamente a color, usando los valores min y max para realizar un remapeo. - FalseColor: Solo funciona para atributos numéricos. Los valores entre min y max se usan para buscar un color en la rampa inferior. - Random: Funciona para cualquier tipo de atributo - se elige un color aleatorio para cada valor de atributo único. - Shader Node Color: Solo funciona al visualizar un atributo de shader. Usa el color de nodo del nodo de shader asignado." + +msgid "Optional system command to modify the environment when launching tasks in the background. Background tasks are launched in a separate process using a `gaffer execute ...` command, and they inherit the environment from the launching process. When an environment command is specified, tasks are instead launched using `environmentCommand gaffer execute ...`, and the environment command is responsible for modifying the inherited environment and then launching `gaffer execute ...`. For example, the following environment command will use the standard `/usr/bin/env` program to set some custom variables : ``` /usr/bin/env FOO=BAR TOTO=TATA ```" +msgstr "Comando de sistema opcional para modificar el entorno al lanzar tareas en segundo plano. Las tareas en segundo plano se lanzan en un proceso separado usando un comando `gaffer execute ...`, y heredan el entorno del proceso que las lanza. Cuando se especifica un comando de entorno, las tareas se lanzan usando `environmentCommand gaffer execute ...`, y el comando de entorno es responsable de modificar el entorno heredado y luego lanzar `gaffer execute ...`. Por ejemplo, el siguiente comando de entorno usará el programa estándar `/usr/bin/env` para establecer variables personalizadas: ``` /usr/bin/env FOO=BAR TOTO=TATA ```" + +msgid "The focal length portion of the _Aperture and Focal Length_ perspective mode. This is equivalent to the lens's focal length in a real camera setup. Use this in conjunction with the aperture to set the camera's equivalent field of view. Like on a real camera, the aperture is typically constant, and the focal length is then adjusted to control the field of view. This can be a distance in any unit of length, as long as you use the same unit for the aperture. You can safely follow convention and use millimeters for both. The final field of view of a render using this camera will depend on these settings in combination with the `resolution` and `filmFit` render options." +msgstr "La porción de longitud focal del modo de perspectiva _Aperture and Focal Length_. Es equivalente a la longitud focal de la lente en una configuración de cámara real. Utilizar en conjunto con la apertura para establecer el campo de visión equivalente de la cámara. Como en una cámara real, la apertura es típicamente constante, y la longitud focal se ajusta para controlar el campo de visión. Puede ser una distancia en cualquier unidad de longitud, siempre que se use la misma unidad para la apertura. Se puede seguir la convención y usar milímetros para ambos. El campo de visión final de un render usando esta cámara dependerá de estos ajustes en combinación con las opciones de render `resolution` y `filmFit`." + +msgid "The shader parameters to be queried - arbitrary numbers of shader parameters may be added as children of this plug via the user interface, or via python. Each child is a `NameValuePlug` whose `name` plug is the shader parameter to query, and whose `value` plug is the default value to use if the shader parameter can not be retrieved. The full network of the shader given by `shader` is available to be queried. Parameters on shaders in the network other than the output shader can be specified as `shaderName.parameterName`. > Note : If either the shader or parameter does not exist then the > query will not be performed and all outputs will be set to their > default values." +msgstr "Los parámetros de shader a consultar - se pueden añadir números arbitrarios de parámetros de shader como secundarios de este conector a través de la interfaz, o mediante Python. Cada secundario es un `NameValuePlug` cuyo conector `name` es el parámetro de shader a consultar, y cuyo conector `value` es el valor predeterminado si no se puede recuperar el parámetro. La red completa del shader dado por `shader` está disponible para consulta. Los parámetros en shaders de la red diferentes al shader de salida pueden especificarse como `shaderName.parameterName`. > Nota: Si el shader o parámetro no existe, la consulta no se realizará y todas las salidas se establecerán en sus valores predeterminados." + +msgid "Applies OpenColorIO \"looks\" to an image. A 'look' is a named color transform, intended to modify the look of an image in a 'creative' manner (as opposed to a colorspace definition which tends to be technically/mathematically defined). Examples of looks may be a neutral grade, to be applied to film scans prior to VFX work, or a per-shot DI grade decided on by the director, to be applied just before the viewing transform. OCIOLooks must be predefined in the OpenColorIO configuration before usage, often reference per-shot/sequence LUTs/CCs and are applied in scene linear colorspace. See the look plug for further syntax details. See opencolorio.org for look configuration customization examples." +msgstr "Aplica \"looks\" de OpenColorIO a una imagen. Un 'look' es una transformación de color nombrada, destinada a modificar la apariencia de una imagen de manera 'creativa' (a diferencia de una definición de espacio de color que tiende a ser técnica/matemática). Ejemplos de looks pueden ser un grado neutral, aplicado a escaneos de película antes del trabajo VFX, o un grado DI por toma decidido por el director, aplicado justo antes de la transformación de visualización. Los OCIOLooks deben estar predefinidos en la configuración de OpenColorIO antes de su uso, frecuentemente referencian LUTs/CCs por toma/secuencia y se aplican en espacio de color lineal de escena. Consultar el conector look para más detalles de sintaxis. Consultar opencolorio.org para ejemplos de personalización." + +msgid "Merges multiple input scenes into a single output scene. Merging is performed left to right, starting with `in[0]`. By default, when more than one input contains the same scene location, the location's properties from the leftmost input are kept. In this mode, only _new_ locations are merged in from the additional inputs. Optionally, the properties can be replaced by or merged with the properties of the subsequent inputs. Sets are always merged from all inputs. Where multiple inputs have sets with the same name, the sets are merged into a union. > Caution : When `transformMode` and/or `objectMode` is not `Keep`, > bounding box computations have significant overhead. Consider > not using these operations, or turning off `adjustBounds`." +msgstr "Combina múltiples escenas de entrada en una sola escena de salida. La combinación se realiza de izquierda a derecha, comenzando con `in[0]`. Por defecto, cuando más de una entrada contiene la misma ubicación de escena, se conservan las propiedades de la entrada más a la izquierda. En este modo, solo se combinan ubicaciones _nuevas_ de las entradas adicionales. Opcionalmente, las propiedades pueden reemplazarse o combinarse con las de las entradas subsiguientes. Los conjuntos siempre se combinan de todas las entradas. Donde múltiples entradas tienen conjuntos con el mismo nombre, se combinan en una unión. > Precaución: Cuando `transformMode` y/o `objectMode` no es `Keep`, los cálculos de cajas de límites tienen una sobrecarga significativa. Considerar no usar estas operaciones, o desactivar `adjustBounds`." + +msgid "The list of paths to the locations to be matched by the filter. A path is formed by a sequence of names separated by `/`, and specifies the hierarchical position of a location within the scene. Paths may use Gaffer's standard wildcard characters to match multiple locations. The `*` wildcard matches any sequence of characters within an individual name, but never matches across names separated by a `/`. - `/robot/*Arm` matches `/robot/leftArm`, `/robot/rightArm` and `/robot/Arm`. But does not match `/robot/limbs/leftArm` or `/robot/arm`. The `...` wildcard matches any sequence of names, and can be used to match locations no matter where they are parented in the hierarchy. - `/.../house` matches `/house`, `/street/house` and `/city/street/house`." +msgstr "La lista de rutas a las ubicaciones a coincidir con el filtro. Una ruta se forma por una secuencia de nombres separados por `/`, y especifica la posición jerárquica de una ubicación dentro de la escena. Las rutas pueden usar los caracteres comodín estándar de Gaffer para coincidir con múltiples ubicaciones. El comodín `*` coincide con cualquier secuencia de caracteres dentro de un nombre individual, pero nunca coincide a través de nombres separados por `/`. - `/robot/*Arm` coincide con `/robot/leftArm`, `/robot/rightArm` y `/robot/Arm`. Pero no coincide con `/robot/limbs/leftArm` o `/robot/arm`. El comodín `...` coincide con cualquier secuencia de nombres, y puede usarse para coincidir con ubicaciones sin importar dónde estén emparentadas en la jerarquía. - `/.../house` coincide con `/house`, `/street/house` y `/city/street/house`." + +msgid "The camera parameters to be queried - arbitrary numbers of queries may be added as children of this plug via the user interface, or via python. Each child is a `StringPlug` whose value is the parameter to query. > Note : While a query typically returns the value of a parameter, > a few special inbuilt queries return values not represented by a > parameter but which are instead computed from the camera. > - `apertureAspectRatio` : `aperture.x` / `aperture.y`. > - `fieldOfView` : The horizontal field of view in degrees, based > on `focalLength` and `aperture`. > - `frustum` : The screen window at a distance of 1 unit from the camera, taking > into account `filmFit`, `resolution`, and `pixelAspectRatio` render overrides > on the camera or values from the scene globals." +msgstr "Los parámetros de cámara a consultar - se pueden añadir números arbitrarios de consultas como secundarios de este conector a través de la interfaz, o mediante Python. Cada secundario es un `StringPlug` cuyo valor es el parámetro a consultar. > Nota: Aunque una consulta típicamente devuelve el valor de un parámetro, algunas consultas especiales incorporadas devuelven valores no representados por un parámetro sino calculados de la cámara. > - `apertureAspectRatio`: `aperture.x` / `aperture.y`. > - `fieldOfView`: El campo de visión horizontal en grados, basado en `focalLength` y `aperture`. > - `frustum`: La ventana de pantalla a una distancia de 1 unidad de la cámara, teniendo en cuenta las sobrescrituras de render `filmFit`, `resolution` y `pixelAspectRatio` en la cámara o valores de los globales de la escena." + +msgid "Controls how we create channels based on the contents of the file. Unfortunately, some software, such as Nuke, does not produce EXR files which follow the EXR specification, so the mode \"Default\" uses heuristics to guess what the channels mean. \"Default\" mode should support most files coming from either Nuke or standards compliant software. It can't handle every possibility in the spec though - in corner cases, it could get confused and think something comes from Nuke, and incorrectly prepend the part name to the channel name. If you know your EXR is compliant, you can \"EXR Specification\" mode which disables the heuristics, and just uses the channel names directly from the file. \"Legacy\" mode matches Gaffer <= 0.61 behaviour for compatibility reasons - it should not be used." +msgstr "Controla cómo se crean canales basándose en el contenido del archivo. Desafortunadamente, algún software, como Nuke, no produce archivos EXR que sigan la especificación EXR, por lo que el modo \"Default\" usa heurísticas para adivinar qué significan los canales. El modo \"Default\" debería soportar la mayoría de archivos de Nuke o software compatible con estándares. Sin embargo, no puede manejar todas las posibilidades de la especificación - en casos extremos, podría confundirse y pensar que algo viene de Nuke, y prefijar incorrectamente el nombre de la parte al nombre del canal. Si se sabe que el EXR es compatible, se puede usar el modo \"EXR Specification\" que desactiva las heurísticas, y usa los nombres de canal directamente del archivo. El modo \"Legacy\" coincide con el comportamiento de Gaffer <= 0.61 por razones de compatibilidad - no debe usarse." + +msgid "Appends render passes to the scene globals. Render passes can be used to define named variations of a scene. These can be rendered by dispatching a RenderPassWedge node downstream of your render node of choice, or written to disk by dispatching a RenderPassWedge node downstream of a SceneWriter. Scenes can be varied per render pass based on the value of the `renderPass` context variable, which will contain the name of the current render pass being dispatched. `${renderPass}` can be used on the `selector` plug of Spreadsheet or NameSwitch nodes to choose specific plug values or branches of the node graph per render pass, and its value can be queried using Expression or ContextQuery nodes. > Tip : The list of render passes is stored in the `renderPass:names` > option in the scene globals." +msgstr "Añade pases de render a los globales de la escena. Los pases de render pueden usarse para definir variaciones nombradas de una escena. Pueden renderizarse despachando un nodo RenderPassWedge posterior al nodo de render elegido, o escribirse en disco despachando un nodo RenderPassWedge posterior a un SceneWriter. Las escenas pueden variarse por pase de render según el valor de la variable de contexto `renderPass`, que contendrá el nombre del pase de render actual. `${renderPass}` puede usarse en el conector `selector` de nodos Spreadsheet o NameSwitch para elegir valores de conectores específicos o ramas del grafo de nodos por pase de render, y su valor puede consultarse usando nodos Expression o ContextQuery. > Consejo: La lista de pases de render se almacena en la opción `renderPass:names` en los globales de la escena." + +msgid "Defines a series of layers which are alpha-composited to generate the final image. Each layer contains all the disks within a specific radius range, allowing \"foreground\" disks to occlude \"background\" disks. Intended for use in approximating focal blur. The layers are defined by the radius values at their boundaries, which must be specified from low to high. Occlusion occurs between disks that are separated by at least 2 boundaries. Negative radii are accepted, allowing blurring to be represented both in front of and behind a focal plane. A reasonable value for the simulation of focal blur is therefore an exponential series from -maxRadius to +maxRadius, for example [ -32, -16, -8, -4, -2, -1, 1, 2, 4, 8, 16, 32 ] > Tip : The FocalBlur node provides a simpler and more intuitive method for defining occlusion layers (it uses the DiskBlur node internally)." +msgstr "Define una serie de capas que se componen por alfa para generar la imagen final. Cada capa contiene todos los discos dentro de un rango de radio específico, permitiendo que los discos de \"primer plano\" ocluyan los discos de \"fondo\". Destinado para aproximar el desenfoque focal. Las capas se definen por los valores de radio en sus límites, que deben especificarse de menor a mayor. La oclusión ocurre entre discos separados por al menos 2 límites. Se aceptan radios negativos, permitiendo representar desenfoque tanto delante como detrás de un plano focal. Un valor razonable para la simulación de desenfoque focal es una serie exponencial de -maxRadius a +maxRadius, por ejemplo [ -32, -16, -8, -4, -2, -1, 1, 2, 4, 8, 16, 32 ] > Consejo: El nodo FocalBlur proporciona un método más simple e intuitivo para definir capas de oclusión (usa el nodo DiskBlur internamente)." + +msgid "The width and height of the aperture when using the _Aperture and Focal Length_ perspective mode. Use this in conjunction with a focal length to define the camera's equivalent field of view. \"Aperture\" here is equivalent to the film back/sensor on a real camera. A handful of default camera presets are provided, including Full Frame 35mm and several popular Alexa and RED bodies. Once the aperture is set, the focal length can then be adjusted on its own to control the field of view, just like on a real camera. When setting the aperture manually, the `x` and `y` dimensions can be measured in any unit of length, so long as they use the same unit as the focal length. You can safely follow convention and use millimeters for both. The final field of view of a render will depend on these settings in combination with the `resolution` and `filmFit` render options." +msgstr "El ancho y alto de la apertura al usar el modo de perspectiva _Aperture and Focal Length_. Utilizar en conjunto con una longitud focal para definir el campo de visión equivalente de la cámara. \"Aperture\" aquí es equivalente al respaldo de película/sensor en una cámara real. Se proporcionan algunos presets de cámara predeterminados, incluyendo Full Frame 35mm y varios cuerpos populares Alexa y RED. Una vez establecida la apertura, la longitud focal puede ajustarse independientemente para controlar el campo de visión, como en una cámara real. Al establecer la apertura manualmente, las dimensiones `x` e `y` pueden medirse en cualquier unidad de longitud, siempre que usen la misma unidad que la longitud focal. Se puede seguir la convención y usar milímetros para ambos. El campo de visión final de un render dependerá de estos ajustes en combinación con las opciones de render `resolution` y `filmFit`." + +msgid "The list of names to be extracted as a matte. Names are matched against entries in the Cryptomatte manifest and Gaffer's standard wildcard characters can be used to match multiple names. - /robot/*Arm matches /robot/leftArm, /robot/rightArm and /robot/Arm. But does not match /robot/limbs/leftArm or /robot/arm. - /.../house matches /house, /street/house and /city/street/house. - /robot[ABC] matches /robotA, /robotB and /robotC. But does not match /robotD or /robota. Cryptomatte manifest entries containing '/' characters will be treated as hierarchical paths and a matte will be extracted for any entry that is matched or has an ancestor that is matched. - /robot extracts mattes for /robot, /robot/leftArm and /robot/rightArm. But does not extract /robotA or /robotLeftArm. ID values can be specified directly by wrapping a float ID value in angle brackets. - ``." +msgstr "La lista de nombres a extraer como máscara. Los nombres se comparan con entradas en el manifiesto Cryptomatte y los caracteres comodín estándar de Gaffer pueden usarse para coincidir con múltiples nombres. - /robot/*Arm coincide con /robot/leftArm, /robot/rightArm y /robot/Arm. Pero no coincide con /robot/limbs/leftArm o /robot/arm. - /.../house coincide con /house, /street/house y /city/street/house. - /robot[ABC] coincide con /robotA, /robotB y /robotC. Pero no coincide con /robotD o /robota. Las entradas del manifiesto Cryptomatte que contienen caracteres '/' se tratarán como rutas jerárquicas y se extraerá una máscara para cualquier entrada que coincida o tenga un ancestro que coincida. - /robot extrae máscaras para /robot, /robot/leftArm y /robot/rightArm. Pero no extrae /robotA o /robotLeftArm. Los valores de ID pueden especificarse directamente envolviendo un valor float de ID en corchetes angulares. - ``." + +msgid "This special output plug returns an CompoundData dictionary with counts about how many variations are being created. For each context variable variable being set ( including \"frame\" when using Time Offset ), there is an entry with the name of the context variable, with an IntData containing the number of unique values of that context variable. There is also an entry for \"\", with an IntData for the total number of unique contexts, considering all the context variables being created. Extracting the dictionary values and displaying them to users is handled by _VariationsPlugValueWidget. This information is important to display to users because varying the context requires extra evaluations of the `prototypes` scene, and can dramatically increase the cost of the Instancer. Note that variations are measured across all locations in the scene where the instancer is filtered." +msgstr "Este conector de salida especial devuelve un diccionario CompoundData con conteos sobre cuántas variaciones se están creando. Para cada variable de contexto que se establece (incluyendo \"frame\" al usar Time Offset), hay una entrada con el nombre de la variable de contexto, con un IntData que contiene el número de valores únicos de esa variable de contexto. También hay una entrada para \"\", con un IntData para el número total de contextos únicos, considerando todas las variables de contexto que se están creando. La extracción de los valores del diccionario y su visualización a los usuarios se maneja por _VariationsPlugValueWidget. Esta información es importante porque variar el contexto requiere evaluaciones extra de la escena `prototypes`, y puede incrementar dramáticamente el costo del Instancer. Las variaciones se miden en todas las ubicaciones de la escena donde se filtra el instanciador." + +msgid "The space in which the transformation is specified. Note that no matter which space is chosen, only the local matrices of the filtered locations are ever modified. They are simply modified in such as way as to emulate a modification in the chosen space. Local : The transformation is specified in local space and is therefore post-multiplied onto the local matrix. Parent : The transformation is specified in parent space and is therefore pre-multiplied onto the local matrix. World : The transformation is specified in world space and will therefore be applied as if the whole world was moved. This effect is then applied on a per-location basis to each of the filtered locations. Reset Local : The local matrix is replaced with the specified transform. Reset World : The transformation is specified as an absolute matrix in world space. Each of the filtered locations will be moved to this absolute position." +msgstr "El espacio en el que se especifica la transformación. Sin importar el espacio elegido, solo las matrices locales de las ubicaciones filtradas se modifican. Simplemente se modifican de forma que emulan una modificación en el espacio elegido. Local: La transformación se especifica en espacio local y se post-multiplica sobre la matriz local. Parent: La transformación se especifica en espacio primario y se pre-multiplica sobre la matriz local. World: La transformación se especifica en espacio mundial y se aplicará como si todo el mundo se moviera. Este efecto se aplica por ubicación a cada ubicación filtrada. Reset Local: La matriz local se reemplaza con la transformación especificada. Reset World: La transformación se especifica como una matriz absoluta en espacio mundial. Cada ubicación filtrada se moverá a esta posición absoluta." + +msgid "Determines how the image is scaled to fit the new resolution. If the aspect ratios of the input and the output images are the same, then this has no effect, otherwise it dictates what method is used to preserve the aspect ratio of the data. Horizontal : The image is scaled so that it fills the full width of the output resolution and aspect ratio is preserved. Vertical : The image is scaled so that it fills the full height of the output resolution and aspect ratio is preserved. Fit : Automatically picks Horizontal or Vertical such that all of the input image is contained within the output image. Padding is applied top and bottom or left and right as necessary. Fill : Automatically picks Horizontal or Vertical such that the full output resolution is covered. The image contents will extend outside the top and bottom or left and right of the display window as necessary. Distort : Distorts the image so that the input display window is fitted exactly to the output display window." +msgstr "Determina cómo se escala la imagen para ajustarse a la nueva resolución. Si las relaciones de aspecto de las imágenes de entrada y salida son iguales, no tiene efecto; de lo contrario dicta qué método se usa para preservar la relación de aspecto. Horizontal: La imagen se escala para llenar el ancho completo de la resolución de salida y se preserva la relación de aspecto. Vertical: La imagen se escala para llenar la altura completa de la resolución de salida y se preserva la relación de aspecto. Fit: Elige automáticamente Horizontal o Vertical de modo que toda la imagen de entrada quede contenida dentro de la imagen de salida. Se aplica relleno arriba y abajo o izquierda y derecha según sea necesario. Fill: Elige automáticamente Horizontal o Vertical de modo que se cubra toda la resolución de salida. El contenido de la imagen se extenderá fuera de la ventana de visualización según sea necesario. Distort: Distorsiona la imagen para que la ventana de visualización de entrada se ajuste exactamente a la de salida." + +msgid "The method used to define how the prototypes map onto each instance. - In \"Indexed (Roots List)\" mode, the `prototypeIndex` primitive variable must be an integer per-vertex. Optionally, a path in the prototypes scene corresponding to each index can be specified via the `prototypeRootsList` plug. If no roots are specified, an index of 0 applies the first location from the prototypes scene, an index of 1 applies the second, and so on. - In \"Indexed (Roots Variable)\" mode, the `prototypeIndex` primitive variable must be an integer per-vertex, and the `prototypeRoots` primitive variable must be a separate constant string array specifying a path in the prototypes scene corresponding to each index. - In \"Root per Vertex\" mode, the `prototypeRoots` primitive variable must be a string per-vertex which will be used to specify a path in the prototypes scene for each instance. > Note : it is advisable to provide an indexed string array in order to limit the number of unique prototypes." +msgstr "El método utilizado para definir cómo los prototipos se mapean a cada instancia. - En modo \"Indexed (Roots List)\", la variable primitiva `prototypeIndex` debe ser un entero por vértice. Opcionalmente, una ruta en la escena de prototipos correspondiente a cada índice puede especificarse mediante el conector `prototypeRootsList`. Si no se especifican raíces, un índice de 0 aplica la primera ubicación de la escena de prototipos, un índice de 1 aplica la segunda, y así sucesivamente. - En modo \"Indexed (Roots Variable)\", la variable primitiva `prototypeIndex` debe ser un entero por vértice, y la variable primitiva `prototypeRoots` debe ser un array de cadenas constante separado especificando una ruta en la escena de prototipos correspondiente a cada índice. - En modo \"Root per Vertex\", la variable primitiva `prototypeRoots` debe ser una cadena por vértice usada para especificar una ruta en la escena de prototipos para cada instancia. > Nota: Es recomendable proporcionar un array de cadenas indexado para limitar el número de prototipos únicos." + +msgid "A string to search for within the original name. All occurrences of this string will be replaced with the value of `replace`. When `useRegularExpressions` is on, the search string is treated as a regular expression, with the following syntax : Matching -------- - `.` : Matches any character. - `[aef]` : Matches any character in the set. - `[^aef]` : Matches any character not in the set. - `[a-z]` : Matches any character in the specified range. - `[[:digit:]]` : Matches any numeric digit. - `[[:space:]]` : Matches any whitespace character. Repetition ---------- - `*` : Matches the preceding pattern any number of times (including none). - `+` : Matches the preceding pattern 1 or more times. - `{N}` : Matches the preceding pattern N times. - `{M,N}` : Matches the preceding pattern between M and N times. Alternatives ------------ - `A|B` : Matches either pattern A or pattern B. Captures -------- - `()` : Captures the subgroup of the pattern within the brackets, allowing it to be referenced by `{}` in the `replace` string." +msgstr "Una cadena a buscar dentro del nombre original. Todas las ocurrencias de esta cadena se reemplazarán con el valor de `replace`. Cuando `useRegularExpressions` está activado, la cadena de búsqueda se trata como una expresión regular, con la siguiente sintaxis: Coincidencia -------- - `.`: Coincide con cualquier carácter. - `[aef]`: Coincide con cualquier carácter del conjunto. - `[^aef]`: Coincide con cualquier carácter no en el conjunto. - `[a-z]`: Coincide con cualquier carácter en el rango especificado. - `[[:digit:]]`: Coincide con cualquier dígito numérico. - `[[:space:]]`: Coincide con cualquier carácter de espacio. Repetición ---------- - `*`: Coincide con el patrón anterior cualquier número de veces (incluyendo ninguna). - `+`: Coincide con el patrón anterior 1 o más veces. - `{N}`: Coincide con el patrón anterior N veces. - `{M,N}`: Coincide con el patrón anterior entre M y N veces. Alternativas ------------ - `A|B`: Coincide con el patrón A o el patrón B. Capturas -------- - `()`: Captura el subgrupo del patrón dentro de los paréntesis, permitiendo referenciarlo con `{}` en la cadena `replace`." + +msgid "A set expression that computes a set that defines the locations to be matched. For example, the expression `mySpheresSet | myCubesSet` will create a set that contains all objects in `mySpheresSet` and `myCubesSet`. Gaffer supports the union operator (`|`) as shown in the example and also provides intersection (`&`) and difference (`-`) operations for set expressions. Names of locations can be used to represent a set that contains only that one location. In addition, the `in` and `containing` operators can be used to query descendant and ancestor matches. For example, `materialA in assetB` will select all locations in the `materialA` set that are at or below locations in the `assetB` set. This allows leaf matches to be made against sets that only contain root or parent locations. `allAssets containing glass` will selection locations in `allAssets` that have children in the `glass` set. For more examples please consult the Scripting Reference section in Gaffer's documentation. The context menu of the set expression text field provides entries that help construct set expressions." +msgstr "Una expresión de conjunto que calcula un conjunto que define las ubicaciones a coincidir. Por ejemplo, la expresión `mySpheresSet | myCubesSet` creará un conjunto que contiene todos los objetos en `mySpheresSet` y `myCubesSet`. Gaffer soporta el operador de unión (`|`) como se muestra en el ejemplo y también proporciona operaciones de intersección (`&`) y diferencia (`-`) para expresiones de conjunto. Los nombres de ubicaciones pueden usarse para representar un conjunto que contiene solo esa ubicación. Además, los operadores `in` y `containing` pueden usarse para consultar coincidencias de descendientes y ancestros. Por ejemplo, `materialA in assetB` seleccionará todas las ubicaciones en el conjunto `materialA` que estén en o debajo de ubicaciones en el conjunto `assetB`. Esto permite hacer coincidencias de hoja contra conjuntos que solo contienen ubicaciones raíz o primarias. `allAssets containing glass` seleccionará ubicaciones en `allAssets` que tengan secundarios en el conjunto `glass`. Para más ejemplos consultar la sección de Referencia de Scripts en la documentación de Gaffer. El menú contextual del campo de texto de expresión de conjunto proporciona entradas que ayudan a construir expresiones de conjunto." + +msgid "The scale to convert from focal length units to world space units. Combined with f-stop to calculate the lens aperture. Set this to scale the lens units into scene units, to ensure the depth of field blur correctly scales to the scene. Once this plug is set, the `fStop` plug can be adjusted to match a real-world lens setting. For example, given a lens with a focal length in mm, and a scene that uses decimeters for its world space units, the _Millimeters to Decimeters_ preset would provide the proper conversion. The default value of 0.1 scales millimeter (default focal length unit) to centimeter (default world space unit of Alembic and USD scene formats). Other default presets for scaling to decimeter or meter are also available. If using _Field Of View_ projection mode, you won't have a focal length plug to work with, and the aperture size will be (1,1). To compensate, select _Custom_ and then input a value that scales the scene unit of measure to a realistic aperture size. For example, `3.5` would convert 1 centimeter (Alembic/USD default) to 35mm, which would simulate a 35mm lens." +msgstr "La escala para convertir de unidades de longitud focal a unidades de espacio mundial. Combinada con f-stop para calcular la apertura de la lente. Establecer esto para escalar las unidades de lente a unidades de escena, para asegurar que el desenfoque de profundidad de campo escale correctamente a la escena. Una vez establecido este conector, el conector `fStop` puede ajustarse para coincidir con una configuración de lente real. Por ejemplo, dada una lente con longitud focal en mm, y una escena que usa decímetros para sus unidades de espacio mundial, el preset _Millimeters to Decimeters_ proporcionaría la conversión adecuada. El valor predeterminado de 0.1 escala milímetros (unidad de longitud focal predeterminada) a centímetros (unidad de espacio mundial predeterminada de formatos de escena Alembic y USD). También hay presets para escalar a decímetro o metro. Si se usa el modo de proyección _Field Of View_, no habrá un conector de longitud focal, y el tamaño de apertura será (1,1). Para compensar, seleccionar _Custom_ e introducir un valor que escale la unidad de medida de la escena a un tamaño de apertura realista. Por ejemplo, `3.5` convertiría 1 centímetro (predeterminado Alembic/USD) a 35mm, simulando una lente de 35mm." + +msgid "Determines how tasks for different frames are distributed between calls to the command : - Single : The command will be called for a single frame at a time. - Batch : The command will be called once for each batch of frames defined by `dispatcher.batchSize`. - Sequence : The command will be called once for all frames. In Batch and Sequences modes, an additional variable called `frames` is available to the command, containing a list of all frame numbers for which execution should be performed. The Context may be updated to reference any frame from this list, and accessing a variable returns the value for the current frame. A typical structure for the command might look something like this : ``` # Do some one-time initialization ... # Process all frames for frame in frames : context.setFrame( frame ) # Read variables after setting the frame to get # the right values for that frame. v = variables[\"v\"] ... # Do some one-time finalization ... ``` > Note : In Single mode, the command will only be called for each > frame if the inputs are animated. If the inputs are static > then the command will only be called once." +msgstr "Determina cómo las tareas para diferentes fotogramas se distribuyen entre las llamadas al comando: - Single: El comando se llamará para un solo fotograma a la vez. - Batch: El comando se llamará una vez para cada lote de fotogramas definido por `dispatcher.batchSize`. - Sequence: El comando se llamará una vez para todos los fotogramas. En los modos Batch y Sequence, una variable adicional llamada `frames` está disponible para el comando, conteniendo una lista de todos los números de fotograma para los cuales se debe realizar la ejecución. El contexto puede actualizarse para referenciar cualquier fotograma de esta lista, y acceder a una variable devuelve el valor para el fotograma actual. Una estructura típica para el comando podría verse así: ``` # Inicialización única ... # Procesar todos los fotogramas for frame in frames : context.setFrame( frame ) # Leer variables después de establecer el fotograma v = variables[\"v\"] ... # Finalización única ... ``` > Nota: En modo Single, el comando solo se llamará para cada fotograma si las entradas están animadas. Si las entradas son estáticas, el comando solo se llamará una vez." + +msgid "Controls where channels are placed in the file, including how they are named. \"Single part\" writes all channels to the same part ( all interleaved ). \"Part per layer\" writes a separate part for each layer, so they may be loaded independently for better performance, and is the default. \"Part per view\" is a compromise, where layers are not separated, but views are separated, so that stereo files can use independent data windows. There is also the option to use a layout that matches Nuke's default behaviour, but does not conform to the EXR specification. The Nuke presets match \"Part per Layer\", \"Part per View\", and \"Single Part\" respectively, but with the following deviations from the specification : * The layer name is omitted from the channel name * Custom channels from the main layer are placed in a part named other * The channel Z from the main layer is placed in a part named depth * The RGBA channels from secondary layers are renamed to red, green, blue, and alpha * When writing single part stereo, the view name comes before the layer name You may also pick \"custom\", and set up your own layout. This allows for things like a mixed layout that is partially EXR spec compliant, and partially Nuke. Or you could use a expression to group some layers together in the same part." +msgstr "Controla dónde se colocan los canales en el archivo, incluyendo cómo se nombran. \"Single part\" escribe todos los canales en la misma parte (todos intercalados). \"Part per layer\" escribe una parte separada para cada capa, para que puedan cargarse independientemente para mejor rendimiento, y es el predeterminado. \"Part per view\" es un compromiso, donde las capas no se separan, pero las vistas sí, para que los archivos estéreo puedan usar ventanas de datos independientes. También hay la opción de usar un diseño que coincida con el comportamiento predeterminado de Nuke, pero no conforme a la especificación EXR. Los presets de Nuke coinciden con \"Part per Layer\", \"Part per View\" y \"Single Part\" respectivamente, pero con las siguientes desviaciones de la especificación: * El nombre de capa se omite del nombre de canal * Los canales personalizados de la capa principal se colocan en una parte llamada other * El canal Z de la capa principal se coloca en una parte llamada depth * Los canales RVAA de capas secundarias se renombran a red, green, blue y alpha * Al escribir estéreo de una sola parte, el nombre de vista va antes del nombre de capa También se puede elegir \"custom\" y configurar un diseño propio. Esto permite cosas como un diseño mixto parcialmente compatible con la especificación EXR, y parcialmente Nuke. O se podría usar una expresión para agrupar algunas capas juntas en la misma parte." + +msgid "A prefix added to all per-instance attributes specified via the \\\"attributes\\\" plug." +msgstr "Un prefijo añadido a todos los atributos por instancia especificados mediante el conector \"attributes\"." + +msgid "Mesh Topology" +msgstr "Topología de malla" + +msgid "Vertices Per Face" +msgstr "Vértices por cara" + +msgid "Face Varying" +msgstr "Por cara variable" + +msgid "FaceVarying Linear Interpolation" +msgstr "Interpolación lineal por cara variable" + +msgid "Click to add plugs" +msgstr "Hacer clic para añadir conectores" + +msgid "All Types Excluded" +msgstr "Todos los tipos excluidos" + +msgid "Copy Text" +msgstr "Copiar texto" + +msgid "Insert OSL" +msgstr "Insertar OSL" + +msgid "Unavailable" +msgstr "No disponible" + +msgid "%s (%s)" +msgstr "%s (%s)" + +msgid "Add Plug" +msgstr "Añadir conector" + +msgid "Add Section" +msgstr "Añadir sección" + +msgid "Array" +msgstr "Matriz" + +msgid "Automatic ({})" +msgstr "Automático ({})" + +msgid "Blank" +msgstr "En blanco" + +msgid "Bool" +msgstr "Bool" + +msgid "CatalogueOutput{}" +msgstr "CatalogueOutput{}" + +msgid "Click to add column, or drop plug to connect" +msgstr "Hacer clic para añadir columna, o soltar conector para conectar" + +msgid "Click to add row, or drop new row names" +msgstr "Hacer clic para añadir fila, o soltar nombres de fila nuevos" + +msgid "Click to refresh row filter" +msgstr "Hacer clic para actualizar filtro de fila" + +msgid "Click to reload shader" +msgstr "Hacer clic para recargar shader" + +msgid "Click to set this image as Output 1 so it can be referenced from the Viewer or by CatalogueSelect nodes. Right-click to set other output indexes." +msgstr "Hacer clic para establecer esta imagen como salida 1 para que pueda ser referenciada desde el visor o por nodos CatalogueSelect. Clic derecho para establecer otros índices de salida." + +msgid "Color3f" +msgstr "Color3f" + +msgid "Color4f" +msgstr "Color4f" + +msgid "Create CatalogueSelect node for selected image" +msgstr "Crear nodo CatalogueSelect para imagen seleccionada" + +msgid "Create ShaderTweakProxy" +msgstr "Crear proxy de ajuste de shader" + +msgid "CurvesHeader" +msgstr "CurvesHeader" + +msgid "Duplicate selected image, hold alt to view copy. [Ctrl-D]" +msgstr "Duplicar imagen seleccionada, mantener alt para ver copia. [Ctrl-D]" + +msgid "Export selected image" +msgstr "Exportar imagen seleccionada" + +msgid "Insert Bookmark" +msgstr "Insertar marcador" + +msgid "Insert Plug Value" +msgstr "Insertar valor de conector" + +msgid "Invalid Config" +msgstr "Configuración inválida" + +msgid "KeysHeader" +msgstr "KeysHeader" + +msgid "Load image" +msgstr "Cargar imagen" + +msgid "Load..." +msgstr "Cargar..." + +msgid "Loading actions..." +msgstr "Cargando acciones..." + +msgid "No bookmarks available" +msgstr "No hay marcadores disponibles" + +msgid "No plugs available" +msgstr "No hay conectores disponibles" + +msgid "None available" +msgstr "Ninguno disponible" + +msgid "NumericBookMark{}" +msgstr "NumericBookMark{}" + +msgid "Parameter occurs in multiple shaders." +msgstr "El parámetro aparece en múltiples shaders." + +msgid "Pin Node Selection" +msgstr "Fijar selección de nodo" + +msgid "Proxies allow making connections from the outputs of nodes in the input network." +msgstr "Los proxies permiten hacer conexiones desde las salidas de nodos en la red de entrada." + +msgid "Refresh" +msgstr "Actualizar" + +msgid "Remove selected image [Delete]" +msgstr "Eliminar imagen seleccionada [Supr]" + +msgid "Row filter pattern" +msgstr "Patrón de filtro de fila" + +msgid "Select and scroll to parameter input." +msgstr "Seleccionar y desplazar a la entrada del parámetro." + +msgid "Select invisible ancestors" +msgstr "Seleccionar ancestros invisibles" + +msgid "Select parameter inputs and scroll to first.\n\nInputs :\n" +msgstr "Seleccionar entradas de parámetro y desplazar a la primera.\n\nEntradas :\n" + +msgid "Shader occurs in multiple networks." +msgstr "El shader aparece en múltiples redes." + +msgid "The average value of all pixels in the data window." +msgstr "El valor promedio de todos los píxeles en la ventana de datos." + +msgid "The maximum value of all pixels in the data window." +msgstr "El valor máximo de todos los píxeles en la ventana de datos." + +msgid "The minimum value of all pixels in the data window." +msgstr "El valor mínimo de todos los píxeles en la ventana de datos." + +msgid "V2f" +msgstr "V2f" + +msgid "V2i" +msgstr "V2i" + +msgid "V3f" +msgstr "V3f" + +msgid "V3i" +msgstr "V3i" + +msgid "Location(s) have been unhidden, but are still not visible because they have invisible ancestors." +msgstr "Las ubicaciones se han mostrado, pero aún no son visibles porque tienen ancestros invisibles." + +msgid "Connect To" +msgstr "Conectar a" + +msgid "Connect to {0}" +msgstr "Conectar a {0}" + +msgid "Collapse {} Components" +msgstr "Contraer componentes {}" + +msgid "Expand {} Components" +msgstr "Expandir componentes {}" + +msgid "Annotate..." +msgstr "Anotar..." + +msgid "User..." +msgstr "Usuario..." + +msgid "Save Default Inline Layout" +msgstr "Guardar disposición en línea predeterminada" + +msgid "Save Default Dialogue Layout" +msgstr "Guardar disposición de diálogo predeterminada" + +msgid "Set Label..." +msgstr "Establecer etiqueta..." + +msgid "Set Description..." +msgstr "Establecer descripción..." + +msgid "New..." +msgstr "Nuevo..." + +msgid "Delete Column" +msgstr "Eliminar columna" + +msgid "Switch to" +msgstr "Cambiar a" + +msgid "Rename..." +msgstr "Renombrar..." + +msgid "Move Columns To" +msgstr "Mover columnas a" + +msgid "Remove Sectioning" +msgstr "Eliminar secciones" + +msgid "Disable Row%s" +msgstr "Desactivar fila%s" + +msgid "Enable Row%s" +msgstr "Activar fila%s" + +msgid "Copy Row%s" +msgstr "Copiar fila%s" + +msgid "Paste Row%s" +msgstr "Pegar fila%s" + +msgid "Delete Row%s" +msgstr "Eliminar fila%s" + +msgid "Disable Cell%s" +msgstr "Desactivar celda%s" + +msgid "Enable Cell%s" +msgstr "Activar celda%s" + +msgid "Edit Cell%s" +msgstr "Editar celda%s" + +msgid "Copy Cell%s" +msgstr "Copiar celda%s" + +msgid "Paste Cell%s" +msgstr "Pegar celda%s" + +msgid "Create %s Expression..." +msgstr "Crear expresión %s..." + +msgid "Create Context Query..." +msgstr "Crear consulta de contexto..." + +msgid "Randomise..." +msgstr "Aleatorizar..." + +msgid "Randomise (Choice)..." +msgstr "Aleatorizar (elección)..." + +msgid "Add Color Override" +msgstr "Añadir sustitución de color" + +msgid "Select Members" +msgstr "Seleccionar miembros" + +msgid "edits to {} set{}" +msgstr "ediciones a {} conjunto{}" + +msgid "disabled edits to {} set{}" +msgstr "ediciones desactivadas a {} conjunto{}" + +msgid "and" +msgstr "y" + +msgid "Fit Mode %s" +msgstr "Modo de ajuste %s" + +msgid "Aspect %s" +msgstr "Proporción %s" + +msgid "Mult %s" +msgstr "Mult %s" + +msgid "Crop %s,%s-%s,%s" +msgstr "Recorte %s,%s-%s,%s" + +msgid "Overscan %s" +msgstr "Sobreescaneo %s" + +msgid "DOF" +msgstr "PdC" + +msgid "Purposes {}" +msgstr "Propósitos {}" + +msgid "Inclusions {}" +msgstr "Inclusiones {}" + +msgid "Exclusions {}" +msgstr "Exclusiones {}" + +msgid "Lights {}" +msgstr "Luces {}" + +msgid "Invisible" +msgstr "Invisible" + +msgid "Single Sided" +msgstr "Una cara" + +msgid "%d Segments" +msgstr "%d segmentos" + +msgid "Lines" +msgstr "Líneas" + +msgid "Width %0gpx" +msgstr "Ancho %0gpx" + +msgid "Basis Ignored" +msgstr "Base ignorada" + +msgid "Basis On" +msgstr "Base activada" + +msgid "ShadowGroup Applied" +msgstr "Grupo de sombras aplicado" + +msgid "Transform Type" +msgstr "Tipo de transformación" + +msgid "SSS Set Name" +msgstr "Nombre de conjunto SSS" + +msgid "Iterations %d" +msgstr "Iteraciones %d" + +msgid "Error %s" +msgstr "Error %s" + +msgid "Smooth Derivs" +msgstr "Derivadas suaves" + +msgid "Frustum Ignore" +msgstr "Ignorar frustum" + +msgid "Subdivide Polygons" +msgstr "Subdividir polígonos" + +msgid "Min Pixel Width %s" +msgstr "Ancho mín. de píxel %s" + +msgid "Min Pixel Width {}" +msgstr "Ancho mín. de píxel {}" + +msgid "Volume Step Scale %s" +msgstr "Escala de paso de volumen %s" + +msgid "Volume Step Size %s" +msgstr "Tamaño de paso de volumen %s" + +msgid "Shape Step Scale %s" +msgstr "Escala de paso de forma %s" + +msgid "Shape Step Size %s" +msgstr "Tamaño de paso de forma %s" + +msgid "Padding %s" +msgstr "Relleno %s" + +msgid "Velocity Scale %s" +msgstr "Escala de velocidad %s" + +msgid "Velocity FPS %s" +msgstr "FPS de velocidad %s" + +msgid "Velocity Outlier Threshold %s" +msgstr "Umbral de valores atípicos de velocidad %s" + +msgid "Toon Id" +msgstr "Id Toon" + +msgid "Bucket Size %d" +msgstr "Tamaño de cubo %d" + +msgid "Bucket Scanning %s" +msgstr "Escaneo de cubo %s" + +msgid "Parallel Init %s" +msgstr "Inicio paralelo %s" + +msgid "Threads %d" +msgstr "Hilos %d" + +msgid "AA %d" +msgstr "AA %d" + +msgid "Diffuse %d" +msgstr "Difuso %d" + +msgid "Specular %d" +msgstr "Especular %d" + +msgid "Transmission %d" +msgstr "Transmisión %d" + +msgid "SSS %d" +msgstr "SSS %d" + +msgid "Volume %d" +msgstr "Volumen %d" + +msgid "Light %d" +msgstr "Luz %d" + +msgid "Seed {0}" +msgstr "Semilla {0}" + +msgid "Clamp {0}" +msgstr "Limitador {0}" + +msgid "Clamp AOVs {0}" +msgstr "Limitador de VAS {0}" + +msgid "Indirect Clamp {0}" +msgstr "Limitador indirecto {0}" + +msgid "Low Light {0}" +msgstr "Luz baja {0}" + +msgid "Enable %d" +msgstr "Activar %d" + +msgid "AA Max %d" +msgstr "AA máx. %d" + +msgid "Threshold %s" +msgstr "Umbral %s" + +msgid "Progressive %s" +msgstr "Progresivo %s" + +msgid "Min AA %d" +msgstr "AA mín. %d" + +msgid "Total %d" +msgstr "Total %d" + +msgid "Transparency %d" +msgstr "Transparencia %d" + +msgid "Max Subdivisions %d" +msgstr "Subdivisiones máx. %d" + +msgid "Dicing Camera %s" +msgstr "Cámara de segmentación %s" + +msgid "Frustum Culling %s" +msgstr "Descarte de frustum %s" + +msgid "Frustum Padding %s" +msgstr "Relleno de frustum %s" + +msgid "Memory {0}" +msgstr "Memoria {0}" + +msgid "Per File Stats {0}" +msgstr "Estadísticas por archivo {0}" + +msgid "Sharpen {0}" +msgstr "Nitidez {0}" + +msgid "Use `.tx` {0}" +msgstr "Usar `.tx` {0}" + +msgid "Auto `.tx` {0}" +msgstr "Auto `.tx` {0}" + +msgid "Auto `.tx` path" +msgstr "Ruta auto `.tx`" + +msgid "Abort on Error" +msgstr "Abortar en error" + +msgid "File name" +msgstr "Nombre de archivo" + +msgid "Max Warnings %d" +msgstr "Advertencias máx. %d" + +msgid "Stats File:" +msgstr "Archivo de estadísticas:" + +msgid "Profile File:" +msgstr "Archivo de perfil:" + +msgid "Report File:" +msgstr "Archivo de informe:" + +msgid "Device: %s" +msgstr "Dispositivo: %s" + +msgid "Max Res: %i" +msgstr "Res. máx.: %i" + +msgid "Device {}" +msgstr "Dispositivo {}" + +msgid "Whether or not the object is visible to camera rays. To hide an object completely, use the `scene:visible` attribute instead." +msgstr "Indica si el objeto es visible a los rayos de cámara o no. Para ocultar un objeto completamente, usar el atributo `scene:visible` en su lugar." + +msgid "Whether or not the object is visible to diffuse rays." +msgstr "Indica si el objeto es visible a los rayos difusos o no." + +msgid "Whether or not the object is visible in glossy rays." +msgstr "Indica si el objeto es visible en los rayos especulares o no." + +msgid "Whether or not the object is visible in transmission." +msgstr "Indica si el objeto es visible en transmisión o no." + +msgid "Whether or not the object is visible to shadow rays - whether it casts shadows or not." +msgstr "Indica si el objeto es visible a los rayos de sombra o no - si proyecta sombras o no." + +msgid "Whether or not the object is visible to scatter rays." +msgstr "Indica si el objeto es visible a los rayos de dispersión o no." + +msgid "Turns the object into a holdout matte. This only affects primary (camera) rays." +msgstr "Convierte el objeto en una máscara de recorte. Solo afecta a los rayos primarios (cámara)." + +msgid "Turns the object into a shadow catcher." +msgstr "Convierte el objeto en un receptor de sombras." + +msgid "Push the shadow terminator towards the light to hide artifacts on low poly geometry." +msgstr "Empuja el terminador de sombra hacia la luz para ocultar artefactos en geometría de baja resolución." + +msgid "Offset rays from the surface to reduce shadow terminator artifact on low poly geometry. Only affects triangles at grazing angles to light." +msgstr "Desfase de geometría: desplaza los rayos desde la superficie para reducir artefactos del terminador de sombra en geometría de baja resolución. Solo afecta a triángulos en ángulos rasantes a la luz." + +msgid "Cast Shadow Caustics." +msgstr "Proyectar cáusticas de sombra." + +msgid "Receive Shadow Caustics." +msgstr "Recibir cáusticas de sombra." + +msgid "The max level of subdivision that can be applied." +msgstr "El nivel máximo de subdivisión que se puede aplicar." + +msgid "Multiplier for scene dicing rate." +msgstr "Multiplicador para la tasa de teselado de la escena." + +msgid "Set the lightgroup of an object with emission." +msgstr "Establece el grupo de luces de un objeto con emisión." + +msgid "Value under which voxels are considered empty space to optimize rendering." +msgstr "Valor por debajo del cual los vóxeles se consideran espacio vacío para optimizar el renderizado." + +msgid "Distance between volume samples. When zero it is automatically estimated based on the voxel size." +msgstr "Distancia entre muestras de volumen. Cuando es cero se estima automáticamente basándose en el tamaño del vóxel." + +msgid "Specify volume density and step size in object or world space. By default object space is used, so that the volume opacity and detail remains the same regardless of object scale." +msgstr "Especifica la densidad del volumen y el tamaño de paso en espacio de objeto o mundial. Por defecto se usa espacio de objeto, para que la opacidad y el detalle del volumen se mantengan iguales independientemente de la escala del objeto." + +msgid "Scales velocity vectors used in motion blur computation." +msgstr "Escala los vectores de velocidad usados en el cálculo de desenfoque de movimiento." + +msgid "Specifies volume data precision, lower values reduce memory consumption at the cost of detail." +msgstr "Especifica la precisión de datos de volumen, valores menores reducen el consumo de memoria a costa del detalle." + +msgid "Asset name for cryptomatte." +msgstr "Nombre de recurso para Cryptomatte." + +msgid "Sampling strategy for emissive surfaces." +msgstr "Estrategia de muestreo para superficies emisivas." + +msgid "Use transparent shadows for this material if it contains a Transparent BSDF, disabling will render faster but not give accurate shadows." +msgstr "Usar sombras transparentes para este material si contiene un BSDF transparente, desactivar renderizará más rápido pero no dará sombras precisas." + +msgid "Disabling this when using volume rendering, assume volume has the same density everywhere (not using any textures), for faster rendering." +msgstr "Al desactivar esto durante el renderizado de volumen, se asume que el volumen tiene la misma densidad en todas partes (sin usar texturas), para un renderizado más rápido." + +msgid "Sampling method to use for volumes." +msgstr "Método de muestreo usado para volúmenes." + +msgid "Interpolation method to use for volumes." +msgstr "Método de interpolación usado para volúmenes." + +msgid "Scale the distance between volume shader samples when rendering the volume (lower values give more accurate and detailed results, but also increased render time)." +msgstr "Escala la distancia entre muestras de shader de volumen al renderizar el volumen (valores menores dan resultados más precisos y detallados, pero también aumentan el tiempo de render)." + +msgid "Method to use for the displacement." +msgstr "Método usado para el desplazamiento." + +msgid "Whether or not the object is visible to shadow rays (whether or not it casts shadows)." +msgstr "Indica si el objeto es visible a los rayos de sombra o no (si proyecta sombras o no)." + +msgid "The lights that cause this object to cast shadows. > Caution : This attribute has been superceded and will be removed. Use > the standard `shadowedLights` attribute instead." +msgstr "Las luces que causan que este objeto proyecte sombras. > Precaución: Este atributo ha sido reemplazado y será eliminado. Usar en su lugar el atributo de enlace de luces de sombra en los atributos estándar." + +msgid "Whether or not the object is visible in reflected diffuse (ie. if it casts bounce light)." +msgstr "Indica si el objeto es visible en difuso reflejado o no (si proyecta luz rebotada)." + +msgid "Whether or not the object is visible in reflected specular (ie. if it is visible in mirrors)." +msgstr "Indica si el objeto es visible en especular reflejado o no (si es visible en espejos)." + +msgid "Whether or not the object is visible in transmitted diffuse (ie. if it casts light through leaves)." +msgstr "Indica si el objeto es visible en difuso transmitido o no (si proyecta luz a través de hojas)." + +msgid "Whether or not the object is visible in refracted specular (ie. if it can be seen through glass)." +msgstr "Indica si el objeto es visible en especular refractado o no (si puede verse a través del vidrio)." + +msgid "Whether or not the object is visible in volume scattering." +msgstr "Indica si el objeto es visible en la dispersión de volumen o no." + +msgid "Whether or not the object is visible to subsurface rays." +msgstr "Indica si el objeto es visible a los rayos de subsuperficie o no." + +msgid "Whether or not the autobump is visible to camera rays." +msgstr "Indica si el autobump es visible a los rayos de cámara o no." + +msgid "Whether or not the autobump is visible to shadow rays." +msgstr "Indica si el autobump es visible a los rayos de sombra o no." + +msgid "Whether or not the autobump is visible in reflected diffuse (ie. if it casts bounce light)." +msgstr "Indica si el autobump es visible en difuso reflejado o no (si proyecta luz rebotada)." + +msgid "Whether or not the autobump is visible in reflected specular (ie. if it is visible in mirrors)." +msgstr "Indica si el autobump es visible en especular reflejado o no (si es visible en espejos)." + +msgid "Whether or not the autobump is visible in transmitted diffuse (ie. if it casts light through leaves)." +msgstr "Indica si el autobump es visible en difuso transmitido o no (si proyecta luz a través de hojas)." + +msgid "Whether or not the autobump is visible in refracted specular (ie. if it can be seen through glass)." +msgstr "Indica si el autobump es visible en especular refractado o no (si puede verse a través del vidrio)." + +msgid "Whether or not the autobump is visible in volume scattering." +msgstr "Indica si el autobump es visible en la dispersión de volumen o no." + +msgid "Whether or not the autobump is visible to subsurface rays." +msgstr "Indica si el autobump es visible a los rayos de subsuperficie o no." + +msgid "Choose how transform motion is interpolated. \"Linear\" produces classic linear vertex motion, \"RotateAboutOrigin\" produces curved arcs centred on the object's origin, and \"RotateAboutCenter\", the default, produces curved arcs centred on the object's bounding box middle." +msgstr "Elige cómo se interpola el movimiento de transformación. "Linear" produce movimiento lineal clásico de vértices, "RotateAboutOrigin" produce rotación y escala alrededor del origen, y "RotateAboutCenter" produce rotación y escala alrededor del centro del cuadro delimitador." + +msgid "Flags the object as being opaque." +msgstr "Marca el objeto como opaco." + +msgid "Whether or not the object receives shadows." +msgstr "Indica si el objeto recibe sombras o no." + +msgid "Whether or not the object casts shadows onto itself." +msgstr "Indica si el objeto proyecta sombras sobre sí mismo o no." + +msgid "If given, subsurface will be blended across any other objects which share the same sss set name." +msgstr "Si se proporciona, la subsuperficie se mezclará con cualquier otro objeto que comparta el mismo nombre de conjunto SSS." + +msgid "The maximum number of subdivision steps to apply when rendering subdivision surface. To set an exact number of subdivisions, set the adaptive error to 0 so that the maximum becomes the controlling factor. Use the MeshType node to ensure that a mesh is treated as a subdivision surface in the first place." +msgstr "El número máximo de pasos de subdivisión a aplicar al renderizar una superficie de subdivisión. Para establecer un número exacto de subdivisiones, poner el error adaptativo en 0 para que este valor se use directamente." + +msgid "The maximum allowable deviation from the true surface and the subdivided approximation. How the error is measured is determined by the metric below. Note also that the iterations value above provides a hard limit on the maximum number of subdivision steps, so if changing the error setting appears to have no effect, you may need to raise the maximum. > Note : Objects with a non-zero value will not take part in > Gaffer's automatic instancing unless `ai:polymesh:subdiv_adaptive_space` > is set to \"object\"." +msgstr "La desviación máxima permitida entre la superficie real y la aproximación subdividida. La forma de medir el error viene determinada por la métrica. Un error de 0 desactiva la subdivisión adaptativa, haciendo que se use directamente el nivel máximo de subdivisión." + +msgid "The metric used when performing adaptive subdivision as specified by the adaptive error. The flatness metric ensures that the subdivided surface doesn't deviate from the true surface by more than the error, and will tend to increase detail in areas of high curvature. The edge length metric ensures that the edge length of a polygon is never longer than the error, so will tend to subdivide evenly regardless of curvature - this can be useful when applying a displacement shader. The auto metric automatically uses the flatness metric when no displacement shader is applied, and the edge length metric when a displacement shader is applied." +msgstr "La métrica usada al realizar subdivisión adaptativa según el error adaptativo. La métrica de planitud asegura que la superficie subdividida no se desvíe de ser plana más allá del error especificado. La métrica de borde y la métrica automática son otras alternativas que pueden dar mejores resultados en algunos casos." + +msgid "The space in which the error is measured when performing adaptive subdivision. Raster space means that the subdivision adapts to size on screen, with `ai:polymesh:subdiv_adaptive_error` being specified in pixels. Object space means that the error is measured in object space units and will not be sensitive to size on screen." +msgstr "El espacio en el que se mide el error al realizar subdivisión adaptativa. Espacio ráster significa que la subdivisión se adapta al tamaño en pantalla, de modo que los objetos más cercanos a la cámara obtienen más subdivisión. Espacio objeto significa que la subdivisión es independiente de la cámara." + +msgid "Determines how UVs are subdivided." +msgstr "Determina cómo se subdividen las UV." + +msgid "Computes smooth UV derivatives (dPdu and dPdv) per vertex. This can be needed to remove faceting from anisotropic specular and other shading effects that use the derivatives." +msgstr "Calcula derivadas UV suaves (dPdu y dPdv) por vértice. Esto puede ser necesario para eliminar el facetado de especular anisotrópico y otros efectos de sombreado que dependen de las derivadas UV." + +msgid "Turns off subdivision culling on a per-object basis. This provides finer control on top of the global `ai:subdiv_frustum_culling` option provided by the ArnoldOptions node." +msgstr "Desactiva el descarte de subdivisión por objeto. Esto proporciona un control más fino sobre la opción global `ai:subdiv_frustum_culling` proporcionada por ArnoldOptions." + +msgid "Causes polygon meshes to be rendered with Arnold's subdiv_type parameter set to \"linear\" rather than \"none\". This can be used to increase detail when using polygons with displacement shaders and/or mesh lights. > Caution : This is not equivalent to converting a polygon > mesh into a subdivision surface. To render with Arnold's > subdiv_type set to \"catclark\", you must use the MeshType > node to convert polygon meshes into subdivision surfaces." +msgstr "Hace que las mallas poligonales se rendericen con el parámetro subdiv_type de Arnold establecido en \"linear\" en lugar de \"none\". Esto puede usarse para incrementar la precisión del sombreado para mallas que contienen triángulos." + +msgid "How the curves are rendered. Ribbon mode treats the curves as flat ribbons facing the camera, and is most suited for rendering of thin curves with a dedicated hair shader. Thick mode treats the curves as tubes, and is suited for use with a regular surface shader. > Note : To render using Arnold's \"oriented\" mode, set > mode to \"ribbon\" and add per-vertex normals to the > curves as a primitive variable named \"N\"." +msgstr "Cómo se renderizan las curvas. El modo cinta trata las curvas como cintas planas orientadas a la cámara, y es más adecuado para renderizar curvas delgadas como cabello. El modo grueso trata las curvas como tubos, y es más adecuado para renderizar curvas gruesas como tallarines o cables." + +msgid "The minimum thickness of the curves, measured in pixels on the screen. When rendering very thin curves, a large number of AA samples are required to avoid aliasing. In these cases a minimum pixel width may be specified to artificially thicken the curves, meaning that fewer AA samples may be used. The additional width is compensated for automatically by lowering the opacity of the curves." +msgstr "El grosor mínimo de las curvas, medido en píxeles en pantalla. Al renderizar curvas muy delgadas, se requiere un gran número de muestras AA para resolverlas, y puede resultar en renders muy lentos. Establecer un ancho mínimo de píxeles permite renderizar las curvas con un método más rápido tipo volumen que da resultados más suaves." + +msgid "The minimum width of rendered points primitives, measured in pixels on the screen. When rendering very small points, a large number of AA samples are required to avoid aliasing. In these cases a minimum pixel width may be specified to artificially enlarge the points, meaning that fewer AA samples may be used. The additional size is compensated for automatically by lowering the opacity of the points." +msgstr "El ancho mínimo de los primitivos de puntos renderizados, medido en píxeles en pantalla. Al renderizar puntos muy pequeños, se requiere un gran número de muestras AA para resolverlos, lo que puede resultar en renders muy lentos. Establecer un ancho mínimo de píxeles permite renderizar los puntos con un método más rápido tipo volumen que da resultados más suaves." + +msgid "Override the step size taken when raymarching volumes. If this value is disabled or zero then value is calculated from the voxel size." +msgstr "Sobrescribe el tamaño de paso al recorrer volúmenes por raymarching. Si este valor está desactivado o es cero, se calcula a partir del tamaño del vóxel." + +msgid "Raymarching step size is calculated using this value multiplied by the volume voxel size or `ai:volume:step_size` if set." +msgstr "El tamaño de paso de raymarching se calcula usando este valor multiplicado por el tamaño de vóxel del volumen o `ai:volume:step_size` si está establecido." + +msgid "A non-zero value causes an object to be treated as a volume container, and a value of 0 causes an object to be treated as regular geometry." +msgstr "Un valor distinto de cero hace que un objeto se trate como un contenedor de volumen, y un valor de 0 hace que se trate como geometría regular. Solo aplica a objetos de malla poligonal." + +msgid "Raymarching step size is calculated using this value multiplied by `ai:shape:step_size`." +msgstr "El tamaño de paso de raymarching se calcula usando este valor multiplicado por `ai:shape:step_size`." + +msgid "Allows a volume to be displaced outside its bounds. When rendering a mesh as a volume, this enables displacement." +msgstr "Permite que un volumen se desplace fuera de sus límites. Al renderizar una malla como volumen, esto habilita el desplazamiento." + +msgid "Scales the vector used in VDB motion blur computation." +msgstr "Escala el vector usado en el cálculo de desenfoque de movimiento VDB." + +msgid "Sets the frame rate used in VDB motion blur computation." +msgstr "Establece la tasa de fotogramas usada en el cálculo de desenfoque de movimiento VDB." + +msgid "Sets the outlier threshold used in VDB motion blur computation. When rendering physics simulations resulting velocities are potentially noisy and require some filtering for faster rendering." +msgstr "Establece el umbral de valores atípicos usado en el cálculo de desenfoque de movimiento VDB. Al renderizar simulaciones físicas, las velocidades resultantes son potencialmente ruidosas y requieren filtrado para un desenfoque de movimiento suave." + +msgid "You can select in the toon shader to skip outlines between objects with the same toon id set." +msgstr "Permite seleccionar en el shader toon que se omitan los contornos entre objetos con el mismo conjunto de ID toon." + +msgid "Whether or not the object is visible to hair rays." +msgstr "Indica si el objeto es visible a los rayos de cabello o no." + +msgid "Whether or not the object is visible in reflections." +msgstr "Indica si el objeto es visible en los reflejos o no." + +msgid "Whether or not the object is visible in refractions." +msgstr "Indica si el objeto es visible en las refracciones o no." + +msgid "Whether or not the object is visible to specular rays." +msgstr "Indica si el objeto es visible a los rayos especulares o no." + +msgid "Whether or not the object is rendered solid, in which case the assigned GLSL shader will be used to perform the shading." +msgstr "Indica si el objeto se renderiza como sólido o no, en cuyo caso el shader GLSL asignado se usará para realizar el sombreado." + +msgid "Whether or not the object is rendered as a wireframe. Use the `gl:primitive:wireframeColor` and `gl:primitive:wireframeWidth` attributes for finer control of the wireframe appearance." +msgstr "Indica si el objeto se renderiza como malla de alambre o no. Usar los atributos `gl:primitive:wireframeColor` y `gl:primitive:wireframeWidth` para un control más fino." + +msgid "The colour to use for the wireframe rendering. Only meaningful if wireframe rendering is turned on." +msgstr "Color usado para el renderizado de malla de alambre. Solo es significativo si el renderizado de malla de alambre está activado." + +msgid "The width in pixels of the wireframe rendering. Only meaningful if wireframe rendering is turned on." +msgstr "El ancho en píxeles del renderizado de malla de alambre. Solo es significativo si el renderizado de malla de alambre está activado." + +msgid "Whether or not an outline is drawn around the object. Use the `gl:primitive:outlineColor` and `gl:primitive:outlineWidth` attributes for finer control of the outline." +msgstr "Indica si se dibuja un contorno alrededor del objeto o no. Usar los atributos `gl:primitive:outlineColor` y `gl:primitive:outlineWidth` para un control más fino." + +msgid "The colour to use for the outline. Only meaningful if outline rendering is turned on." +msgstr "Color usado para el contorno. Solo es significativo si el renderizado de contorno está activado." + +msgid "The width in pixels of the outline. Only meaningful if outline rendering is turned on." +msgstr "El ancho en píxeles del contorno. Solo es significativo si el renderizado de contorno está activado." + +msgid "Whether or not the individual points (vertices) of the object are drawn. Use the `gl:primitive:pointColor` and `gl:primitive:pointWidth` attributes for finer control of the point rendering." +msgstr "Indica si se dibujan los puntos individuales (vértices) del objeto o no. Usar los atributos `gl:primitive:pointColor` y `gl:primitive:pointWidth` para un control más fino." + +msgid "The colour to use for the point rendering. Only meaningful if point rendering is turned on." +msgstr "Color usado para el renderizado de puntos. Solo es significativo si el renderizado de puntos está activado." + +msgid "The width in pixels of the points. Only meaningful if point rendering is turned on." +msgstr "El ancho en píxeles de los puntos. Solo es significativo si el renderizado de puntos está activado." + +msgid "Whether or not the bounding box of the object is drawn. This is in addition to any drawing of unexpanded bounding boxes that the viewer performs. Use the `gl:primitive:boundColor` attribute to change the colour of the bounding box." +msgstr "Indica si se dibuja la caja de límites del objeto o no. Esto es adicional a cualquier dibujo de cajas de límites no expandidas que el visor realice. Usar el atributo `gl:primitive:boundColor` para un control más fino." + +msgid "The colour to use for the bounding box rendering. Only meaningful if bounding box rendering is turned on." +msgstr "Color usado para el renderizado de la caja de límites. Solo es significativo si el renderizado de caja de límites está activado." + +msgid "Points primitives have a render type (set by the PointsType node) which allows them to be rendered as particles, disks, spheres etc. This attribute overrides that type for OpenGL only, allowing a much faster rendering as raw OpenGL points." +msgstr "Los primitivos de puntos tienen un tipo de render (establecido por el nodo PointsType) que permite renderizarlos como partículas, discos, esferas, etc. Este atributo sobrescribe eso solo para OpenGL, permitiendo renderizar primitivos de puntos como puntos GL para previsualización rápida." + +msgid "The width in pixels of the GL points rendered when the `gl:pointsPrimitive:useGLPoints` attribute has overridden the point type." +msgstr "El ancho en píxeles de los puntos GL renderizados cuando el atributo `gl:pointsPrimitive:useGLPoints` ha sobrescrito el tipo de punto." + +msgid "Curves primitives are typically rendered as ribbons and as such have an associated width in object space. This attribute overrides that for OpenGL only, allowing a much faster rendering as raw OpenGL lines." +msgstr "Los primitivos de curvas normalmente se renderizan como cintas y tienen un ancho asociado en espacio de objeto. Este atributo sobrescribe eso solo para OpenGL, permitiendo renderizar primitivos de curvas como líneas GL para previsualización rápida." + +msgid "The width in pixels of the GL lines rendered when the `gl:pointsPrimitive:useGLLines` attribute has overridden the drawing to use lines." +msgstr "El ancho en píxeles de las líneas GL renderizadas cuando el atributo `gl:pointsPrimitive:useGLLines` ha sobrescrito el dibujo para usar líneas." + +msgid "Turns off interpolation for cubic curves, just rendering straight lines between the vertices instead." +msgstr "Desactiva la interpolación para curvas cúbicas, renderizando líneas rectas entre los vértices en su lugar." + +msgid "Controls whether applicable locations draw a representation of their projection or frustum." +msgstr "Controla si las ubicaciones aplicables dibujan una representación de su proyección o frustum." + +msgid "Whether or not the object can be seen - invisible objects are not sent to the renderer at all. Typically more fine grained (camera, reflection etc) visibility can be specified using a renderer specific attributes node. Note that making a parent location invisible will always make all the children invisible too, regardless of their visibility settings." +msgstr "Indica si el objeto puede verse o no - los objetos invisibles no se envían al renderizador en absoluto. Normalmente un control más fino de visibilidad (cámara, reflejo, etc.) puede controlarse con atributos específicos del renderizador." + +msgid "Whether or not the object can be seen from both sides. Single sided objects appear invisible when seen from the back." +msgstr "Indica si el objeto puede verse desde ambos lados o no. Los objetos de una sola cara aparecen invisibles cuando se ven desde atrás." + +msgid "The default colour used to display the object in the absence of a specific shader assignment. Commonly used to control basic object appearance in the Viewer. > Tip : For more detailed control of object appearance in the > Viewer, use OpenGL attributes." +msgstr "El color predeterminado usado para mostrar el objeto en ausencia de una asignación de shader específica. Comúnmente usado para controlar la apariencia básica del objeto en el visor." + +msgid "Whether or not transformation animation on the object is taken into account in the rendered image. Use the `gaffer:transformBlurSegments` attribute to specify the number of segments used to represent the motion." +msgstr "Indica si la animación de transformación del objeto se tiene en cuenta en la imagen renderizada o no. Usar el atributo `gaffer:transformBlurSegments` para especificar el número de segmentos de transformación." + +msgid "The number of segments of transform animation to pass to the renderer when Transform Blur is on." +msgstr "Número de segmentos de animación de transformación enviados al renderizador cuando el desenfoque de transformación está activado." + +msgid "Whether or not deformation animation on the object is taken into account in the rendered image. Use the `gaffer:deformationBlurSegments` attribute to specify the number of segments used to represent the motion." +msgstr "Indica si la animación de deformación del objeto se tiene en cuenta en la imagen renderizada o no. Usar el atributo `gaffer:deformationBlurSegments` para especificar el número de segmentos de deformación." + +msgid "The number of segments of deformation animation to pass to the renderer when Deformation Blur is on." +msgstr "Número de segmentos de animación de deformación enviados al renderizador cuando el desenfoque de deformación está activado." + +msgid "Whether this light is muted." +msgstr "Indica si esta luz está silenciada." + +msgid "The lights to be linked to this object. Accepts a set expression or a space separated list of lights. Use \\"defaultLights\\" to refer to all lights that contribute to illumination by default. Examples -------- All the default lights plus the lights in the `characterLights` set : `defaultLights | characterLights` All the default lights, but without the lights in the `interiorLights` set : `defaultLights - interiorLights` > Info : Lights can be added to sets either by using the `sets` plug > on the light node itself, or by using a separate Set node." +msgstr "Luces enlazadas con este objeto. Acepta una expresión de conjunto o una lista de luces separada por espacios. Usar \\"defaultLights\\" para referirse a todas las luces que contribuyen a la iluminación por defecto. Ejemplos -------- Todas las luces predeterminadas más las luces del conjunto `characterLights`: `defaultLights | characterLights` Todas las luces predeterminadas, pero sin las luces del conjunto `interiorLights`: `defaultLights - interiorLights` > Info: Las luces pueden añadirse a conjuntos usando el conector `sets` en el propio nodo de luz, o usando un nodo Set separado." + +msgid "The lights that cast shadows from this object. Accepts a set expression or a space separated list of lights." +msgstr "Las luces que proyectan sombras desde este objeto. Acepta una expresión de conjunto o una lista de luces separada por espacios." + +msgid "The lights to be filtered by this light filter. Accepts a set expression or a space separated list of lights. Use \\"defaultLights\\" to refer to all lights that contribute to illumination by default." +msgstr "Luces filtradas por este filtro de luz. Acepta una expresión de conjunto o una lista de luces separada por espacios. Usar \\"defaultLights\\" para referirse a todas las luces que contribuyen a la iluminación por defecto." + +msgid "By default, if Gaffer sees two objects are identical, it will pass them to the renderer only once, saving a lot of memory. You can set this to false to disable that, losing the memory savings. This can be useful in certain cases like using world space displacement and wanting multiple copies to displace differently. Disabling is currently only supported by the Arnold and RenderMan renderer backends." +msgstr "Por defecto, si Gaffer detecta que dos objetos son idénticos, los enviará al renderizador solo una vez, ahorrando mucha memoria. Se puede desactivar esto si causa artefactos de renderizado." + +msgid "Specifies the purpose of a location to be `default`, `render`, `proxy` or `guide`. See the [USD documentation](https://graphics.pixar.com/usd/release/glossary.html#usdglossary-purpose) for more details. > Note : The `usd:purpose` attribute can be used with the > `render:includedPurposes` option to limit the objects included > in a render, and with the Viewer \"Purposes\" drawing mode to > limit the objects visible in a Viewer. > > Also note that native proxy workflows can be built using > Gaffer's contexts, such that proxy or render geometry can appear > at the _same_ location in the scene hierarchy, depending on the > value of a context variable. This has benefits when selecting > and filtering objects." +msgstr "Especifica el propósito de una ubicación como `default`, `render`, `proxy` o `guide`. Consultar la [documentación USD](https://graphics.pixar.com/usd/release/glossary.html#usdglossary-purpose) para más detalles." + +msgid "Specifies the kind of a location to be any of the values from USD's kind registry. See the [USD documentation](https://graphics.pixar.com/usd/release/glossary.html#usdglossary-kind) for more details. > Note : Gaffer doesn't assign any intrinsic > meaning to USD's kind." +msgstr "Especifica el tipo de una ubicación como cualquiera de los valores del registro de tipos de USD. Consultar la [documentación USD](https://graphics.pixar.com/usd/release/glossary.html#usdglossary-kind) para más detalles." + +#: SpreadsheetUI/_RowsPlugValueWidget.py (status text) +msgid "unnamed" +msgstr "sin nombre" + +#: SpreadsheetUI/_RowsPlugValueWidget.py (status bar) +msgid "Row : {}, Column : {}" +msgstr "Fila: {}, Columna: {}" + +#: SpreadsheetUI/_PlugTableView.py (move to section dialogue) +msgid "New Section" +msgstr "Nueva sección" + +#: SpreadsheetUI/_PlugTableView.py (move to section dialogue) +msgid "Move" +msgstr "Mover" + +#: SpreadsheetUI/_PlugTableView.py (row name width menu) +msgid "Triple" +msgstr "Triple" + +#: SpreadsheetUI/_PlugTableView.py (row name width menu) +msgid "Quadruple" +msgstr "Cuádruple" + +#: SpreadsheetUI/_RowsPlugValueWidget.py (add row menu) +msgid "Add Row" +msgstr "Añadir fila" + +#: SpreadsheetUI/_Algo.py (invalid selector dialogue) +msgid "Invalid Selector" +msgstr "Selector no válido" + +#: SpreadsheetUI/_Algo.py (invalid selector dialogue) +msgid "{sheetName}'s selector is set to: '{sheetSelector}'.\n\nThe '{plugName}' plug requires a different selector to work\nproperly. Continuing will reset the selector to '{selector}'." +msgstr "El selector de {sheetName} está establecido en: '{sheetSelector}'.\n\nEl conector '{plugName}' requiere un selector diferente para funcionar\ncorrectamente. Continuar restablecerá el selector a '{selector}'." + +#: RenderPassEditor.py (render pass tooltip) +msgid "No render pass is active." +msgstr "Ningún pase de render está activo." + +#: RenderPassEditor.py (render pass tooltip) +msgid "{} is not available." +msgstr "{} no está disponible." + +#: RenderPassEditor.py (render pass tooltip) +msgid "{} is the current render pass." +msgstr "{} es el pase de render actual." + +#: RenderPassEditor.py (render pass description) +msgid "{} has been automatically disabled by a render adaptor." +msgstr "{} ha sido desactivado automáticamente por un adaptador de render." + +#: RenderPassEditor.py (render pass description) +msgid "{} has been disabled." +msgstr "{} ha sido desactivado." + +#: GafferUSD (UsdPreviewSurface opacityMode) +msgid "transparent" +msgstr "transparente" + +#: GafferUSD (UsdPreviewSurface opacityMode) +msgid "presence" +msgstr "presencia" + +#: Node/menu label (Scene/OpenGL) +msgid "OpenGL Attributes" +msgstr "Atributos de OpenGL" + +#: Node/menu label (Scene/OpenGL) +msgid "Facing Ratio" +msgstr "Relación de cara" + +#: Node/menu label (Scene/OpenGL) +msgid "Ie Constant" +msgstr "Constante Ie" + +#: RenderPassEditor.py (render pass description) +msgid "{} has been automatically enabled by a render adaptor." +msgstr "{} ha sido activado automáticamente por un adaptador de render." + +#: RenderPassEditor.py (render pass creation dialogue) +msgid "A render pass named '{}' already exists." +msgstr "Ya existe un pase de render llamado '{}'." + +#: RenderPassEditor.py (upstream deletion dialogue) +msgid "{count} render pass{suffix} created upstream of {editScopeName}.

We recommend deleting {target} in the upstream Edit Scope, or disabling {target} in {editScopeName}." +msgstr "{count} pase de render {suffix} creado antes de {editScopeName}.

Recomendamos eliminar {target} en el ámbito de edición anterior, o desactivar {target} en {editScopeName}." + +#: RenderPassEditor.py (downstream deletion dialogue) +msgid "{count} render pass{suffix} created downstream of {editScopeName}.

We recommend deleting {target} in the downstream Edit Scope." +msgstr "{count} pase de render {suffix} creado después de {editScopeName}.

Recomendamos eliminar {target} en el ámbito de edición posterior." + +#: PathListingWidget.py (column headers) +msgid "Owner" +msgstr "Propietario" + +msgid "Modified" +msgstr "Modificado" + +#: MatchPatternPathFilterWidget.py (filter placeholder) +msgid "by" +msgstr "por" + +#: ShaderTweaksUI.py, PlugCreationWidget.py (warning messages) +msgid "Parameters added already" +msgstr "Parámetros ya añadidos" + +msgid "Unsupported data type" +msgstr "Tipo de datos no soportado" + +msgid "Unsupported type" +msgstr "Tipo no soportado" + +#: PlugPopup.py (rebase 1.6.18.0 - new upstream strings) +msgid " on {} nodes" +msgstr " en {} nodos" + +msgid "Editing {}{}" +msgstr "Editando {}{}" + diff --git a/python/GafferVDBUI/LevelSetOffsetUI.py b/python/GafferVDBUI/LevelSetOffsetUI.py index 966965c48e4..d8ecd917a20 100644 --- a/python/GafferVDBUI/LevelSetOffsetUI.py +++ b/python/GafferVDBUI/LevelSetOffsetUI.py @@ -36,30 +36,31 @@ import Gaffer import GafferVDB +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferVDB.LevelSetOffset, "description", - """Erodes or dilates a level set VDB.""", + _("""Erodes or dilates a level set VDB."""), plugs = { "grid" : { "description" : - """ + _(""" Name of the level set grid to offset in the VDB object. - """ + """) }, "offset" : { "description" : - """ + _(""" Amount to offset the level set by in voxel units. A positive number will erode the surface and negative will dilate. - """ + """) }, diff --git a/python/GafferVDBUI/LevelSetToMeshUI.py b/python/GafferVDBUI/LevelSetToMeshUI.py index 05024fb67dc..d9cb7f3f06d 100644 --- a/python/GafferVDBUI/LevelSetToMeshUI.py +++ b/python/GafferVDBUI/LevelSetToMeshUI.py @@ -36,52 +36,53 @@ import Gaffer import GafferVDB +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferVDB.LevelSetToMesh, "description", - """ + _(""" Converts a level set VDB object to a mesh primitive. - """, + """), plugs = { "filter" : { "description" : - """ + _(""" The filter used to choose the vdbs to be converted. Source locations are pruned from the output scene, unless they are reused as part of a destination location (or a separate source scene is connected). - """ + """) }, "source" : { "description" : - """ + _(""" An optional alternate scene to provide the vdbs to be converted. When connected : - The `filter` chooses locations to be merged from the `source` scene rather than then `in` scene. - Source locations are not pruned from the output scene. - """ + """) }, "destination" : { "description" : - """ + _(""" By default, vdbs will be replaced with a mesh in place, using the destination `${scene:path}`. The destination can be modified to change where the outputs are placed. If multiple filtered locations have the same destination, the vdbs will be merged into one mesh. The destination location will be created if it doesn't exist already. If the name overlaps with an existing location that isn't filtered, the name will get a suffix. - """, + """), }, @@ -97,28 +98,28 @@ "grid" : { "description" : - """ + _(""" Name of the level set grid to create a mesh primitive from. - """ + """) }, "isoValue" : { "description" : - """ + _(""" Value which defines the isosurface to convert to a mesh primitive. Usually this is set to zero but setting a small positive number will generate a dilated mesh and negative will create an eroded mesh. - """ + """) }, "adaptivity" : { "description" : - """ + _(""" Adaptively generate fewer polygons from level set. 0 - uniform meshing, 1 - maximum level of adaptivity. - """ + """) } diff --git a/python/GafferVDBUI/MeshToLevelSetUI.py b/python/GafferVDBUI/MeshToLevelSetUI.py index c98a001cf2e..0d1c5b12020 100644 --- a/python/GafferVDBUI/MeshToLevelSetUI.py +++ b/python/GafferVDBUI/MeshToLevelSetUI.py @@ -36,51 +36,52 @@ import Gaffer import GafferVDB +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferVDB.MeshToLevelSet, "description", - """ + _(""" Converts a mesh primitive to a level set VDB object. - """, + """), plugs = { "filter" : { "description" : - """ + _(""" The filter used to choose the meshes to be converted. Source locations are pruned from the output scene, unless they are reused as part of a destination location (or a separate source scene is connected). - """ + """) }, "source" : { "description" : - """ + _(""" An optional alternate scene to provide the meshes to be converted. When connected : - The `filter` chooses locations to be merged from the `source` scene rather than then `in` scene. - Source locations are not pruned from the output scene. - """ + """) }, "destination" : { "description" : - """ + _(""" By default, meshes will be replaced with a level set in place, using the destination `${scene:path}`. The destination can be modified to change where the outputs are placed. If multiple filtered locations have the same destination, the meshes will be merged into one level set. The destination location will be created if it doesn't exist already. If the name overlaps with an existing location that isn't filtered, the name will get a suffix. - """, + """), }, @@ -94,36 +95,36 @@ "grid" : { "description" : - """ + _(""" Name of the level set grid to create in the VDB object. - """ + """) }, "voxelSize" : { "description" : - """ + _(""" Size of the voxel in the level set grid. Smaller voxel sizes will increase resolution, take more memory & longer to process. - """ + """) }, "exteriorBandwidth" : { "description" : - """ + _(""" Defines the exterior width of the level set in voxel units. - """ + """) }, "interiorBandwidth" : { "description" : - """ + _(""" Defines the interior width of the level set in voxel units. - """ + """) }, diff --git a/python/GafferVDBUI/PointsGridToPointsUI.py b/python/GafferVDBUI/PointsGridToPointsUI.py index 3193ece95a4..bdb76a3a321 100644 --- a/python/GafferVDBUI/PointsGridToPointsUI.py +++ b/python/GafferVDBUI/PointsGridToPointsUI.py @@ -36,46 +36,47 @@ import Gaffer import GafferVDB +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferVDB.PointsGridToPoints, "description", - """ + _(""" Converts a points grid in a VDB object to a points primitive. - """, + """), plugs = { "grid" : { "description" : - """ + _(""" Name of the points grid in the VDB to create a points primitive from. - """ + """) }, "names" : { "description" : - """ + _(""" The names of the primitive variables to be extracted from VDB points grid. Names should be separated by spaces, and Gaffer's standard wildcard characters may be used. - """ + """) }, "invertNames" : { "description" : - """ + _(""" When on, the primitive variables matched by names are not extracted, and the non-matching primitive variables are extracted instead. - """ + """) }, diff --git a/python/GafferVDBUI/PointsToLevelSetUI.py b/python/GafferVDBUI/PointsToLevelSetUI.py index 03f98c6cdec..a415d4f44be 100644 --- a/python/GafferVDBUI/PointsToLevelSetUI.py +++ b/python/GafferVDBUI/PointsToLevelSetUI.py @@ -36,15 +36,16 @@ import Gaffer import GafferVDB +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferVDB.PointsToLevelSet, "description", - """ + _(""" Converts a points primitive to an OpenVDB level set. - """, + """), "layout:activator:usingVelocity", lambda node : node["useVelocity"].getValue(), @@ -53,45 +54,45 @@ "width" : { "description" : - """ + _(""" The name of a `float` primitive variable specifying the width of each point. The primitive variable may have either `Vertex` or `Constant` interpolation. If the primitive variable doesn't exist, a width of 1.0 is used. > Note : A point's width needs to be at least 3x `voxelSize` to contribute to > the level set. Smaller points will be ignored, and reported as a warning. - """ + """) }, "widthScale" : { "description" : - """ + _(""" An additional multiplier on the width of each point. - """ + """) }, "useVelocity" : { "description" : - """ + _(""" Enables the creation of trails behind the points, based on the `velocity` primitive variable. - """, + """), }, "velocity" : { "description" : - """ + _(""" The name of a `V3f` primitive variable specifying the velocity of each point. Velocity is specified in local-space units per second, and the trail is automatically scaled to represent the motion within a single frame. - """, + """), "layout:activator" : "usingVelocity", @@ -100,9 +101,9 @@ "velocityScale" : { "description" : - """ + _(""" An additional multiplier applied to the velocity of each point. - """, + """), "layout:activator" : "usingVelocity", @@ -111,27 +112,27 @@ "grid" : { "description" : - """ + _(""" Name of the level set grid to be created. - """ + """) }, "voxelSize" : { "description" : - """ + _(""" Size of a voxel in the level set grid, specified in local space. Smaller voxel sizes will increase resolution, but take more memory and computation time. - """ + """) }, "halfBandwidth" : { "description" : - """ + _(""" Defines the exterior and interior width of the level set in voxel units. - """ + """) }, diff --git a/python/GafferVDBUI/SphereLevelSetUI.py b/python/GafferVDBUI/SphereLevelSetUI.py index cf27ebe1f08..dbbdd4d04ad 100644 --- a/python/GafferVDBUI/SphereLevelSetUI.py +++ b/python/GafferVDBUI/SphereLevelSetUI.py @@ -36,60 +36,61 @@ import Gaffer import GafferVDB +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferVDB.SphereLevelSet, "description", - """ + _(""" Creates a sphere level set. - """, + """), plugs = { "grid" : { "description" : - """ + _(""" The name of the sphere levelset grid in the created VDB object. - """ + """) }, "radius" : { "description" : - """ + _(""" Sphere radius in object space units. - """ + """) }, "center" : { "description" : - """ + _(""" Local center of the sphere level set in object space. - """ + """) }, "voxelSize" : { "description" : - """ + _(""" Size of the voxels in the created sphere levelset. Smaller voxel results in more detail but higher memory usage. - """ + """) }, "halfWidth" : { "description" : - """ + _(""" Width of the signed distance field in voxels. - """ + """) }, diff --git a/python/GafferVDBUI/VolumeScatterUI.py b/python/GafferVDBUI/VolumeScatterUI.py index a437787b11c..9f5dab5f794 100644 --- a/python/GafferVDBUI/VolumeScatterUI.py +++ b/python/GafferVDBUI/VolumeScatterUI.py @@ -37,54 +37,55 @@ import Gaffer import GafferVDB +from GafferUI.i18n import _ Gaffer.Metadata.registerNode( GafferVDB.VolumeScatter, "description", - """ + _(""" Scatter points according the voxel values of a VDB grid. - """, + """), plugs = { "name" : { "description" : - """ + _(""" The name given to the PointsPrimitive - this will be placed under the location specified by "destination". - """, + """), }, "grid" : { "description" : - """ + _(""" Name of grid in VDBObject in which points will be scattered. - """, + """), }, "density" : { "description" : - """ + _(""" This density is multiplied with the value of the grid to produce a number of points per unit volume. - """, + """), }, "pointType" : { "description" : - """ + _(""" The render type of the points. This defaults to "gl:point" so that the points are rendered in a lightweight manner in the viewport. - """, + """), "preset:GL Point" : "gl:point", "preset:Particle" : "particle", @@ -100,7 +101,7 @@ "destination" : { "description" : - """ + _(""" The location where the points primitives will be placed in the output scene. When the destination is evaluated, the `${scene:path}` variable holds the location of the source mesh, so the default value parents the points @@ -108,16 +109,16 @@ > Tip : `${scene:path}/..` may be used to place the points alongside the > source mesh. - """, + """), }, "parent" : { "description" : - """ + _(""" This plug has been deprecated in favour of using a filter to select the volume. - """ + """) }, } diff --git a/startup/gui/language.py b/startup/gui/language.py new file mode 100644 index 00000000000..2e2acc81ece --- /dev/null +++ b/startup/gui/language.py @@ -0,0 +1,192 @@ +########################################################################## +# +# Language preferences for i18n. +# +# Adds a "Language" section to Preferences with: +# - UI language dropdown (English / Español) +# - "Use translated node names" checkbox +# - "Use translated tooltips" checkbox +# +# The effective language is persisted in ~/gaffer/i18n.json and read +# by GafferUI.i18n at import time (before the Preferences node exists). +# Changing the language requires a restart. +# +########################################################################## + +import functools + +import Gaffer +import GafferUI +from GafferUI.i18n import _ +from GafferUI import i18n as _i18n + +# --------------------------------------------------------------------------- +# Register preference plugs +# --------------------------------------------------------------------------- + +preferences = application.root()["preferences"] + +preferences["language"] = Gaffer.Plug() + +preferences["language"]["uiLanguage"] = Gaffer.StringPlug( + defaultValue = "en" +) +preferences["language"]["translateNodeNames"] = Gaffer.BoolPlug( + defaultValue = True +) +preferences["language"]["translateTooltips"] = Gaffer.BoolPlug( + defaultValue = True +) + +# Set current values from the i18n config that was already loaded +preferences["language"]["uiLanguage"].setValue( _i18n.language() ) +preferences["language"]["translateNodeNames"].setValue( _i18n.translateNodeNames() ) +preferences["language"]["translateTooltips"].setValue( _i18n.translateTooltips() ) + +# --------------------------------------------------------------------------- +# Metadata – layout section and widget types +# --------------------------------------------------------------------------- + +Gaffer.Metadata.registerValue( + preferences["language"], "plugValueWidget:type", + "GafferUI.LayoutPlugValueWidget", persistent = False +) +Gaffer.Metadata.registerValue( + preferences["language"], "layout:section", + _( "Language" ), persistent = False +) + +# UI language dropdown via presets +Gaffer.Metadata.registerValue( + preferences["language"]["uiLanguage"], "plugValueWidget:type", + "GafferUI.PresetsPlugValueWidget", persistent = False +) +Gaffer.Metadata.registerValue( + preferences["language"]["uiLanguage"], "label", + "UI Language", persistent = False +) +Gaffer.Metadata.registerValue( + preferences["language"]["uiLanguage"], "preset:English (en)", "en", + persistent = False +) +Gaffer.Metadata.registerValue( + preferences["language"]["uiLanguage"], "preset:Español (es)", "es", + persistent = False +) + +Gaffer.Metadata.registerValue( + preferences["language"]["translateNodeNames"], "label", + "Use Translated Node Names", persistent = False +) +Gaffer.Metadata.registerValue( + preferences["language"]["translateTooltips"], "label", + "Use Translated Tooltips", persistent = False +) + +# --------------------------------------------------------------------------- +# Save hook – persist to i18n.json alongside normal preferences +# --------------------------------------------------------------------------- + +__initialising = True + +def __languagePlugDirtied( plug ) : + + global __initialising + if __initialising : + return + + if plug.parent() != preferences["language"] : + return + if plug.getName() not in ( "uiLanguage", "translateNodeNames", "translateTooltips" ) : + return + + lang = preferences["language"]["uiLanguage"].getValue() + nodeNames = preferences["language"]["translateNodeNames"].getValue() + tooltips = preferences["language"]["translateTooltips"].getValue() + + _i18n.saveConf( lang, nodeNames, tooltips ) + + # Show restart dialog when the language itself changes + if plug.getName() == "uiLanguage" and lang != _i18n.language() : + scriptWindow = GafferUI.ScriptWindow.acquire( application.root()["scripts"].children()[0] ) if len( application.root()["scripts"].children() ) else None + dialogue = GafferUI.Dialogue( _( "Language Changed" ) ) + dialogue._setWidget( + GafferUI.Label( + _( "The language change will take effect after restarting Gaffer." ) + ) + ) + closeButton = dialogue._addButton( _( "OK" ) ) + closeButton.clickedSignal().connect( + lambda button : button.ancestor( GafferUI.Window ).setVisible( False ) + ) + if scriptWindow is not None : + scriptWindow.addChildWindow( dialogue ) + dialogue.setVisible( True ) + +preferences.plugDirtiedSignal().connect( + __languagePlugDirtied +) + +__initialising = False + +# --------------------------------------------------------------------------- +# Translate nodule (port) labels on graph node gadgets +# --------------------------------------------------------------------------- +# NoduleLayout (C++) reads "noduleLayout:label" metadata at construction time. +# We register a callable for EVERY specific plug type so the translated label +# is returned when NoduleLayout first queries metadata during gadget creation. + +if _i18n.translateNodeNames() : + + import IECore + + def __translatedNoduleLabel( plug ) : + return _i18n.translateLabel( IECore.CamelCase.toSpaced( plug.getName() ) ) + + # Register for all concrete Gaffer plug types + __plugTypes = [ + Gaffer.Plug, + Gaffer.ValuePlug, + Gaffer.BoolPlug, + Gaffer.IntPlug, + Gaffer.FloatPlug, + Gaffer.StringPlug, + Gaffer.V2fPlug, + Gaffer.V2iPlug, + Gaffer.V3fPlug, + Gaffer.V3iPlug, + Gaffer.Color3fPlug, + Gaffer.Color4fPlug, + Gaffer.Box2fPlug, + Gaffer.Box2iPlug, + Gaffer.Box3fPlug, + Gaffer.Box3iPlug, + Gaffer.M44fPlug, + Gaffer.SplinefColor3fPlug, + Gaffer.SplinefColor4fPlug, + Gaffer.SplineffPlug, + Gaffer.CompoundDataPlug, + Gaffer.CompoundObjectPlug, + ] + + # Also register for scene/image/dispatch plug types if available + for __modName in ( "GafferScene", "GafferImage", "GafferDispatch" ) : + try : + __mod = __import__( __modName ) + for __attr in dir( __mod ) : + __obj = getattr( __mod, __attr, None ) + if isinstance( __obj, type ) and issubclass( __obj, Gaffer.Plug ) : + __plugTypes.append( __obj ) + except ImportError : + pass + + __registered = 0 + __errors = [] + for __plugType in __plugTypes : + try : + Gaffer.Metadata.registerValue( + __plugType.staticTypeId(), "noduleLayout:label", __translatedNoduleLabel + ) + __registered += 1 + except Exception as __e : + __errors.append( "%s: %s" % ( __plugType.__name__, __e ) ) diff --git a/startup/gui/lightEditor.py b/startup/gui/lightEditor.py index 25eb9aad03b..5b6d33b0901 100644 --- a/startup/gui/lightEditor.py +++ b/startup/gui/lightEditor.py @@ -40,6 +40,7 @@ import IECore import Gaffer import GafferSceneUI +from GafferUI.i18n import _ # UsdLux lights @@ -480,10 +481,23 @@ # Register transform columns +_spaceLabels = { + GafferSceneUI.Private.TransformInspector.Space.Local : "Local", + GafferSceneUI.Private.TransformInspector.Space.World : "World", +} + +_componentLabels = { + GafferSceneUI.Private.TransformInspector.Component.Translate : "Translate", + GafferSceneUI.Private.TransformInspector.Component.Rotate : "Rotate", + GafferSceneUI.Private.TransformInspector.Component.Scale : "Scale", + GafferSceneUI.Private.TransformInspector.Component.Shear : "Shear", +} + def transformColumn( scene, editScope, space, component ) : inspector = GafferSceneUI.Private.TransformInspector( scene, editScope, space, component ) - return GafferSceneUI.Private.InspectorColumn( inspector ) + displayName = _( "{} {}".format( _spaceLabels[space], _componentLabels[component] ) ) + return GafferSceneUI.Private.InspectorColumn( inspector, displayName ) for space in GafferSceneUI.Private.TransformInspector.Space.values.values() : for component in GafferSceneUI.Private.TransformInspector.Component.values.values() : diff --git a/startup/gui/menus.py b/startup/gui/menus.py index 4db8f037afb..c529271a8c8 100644 --- a/startup/gui/menus.py +++ b/startup/gui/menus.py @@ -122,17 +122,17 @@ def addHelpMenuItems( items ) : GafferArnoldUI.ShaderMenu.appendShaders( nodeMenu.definition() ) - nodeMenu.append( "/Arnold/Globals/Options", GafferArnold.ArnoldOptions, searchText = "ArnoldOptions" ) + nodeMenu.append( "/Arnold/Globals/Arnold Options", GafferArnold.ArnoldOptions, searchText = "ArnoldOptions" ) nodeMenu.append( "/Arnold/Globals/Atmosphere", GafferArnold.ArnoldAtmosphere, searchText = "ArnoldAtmosphere" ) - nodeMenu.append( "/Arnold/Globals/Background", GafferArnold.ArnoldBackground, searchText = "ArnoldBackground" ) + nodeMenu.append( "/Arnold/Globals/Arnold Background", GafferArnold.ArnoldBackground, searchText = "ArnoldBackground" ) nodeMenu.append( "/Arnold/Globals/AOVShader", GafferArnold.ArnoldAOVShader, searchText = "ArnoldAOVShader" ) nodeMenu.append( "/Arnold/Globals/Imager", GafferArnold.ArnoldImager, searchText = "ArnoldImager" ) nodeMenu.append( "/Arnold/Displacement", GafferArnold.ArnoldDisplacement, searchText = "ArnoldDisplacement" ) nodeMenu.append( "/Arnold/CameraShaders", GafferArnold.ArnoldCameraShaders, searchText = "ArnoldCameraShaders" ) nodeMenu.append( "/Arnold/VDB", GafferArnold.ArnoldVDB, searchText = "ArnoldVDB" ) nodeMenu.append( "/Arnold/Procedural", GafferArnold.ArnoldProcedural, searchText = "ArnoldProcedural" ) - nodeMenu.append( "/Arnold/Attributes", GafferArnold.ArnoldAttributes, searchText = "ArnoldAttributes" ) - nodeMenu.append( "/Arnold/Shader Ball", GafferArnold.ArnoldShaderBall, searchText = "ArnoldShaderBall" ) + nodeMenu.append( "/Arnold/Arnold Attributes", GafferArnold.ArnoldAttributes, searchText = "ArnoldAttributes" ) + nodeMenu.append( "/Arnold/Arnold Shader Ball", GafferArnold.ArnoldShaderBall, searchText = "ArnoldShaderBall" ) nodeMenu.append( "/Arnold/Arnold Texture Bake", GafferArnold.ArnoldTextureBake, searchText = "ArnoldTextureBake" ) GafferArnoldUI.CacheMenu.appendDefinitions( scriptWindowMenu, "/Tools/Arnold" ) @@ -196,8 +196,8 @@ def __lightCreator( nodeName, shaderName, shape ) : searchText = "dl" + label ) - nodeMenu.append( "/3Delight/Attributes", GafferDelight.DelightAttributes, searchText = "DelightAttributes" ) - nodeMenu.append( "/3Delight/Options", GafferDelight.DelightOptions, searchText = "DelightOptions" ) + nodeMenu.append( "/3Delight/Delight Attributes", GafferDelight.DelightAttributes, searchText = "DelightAttributes" ) + nodeMenu.append( "/3Delight/Delight Options", GafferDelight.DelightOptions, searchText = "DelightOptions" ) except Exception as m : @@ -217,10 +217,10 @@ def __lightCreator( nodeName, shaderName, shape ) : GafferCyclesUI.ShaderMenu.appendShaders( nodeMenu.definition() ) - nodeMenu.append( "/Cycles/Globals/Options", GafferCycles.CyclesOptions, searchText = "CyclesOptions" ) - nodeMenu.append( "/Cycles/Globals/Background", GafferCycles.CyclesBackground, searchText = "CyclesBackground" ) - nodeMenu.append( "/Cycles/Attributes", GafferCycles.CyclesAttributes, searchText = "CyclesAttributes" ) - nodeMenu.append( "/Cycles/Shader Ball", GafferCycles.CyclesShaderBall, searchText = "CyclesShaderBall" ) + nodeMenu.append( "/Cycles/Globals/Cycles Options", GafferCycles.CyclesOptions, searchText = "CyclesOptions" ) + nodeMenu.append( "/Cycles/Globals/Cycles Background", GafferCycles.CyclesBackground, searchText = "CyclesBackground" ) + nodeMenu.append( "/Cycles/Cycles Attributes", GafferCycles.CyclesAttributes, searchText = "CyclesAttributes" ) + nodeMenu.append( "/Cycles/Cycles Shader Ball", GafferCycles.CyclesShaderBall, searchText = "CyclesShaderBall" ) except Exception as m : @@ -241,9 +241,9 @@ def __lightCreator( nodeName, shaderName, shape ) : GafferRenderManUI.RenderManShaderUI.appendShaders( nodeMenu.definition() ) - nodeMenu.append( "/RenderMan/Attributes", GafferRenderMan.RenderManAttributes, searchText = "RenderManAttributes" ) + nodeMenu.append( "/RenderMan/RenderMan Attributes", GafferRenderMan.RenderManAttributes, searchText = "RenderManAttributes" ) nodeMenu.append( "/RenderMan/Integrator", GafferRenderMan.RenderManIntegrator, searchText = "RenderManIntegrator" ) - nodeMenu.append( "/RenderMan/Options", GafferRenderMan.RenderManOptions, searchText = "RenderManOptions" ) + nodeMenu.append( "/RenderMan/RenderMan Options", GafferRenderMan.RenderManOptions, searchText = "RenderManOptions" ) nodeMenu.append( "/RenderMan/Display Filter", GafferRenderMan.RenderManDisplayFilter, searchText = "RenderManDisplayFilter" ) nodeMenu.append( "/RenderMan/Sample Filter", GafferRenderMan.RenderManSampleFilter, searchText = "RenderManSampleFilter" ) @@ -254,8 +254,8 @@ def __lightCreator( nodeName, shaderName, shape ) : # Scene nodes -nodeMenu.append( "/Scene/File/Reader", GafferScene.SceneReader, searchText = "SceneReader" ) -nodeMenu.append( "/Scene/File/Writer", GafferScene.SceneWriter, searchText = "SceneWriter" ) +nodeMenu.append( "/Scene/File/Scene Reader", GafferScene.SceneReader, searchText = "SceneReader" ) +nodeMenu.append( "/Scene/File/Scene Writer", GafferScene.SceneWriter, searchText = "SceneWriter" ) nodeMenu.append( "/Scene/Source/Object To Scene", GafferScene.ObjectToScene, searchText = "ObjectToScene" ) nodeMenu.append( "/Scene/Source/Image To Points", GafferScene.ImageToPoints, searchText = "ImageToPoints" ) nodeMenu.append( "/Scene/Source/Image Scatter", GafferScene.ImageScatter, searchText = "ImageScatter" ) @@ -267,7 +267,7 @@ def __lightCreator( nodeName, shaderName, shape ) : nodeMenu.append( "/Scene/Source/Primitive/Cube", GafferScene.Cube ) nodeMenu.append( "/Scene/Source/Primitive/Plane", GafferScene.Plane ) nodeMenu.append( "/Scene/Source/Primitive/Sphere", GafferScene.Sphere ) -nodeMenu.append( "/Scene/Source/Primitive/Text", GafferScene.Text ) +nodeMenu.append( "/Scene/Source/Primitive/Text 3D", GafferScene.Text ) nodeMenu.append( "/Scene/Source/Scatter", GafferScene.Scatter ) nodeMenu.append( "/Scene/Source/Instancer", GafferScene.Instancer ) nodeMenu.append( "/Scene/Source/MotionPath", GafferScene.MotionPath ) @@ -321,16 +321,16 @@ def __lightCreator( nodeName, shaderName, shape ) : nodeMenu.append( "/Scene/Filters/Union Filter", GafferScene.UnionFilter, searchText = "UnionFilter" ) nodeMenu.append( "/Scene/Hierarchy/Group", GafferScene.Group ) nodeMenu.append( "/Scene/Hierarchy/Parent", GafferScene.Parent ) -nodeMenu.append( "/Scene/Hierarchy/Merge", GafferScene.MergeScenes, searchText = "MergeScenes" ) +nodeMenu.append( "/Scene/Hierarchy/Merge Scenes", GafferScene.MergeScenes, searchText = "MergeScenes" ) nodeMenu.append( "/Scene/Hierarchy/Duplicate", GafferScene.Duplicate ) nodeMenu.append( "/Scene/Hierarchy/SubTree", GafferScene.SubTree ) #\todo - rename to 'Subtree' (node needs to change too) nodeMenu.append( "/Scene/Hierarchy/Prune", GafferScene.Prune ) nodeMenu.append( "/Scene/Hierarchy/Isolate", GafferScene.Isolate ) -nodeMenu.append( "/Scene/Hierarchy/Collect", GafferScene.CollectScenes, searchText = "CollectScenes" ) +nodeMenu.append( "/Scene/Hierarchy/Collect Scenes", GafferScene.CollectScenes, searchText = "CollectScenes" ) nodeMenu.append( "/Scene/Hierarchy/Encapsulate", GafferScene.Encapsulate ) nodeMenu.append( "/Scene/Hierarchy/Unencapsulate", GafferScene.Unencapsulate ) nodeMenu.append( "/Scene/Hierarchy/Rename", GafferScene.Rename ) -nodeMenu.append( "/Scene/Transform/Transform", GafferScene.Transform ) +nodeMenu.append( "/Scene/Transform/Scene Transform", GafferScene.Transform ) nodeMenu.append( "/Scene/Transform/Freeze Transform", GafferScene.FreezeTransform, searchText = "FreezeTransform" ) nodeMenu.append( "/Scene/Transform/Point Constraint", GafferScene.PointConstraint, searchText = "PointConstraint" ) nodeMenu.append( "/Scene/Transform/Aim Constraint", GafferScene.AimConstraint, searchText = "AimConstraint" ) @@ -348,7 +348,7 @@ def __lightCreator( nodeName, shaderName, shape ) : nodeMenu.append( "/Scene/Globals/Option Tweaks", GafferScene.OptionTweaks, searchText = "OptionTweaks" ) nodeMenu.append( "/Scene/Globals/Set", GafferScene.Set ) nodeMenu.append( "/Scene/Globals/Set Visualiser", GafferScene.SetVisualiser, searchText = "SetVisualiser" ) -nodeMenu.append( "/Scene/OpenGL/Attributes", GafferScene.OpenGLAttributes, searchText = "OpenGLAttributes" ) +nodeMenu.append( "/Scene/OpenGL/OpenGL Attributes", GafferScene.OpenGLAttributes, searchText = "OpenGLAttributes" ) nodeMenu.definition().append( "/Scene/OpenGL/Shader", { "subMenu" : GafferSceneUI.OpenGLShaderUI.shaderSubMenu } ) nodeMenu.append( "/Scene/Utility/Filter Query", GafferScene.FilterQuery, searchText = "FilterQuery" ) nodeMenu.append( "/Scene/Utility/Transform Query", GafferScene.TransformQuery, searchText = "TransformQuery" ) @@ -384,10 +384,10 @@ def __contactSheetCreateCommand( menu ) : return result -nodeMenu.append( "/Image/File/Reader", GafferImage.ImageReader, searchText = "ImageReader" ) -nodeMenu.append( "/Image/File/Writer", GafferImage.ImageWriter, searchText = "ImageWriter" ) +nodeMenu.append( "/Image/File/Image Reader", GafferImage.ImageReader, searchText = "ImageReader" ) +nodeMenu.append( "/Image/File/Image Writer", GafferImage.ImageWriter, searchText = "ImageWriter" ) nodeMenu.append( "/Image/Shape/Rectangle", GafferImage.Rectangle, postCreator = GafferImageUI.RectangleUI.postCreate ) -nodeMenu.append( "/Image/Shape/Text", GafferImage.Text, postCreator = GafferImageUI.TextUI.postCreate ) +nodeMenu.append( "/Image/Shape/Text 2D", GafferImage.Text, postCreator = GafferImageUI.TextUI.postCreate ) nodeMenu.append( "/Image/Pattern/Constant", GafferImage.Constant ) nodeMenu.append( "/Image/Pattern/Checkerboard", GafferImageUI.CheckerboardUI.nodeMenuCreateCommand ) nodeMenu.append( "/Image/Pattern/Ramp", GafferImage.Ramp, postCreator = GafferImageUI.RampUI.postCreate) @@ -412,7 +412,7 @@ def __contactSheetCreateCommand( menu ) : nodeMenu.append( "/Image/Merge/Merge", GafferImage.Merge ) nodeMenu.append( "/Image/Merge/Mix", GafferImage.Mix ) nodeMenu.append( "/Image/Transform/Resize", GafferImage.Resize ) -nodeMenu.append( "/Image/Transform/Transform", GafferImage.ImageTransform, searchText = "ImageTransform" ) +nodeMenu.append( "/Image/Transform/Image Transform", GafferImage.ImageTransform, searchText = "ImageTransform" ) nodeMenu.append( "/Image/Transform/Crop", GafferImage.Crop, postCreator = GafferImageUI.CropUI.postCreate ) nodeMenu.append( "/Image/Transform/Offset", GafferImage.Offset ) nodeMenu.append( "/Image/Transform/Mirror", GafferImage.Mirror ) @@ -420,7 +420,7 @@ def __contactSheetCreateCommand( menu ) : nodeMenu.append( "/Image/Channels/Shuffle", GafferImage.Shuffle, searchText = "Shuffle" ) nodeMenu.append( "/Image/Channels/Copy", GafferImage.CopyChannels, searchText = "CopyChannels" ) nodeMenu.append( "/Image/Channels/Delete", GafferImage.DeleteChannels, searchText = "DeleteChannels" ) -nodeMenu.append( "/Image/Channels/Collect", GafferImage.CollectImages, searchText = "CollectImages" ) +nodeMenu.append( "/Image/Channels/Collect Images", GafferImage.CollectImages, searchText = "CollectImages" ) nodeMenu.append( "/Image/Utility/Metadata", GafferImage.ImageMetadata, searchText = "ImageMetadata" ) nodeMenu.append( "/Image/Utility/Delete Metadata", GafferImage.DeleteImageMetadata, searchText = "DeleteImageMetadata" ) nodeMenu.append( "/Image/Utility/Copy Metadata", GafferImage.CopyImageMetadata, searchText = "CopyImageMetadata" ) @@ -434,7 +434,7 @@ def __contactSheetCreateCommand( menu ) : nodeMenu.append( "/Image/Utility/DataWindowQuery", GafferImage.DataWindowQuery ) nodeMenu.append( "/Image/Utility/OpenColorIO Context", GafferImage.OpenColorIOContext, searchText = "OpenColorIOContext" ) nodeMenu.append( "/Image/Deep/FlatToDeep", GafferImage.FlatToDeep, searchText = "FlatToDeep" ) -nodeMenu.append( "/Image/Deep/Merge", GafferImage.DeepMerge, searchText = "DeepMerge" ) +nodeMenu.append( "/Image/Deep/Deep Merge", GafferImage.DeepMerge, searchText = "DeepMerge" ) nodeMenu.append( "/Image/Deep/Tidy", GafferImage.DeepTidy, searchText = "DeepTidy" ) nodeMenu.append( "/Image/Deep/DeepToFlat", GafferImage.DeepToFlat ) nodeMenu.append( "/Image/Deep/Sample Counts", GafferImage.DeepSampleCounts, searchText = "DeepSampleCounts" ) @@ -543,7 +543,7 @@ def __usdLightCreator( lightType ) : ] : nodeMenu.append( "/USD/Light/{}".format( IECore.CamelCase.toSpaced( lightType ) ), functools.partial( __usdLightCreator, lightType ), searchText = lightType ) -nodeMenu.append( "/USD/Attributes", GafferUSD.USDAttributes, searchText = "USDAttributes" ) +nodeMenu.append( "/USD/USD Attributes", GafferUSD.USDAttributes, searchText = "USDAttributes" ) nodeMenu.append( "/USD/Layer Writer", GafferUSD.USDLayerWriter, searchText = "USDLayerWriter" ) nodeMenu.append( "/USD/Promote Instances", GafferUSD.PromotePointInstances, searchText = "PromotePointInstances" )