summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/app_settings/settings.xml88
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl67
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl113
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl79
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl165
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl3
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl64
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/giF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/giV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl137
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl232
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl108
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl133
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/skyF.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/skyV.glsl140
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl318
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl234
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl123
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/highlightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/highlightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/transportF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl125
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl74
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl244
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl307
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl245
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl202
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl241
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/blurF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/blurV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/extractF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/simpleF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/waterF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl6
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl5
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/shinyV.glsl10
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/simpleV.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/skyF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/skyV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/transportF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/treeF.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl2
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl2
-rw-r--r--indra/newview/featuretable.txt1
-rw-r--r--indra/newview/featuretable_mac.txt27
-rw-r--r--indra/newview/featuretable_xp.txt1
-rw-r--r--indra/newview/groupchatlistener.cpp21
-rw-r--r--indra/newview/groupchatlistener.h21
-rw-r--r--indra/newview/llaccountingquotamanager.cpp98
-rw-r--r--indra/newview/llassetuploadresponders.cpp12
-rw-r--r--indra/newview/lldrawable.cpp12
-rw-r--r--indra/newview/lldrawable.h1
-rw-r--r--indra/newview/lldrawpool.cpp53
-rw-r--r--indra/newview/lldrawpool.h4
-rw-r--r--indra/newview/lldrawpoolalpha.cpp155
-rw-r--r--indra/newview/lldrawpoolavatar.cpp28
-rw-r--r--indra/newview/lldrawpoolbump.cpp102
-rw-r--r--indra/newview/lldrawpoolbump.h2
-rw-r--r--indra/newview/lldrawpoolsimple.cpp114
-rw-r--r--indra/newview/lldrawpoolsimple.h14
-rw-r--r--indra/newview/lldrawpooltree.cpp4
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp91
-rw-r--r--indra/newview/lldrawpoolwlsky.h8
-rw-r--r--indra/newview/llface.cpp154
-rw-r--r--indra/newview/llface.h3
-rw-r--r--indra/newview/llfloaterbuyland.cpp18
-rw-r--r--indra/newview/llfloatermodelpreview.cpp53
-rw-r--r--indra/newview/llfloatermodelpreview.h2
-rwxr-xr-xindra/newview/llmeshrepository.cpp7895
-rw-r--r--indra/newview/llmeshrepository.h5
-rw-r--r--indra/newview/llpanelobject.cpp14
-rw-r--r--indra/newview/llspatialpartition.cpp112
-rw-r--r--indra/newview/llspatialpartition.h8
-rw-r--r--indra/newview/llviewercontrol.cpp34
-rw-r--r--indra/newview/llviewerdisplay.cpp3
-rw-r--r--indra/newview/llviewermessage.cpp8
-rw-r--r--indra/newview/llviewerobject.cpp2
-rw-r--r--indra/newview/llviewerobjectlist.cpp22
-rw-r--r--indra/newview/llviewerobjectlist.h3
-rw-r--r--indra/newview/llviewerparcelmgr.cpp6
-rw-r--r--indra/newview/llviewerprecompiledheaders.h4
-rw-r--r--indra/newview/llviewerregion.cpp5
-rw-r--r--indra/newview/llviewershadermgr.cpp477
-rw-r--r--indra/newview/llviewershadermgr.h15
-rw-r--r--indra/newview/llviewertexturelist.cpp4
-rw-r--r--indra/newview/llvoavatar.cpp2
-rw-r--r--indra/newview/llvocache.cpp6
-rw-r--r--indra/newview/llvoclouds.cpp4
-rw-r--r--indra/newview/llvopartgroup.cpp13
-rw-r--r--indra/newview/llvosky.cpp2
-rw-r--r--indra/newview/llvosurfacepatch.cpp2
-rw-r--r--indra/newview/llvotree.cpp5
-rw-r--r--indra/newview/llvovolume.cpp285
-rw-r--r--indra/newview/pipeline.cpp167
-rw-r--r--indra/newview/pipeline.h8
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_land.xml29
-rw-r--r--indra/newview/skins/default/xui/de/floater_postcard.xml78
-rw-r--r--indra/newview/skins/default/xui/de/floater_sell_land.xml18
-rw-r--r--indra/newview/skins/default/xui/de/floater_top_objects.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_water.xml3
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_notices.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_land.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_preview.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_sell_land.xml30
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_top_objects.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml2
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml150
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml968
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_land.xml10
-rw-r--r--indra/newview/skins/default/xui/es/floater_postcard.xml20
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_report_abuse.xml206
-rw-r--r--indra/newview/skins/default/xui/es/floater_sell_land.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_top_objects.xml13
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml5904
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_general.xml116
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_general.xml146
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_covenant.xml166
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml8692
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_postcard.xml79
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sell_land.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_land.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_sell_land.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_water.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_windlight_options.xml3
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_notices.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_notices.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_notices.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_build_options.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_land.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_image_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture.xml149
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sell_land.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/floater_top_objects.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_water.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_windlight_options.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_notices.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/zh/floater_aaa.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about.xml84
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about_land.xml478
-rw-r--r--indra/newview/skins/default/xui/zh/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_animation_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/zh/floater_auction.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_avatar_picker.xml53
-rw-r--r--indra/newview/skins/default/xui/zh/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/zh/floater_beacons.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/floater_build_options.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_bulk_perms.xml45
-rw-r--r--indra/newview/skins/default/xui/zh/floater_bumps.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_currency.xml66
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_land.xml233
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_object.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/floater_camera.xml65
-rw-r--r--indra/newview/skins/default/xui/zh/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_color_picker.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_critical.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml95
-rw-r--r--indra/newview/skins/default/xui/zh/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_env_settings.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/floater_event.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_gesture.xml26
-rw-r--r--indra/newview/skins/default/xui/zh/floater_god_tools.xml96
-rw-r--r--indra/newview/skins/default/xui/zh/floater_hardware_settings.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/floater_help_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_im_session.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_image_preview.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inspect.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml67
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/floater_joystick.xml79
-rw-r--r--indra/newview/skins/default/xui/zh/floater_lagmeter.xml151
-rw-r--r--indra/newview/skins/default/xui/zh/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_map.xml36
-rw-r--r--indra/newview/skins/default/xui/zh/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_moveview.xml75
-rw-r--r--indra/newview/skins/default/xui/zh/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_notification.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_notifications_console.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pay_object.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/zh/floater_postcard.xml33
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preferences.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_gesture.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_notecard.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_sound.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_texture.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/floater_publish_classified.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_report_abuse.xml94
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_preview.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_queue.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_search.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/zh/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/floater_snapshot.xml74
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_telehub.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/zh/floater_tools.xml499
-rw-r--r--indra/newview/skins/default/xui/zh/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/zh/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_effect.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/zh/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_windlight_options.xml167
-rw-r--r--indra/newview/skins/default/xui/zh/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/floater_world_map.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_group.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_object.xml44
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_remote_object.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/menu_gesture_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory.xml87
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory_add.xml34
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_login.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_place.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_viewer.xml430
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/notifications.xml2952
-rw-r--r--indra/newview/skins/default/xui/zh/panel_active_object_row.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bottomtray.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_classified_info.xml67
-rw-r--r--indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_classified.xml54
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pick.xml37
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shape.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_wearable.xml120
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_general.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_invite.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_land_money.xml85
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_notices.xml61
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_roles.xml95
-rw-r--r--indra/newview/skins/default/xui/zh/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_instant_message.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_landmark_info.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_landmarks.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/panel_login.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_my_profile.xml42
-rw-r--r--indra/newview/skins/default/xui/zh/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_nearby_media.xml70
-rw-r--r--indra/newview/skins/default/xui/zh/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/zh/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfit_edit.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml23
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_list.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_people.xml94
-rw-r--r--indra/newview/skins/default/xui/zh/panel_pick_info.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/panel_picks.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_place_profile.xml116
-rw-r--r--indra/newview/skins/default/xui/zh/panel_places.xml48
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_chat.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_colors.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_general.xml74
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml102
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_setup.xml49
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_sound.xml62
-rw-r--r--indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml91
-rw-r--r--indra/newview/skins/default/xui/zh/panel_profile.xml67
-rw-r--r--indra/newview/skins/default/xui/zh/panel_profile_view.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_covenant.xml79
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_debug.xml34
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_estate.xml52
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_general.xml43
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_terrain.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_texture.xml54
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_ed.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_status_bar.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/panel_teleport_history.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/panel_world_map.xml63
-rw-r--r--indra/newview/skins/default/xui/zh/role_actions.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_appearance.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_item_info.xml76
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_task_info.xml123
-rw-r--r--indra/newview/skins/default/xui/zh/strings.xml4454
-rw-r--r--indra/newview/skins/default/xui/zh/teleport_strings.xml80
630 files changed, 35586 insertions, 13495 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 78db307d64..b7ba9e3607 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -7091,7 +7091,76 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>RenderAnisotropic</key>
+
+ <key>OctreeMaxNodeCapacity</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of elements to store in a single octree node</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>128</integer>
+ </map>
+
+ <key>OctreeStaticObjectSizeFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on static object size for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+
+ <key>OctreeAlphaDistanceFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on alpha object distance for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.1</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ </array>
+ </map>
+
+ <key>OctreeAttachmentSizeFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on attachment size for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+
+ <key>OctreeDistanceFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on distance for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.01</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ </array>
+ </map>
+
+ <key>RenderAnisotropic</key>
<map>
<key>Comment</key>
<string>Render textures using anisotropic filtering</string>
@@ -7188,7 +7257,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>1.0</integer>
+ <real>1.0</real>
</map>
<key>RenderAvatarVP</key>
<map>
@@ -7444,6 +7513,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderMaxTextureIndex</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum texture index to use for indexed texture rendering.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>6</integer>
+ </map>
<key>RenderDebugTextureBind</key>
<map>
<key>Comment</key>
@@ -8589,7 +8669,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>8192</integer>
+ <integer>65536</integer>
</map>
<key>RenderMaxVBOSize</key>
<map>
@@ -8942,7 +9022,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>RenderUseStreamVBO</key>
<map>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
index 3f6b8b3323..b0fa0ddd3e 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void default_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
index 1ad87badfe..d9f29ced4f 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
attribute vec4 weight; //1
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
index a15846f192..2796222c68 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
index 05fe100372..d86ef19a04 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void default_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
index 4b8a7604a1..2eb814bd91 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index ef823c28b1..7613e50dca 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
attribute vec4 object_weight;
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
index 27ac59a840..2638351e96 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
index f1aa549a47..86b189b282 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
index 3b12a07a27..4a0815a163 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -5,13 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2D diffuseMap;
uniform sampler2DRect depthMap;
+vec4 diffuseLookup(vec2 texcoord);
+
uniform mat4 shadow_matrix[6];
uniform vec4 shadow_clip;
uniform vec2 screen_res;
@@ -47,7 +48,7 @@ void main()
vec4 pos = vec4(vary_position, 1.0);
- vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 diff= diffuseLookup(gl_TexCoord[0].xy);
vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a);
vec4 color = diff * col;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
new file mode 100644
index 0000000000..b0d029dbf4
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
@@ -0,0 +1,67 @@
+/**
+ * @file alphaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+
+uniform sampler2DRect depthMap;
+uniform sampler2D diffuseMap;
+
+
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform vec2 screen_res;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+varying vec3 vary_ambient;
+varying vec3 vary_directional;
+varying vec3 vary_fragcoord;
+varying vec3 vary_position;
+varying vec3 vary_pointlight_col;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(vec2 pos_screen)
+{
+ float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+ frag *= screen_res;
+
+ vec4 pos = vec4(vary_position, 1.0);
+
+ vec4 diff= texture2D(diffuseMap,gl_TexCoord[0].xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ gl_FragColor = color;
+ //gl_FragColor = vec4(1,0,1,1);
+ //gl_FragColor = vec4(1,0,1,1)*shadow;
+
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
index 5addbbb176..ac3f7189c2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getObjectSkinnedTransform();
@@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
index 525b68c437..44cb78e914 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -23,6 +23,7 @@ varying vec3 vary_fragcoord;
varying vec3 vary_position;
varying vec3 vary_light;
varying vec3 vary_pointlight_col;
+varying float vary_texture_index;
uniform float near_clip;
uniform float shadow_offset;
@@ -36,19 +37,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
@@ -56,11 +62,13 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 vert = vec4(gl_Vertex.xyz, 1.0);
+ vary_texture_index = gl_Vertex.w;
+ gl_Position = gl_ModelViewProjectionMatrix * vert;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
+ vec4 pos = (gl_ModelViewMatrix * vert);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
@@ -97,7 +105,7 @@ void main()
gl_FogFragCoord = pos.z;
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ pos = gl_ModelViewProjectionMatrix * vert;
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
index 164322c3a7..870d593311 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
index 5ae41cb730..c7a4f86727 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
mat4 getObjectSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
index a2a7dea20d..68e4055cf2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
new file mode 100644
index 0000000000..7bc78fe407
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
@@ -0,0 +1,21 @@
+/**
+ * @file avatarEyesV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+varying vec3 vary_normal;
+
+void main()
+{
+ //transform vertex
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+
+ gl_FrontColor = gl_Color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
index 9748727147..3268618093 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
index 1b7ae06888..78986ab12e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
@@ -5,14 +5,17 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
+varying vec4 post_pos;
void main()
{
//gl_FragColor = vec4(1,1,1,gl_Color.a * texture2D(diffuseMap, gl_TexCoord[0].xy).a);
gl_FragColor = vec4(1,1,1,1);
+
+ gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
index cf6579a40d..f177fcd8f1 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
@@ -5,12 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
+
mat4 getSkinnedTransform();
attribute vec4 weight;
+varying vec4 post_pos;
+
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
@@ -30,8 +32,9 @@ void main()
norm = normalize(norm);
pos = gl_ProjectionMatrix * pos;
- pos.z = max(pos.z, -pos.w+0.01);
- gl_Position = pos;
+ post_pos = pos;
+
+ gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
gl_FrontColor = gl_Color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
index 69c93799b5..7eac11287a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
index d9f021b114..8c75c8045a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -26,7 +26,7 @@ uniform vec2 screen_res;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -39,7 +39,7 @@ vec4 getPosition(vec2 pos_screen)
void main()
{
- vec2 tc = vary_fragcoord.xy;
+ vec2 tc = vary_fragcoord.xy;
vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
vec3 pos = getPosition(tc).xyz;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl
new file mode 100644
index 0000000000..6ca51377c1
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl
@@ -0,0 +1,113 @@
+/**
+ * @file blurLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2DRect lightMap;
+
+uniform float dist_factor;
+uniform float blur_size;
+uniform vec2 delta;
+uniform vec3 kern[4];
+uniform float kern_scale;
+
+varying vec2 vary_fragcoord;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+vec3 texture2DMS3(sampler2DMS tex, ivec2 tc)
+{
+ vec3 ret = vec3(0,0,0);
+ for (int i = 0; i < samples; i++)
+ {
+ ret += texelFetch(tex, tc, i).rgb;
+ }
+
+ return ret/samples;
+}
+
+float texture2DMS1(sampler2DMS tex, ivec2 tc)
+{
+ float ret = 0;
+ for (int i = 0; i < samples; i++)
+ {
+ ret += texelFetch(tex, tc, i).r;
+ }
+
+ return ret/samples;
+}
+
+vec4 getPosition(ivec2 pos_screen)
+{
+ float depth = texture2DMS1(depthMap, pos_screen.xy);
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec2 tc = vary_fragcoord.xy;
+ ivec2 itc = ivec2(tc);
+
+ vec3 norm = texture2DMS3(normalMap, itc).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ vec3 pos = getPosition(itc).xyz;
+ vec4 ccol = texture2DRect(lightMap, tc).rgba;
+
+ vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy);
+ dlt /= max(-pos.z*dist_factor, 1.0);
+
+ vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
+ vec4 col = defined_weight.xyxx * ccol;
+
+ // relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances
+ float pointplanedist_tolerance_pow2 = pos.z*pos.z*0.00005;
+
+ // perturb sampling origin slightly in screen-space to hide edge-ghosting artifacts where smoothing radius is quite large
+ tc += ( (mod(tc.x+tc.y,2) - 0.5) * kern[1].z * dlt * 0.5 );
+
+ for (int i = 1; i < 4; i++)
+ {
+ vec2 samptc = tc + kern[i].z*dlt;
+ vec3 samppos = getPosition(ivec2(samptc)).xyz;
+ float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
+ if (d*d <= pointplanedist_tolerance_pow2)
+ {
+ col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
+ defined_weight += kern[i].xy;
+ }
+ }
+ for (int i = 1; i < 4; i++)
+ {
+ vec2 samptc = vec2(tc - kern[i].z*dlt);
+ vec3 samppos = getPosition(ivec2(samptc)).xyz;
+ float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
+ if (d*d <= pointplanedist_tolerance_pow2)
+ {
+ col += texture2DRect(lightMap, samptc)*kern[i].xyxx;
+ defined_weight += kern[i].xy;
+ }
+ }
+
+ col /= defined_weight.xyxx;
+ col.y *= col.y;
+
+ gl_FragColor = col;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
index c2d05c601a..862f809de5 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
index 37bfaac32c..75b4dc624a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
index d884f2e4a5..dc69519a85 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
varying vec3 vary_mat0;
varying vec3 vary_mat1;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
index 9b109b2db6..5b6726488b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_mat0;
varying vec3 vary_mat1;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
new file mode 100644
index 0000000000..ef300d5631
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
@@ -0,0 +1,79 @@
+/**
+ * @file WLCloudsF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+/////////////////////////////////////////////////////////////////////////
+// The fragment shader for the sky
+/////////////////////////////////////////////////////////////////////////
+
+varying vec4 vary_CloudColorSun;
+varying vec4 vary_CloudColorAmbient;
+varying float vary_CloudDensity;
+
+uniform sampler2D cloud_noise_texture;
+uniform vec4 cloud_pos_density1;
+uniform vec4 cloud_pos_density2;
+uniform vec4 gamma;
+
+/// Soft clips the light with a gamma correction
+vec3 scaleSoftClip(vec3 light) {
+ //soft clip effect:
+ light = 1. - clamp(light, vec3(0.), vec3(1.));
+ light = 1. - pow(light, gamma.xxx);
+
+ return light;
+}
+
+void main()
+{
+ // Set variables
+ vec2 uv1 = gl_TexCoord[0].xy;
+ vec2 uv2 = gl_TexCoord[1].xy;
+
+ vec4 cloudColorSun = vary_CloudColorSun;
+ vec4 cloudColorAmbient = vary_CloudColorAmbient;
+ float cloudDensity = vary_CloudDensity;
+ vec2 uv3 = gl_TexCoord[2].xy;
+ vec2 uv4 = gl_TexCoord[3].xy;
+
+ // Offset texture coords
+ uv1 += cloud_pos_density1.xy; //large texture, visible density
+ uv2 += cloud_pos_density1.xy; //large texture, self shadow
+ uv3 += cloud_pos_density2.xy; //small texture, visible density
+ uv4 += cloud_pos_density2.xy; //small texture, self shadow
+
+
+ // Compute alpha1, the main cloud opacity
+ float alpha1 = (texture2D(cloud_noise_texture, uv1).x - 0.5) + (texture2D(cloud_noise_texture, uv3).x - 0.5) * cloud_pos_density2.z;
+ alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10. * cloud_pos_density1.z, 1.);
+
+ // And smooth
+ alpha1 = 1. - alpha1 * alpha1;
+ alpha1 = 1. - alpha1 * alpha1;
+
+
+ // Compute alpha2, for self shadowing effect
+ // (1 - alpha2) will later be used as percentage of incoming sunlight
+ float alpha2 = (texture2D(cloud_noise_texture, uv2).x - 0.5);
+ alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.);
+
+ // And smooth
+ alpha2 = 1. - alpha2;
+ alpha2 = 1. - alpha2 * alpha2;
+
+ // Combine
+ vec4 color;
+ color = (cloudColorSun*(1.-alpha2) + cloudColorAmbient);
+ color *= 2.;
+
+ /// Gamma correct for WL (soft clip effect).
+ gl_FragData[0] = vec4(scaleSoftClip(color.rgb), alpha1);
+ gl_FragData[1] = vec4(0.0,0.0,0.0,0.0);
+ gl_FragData[2] = vec4(0,0,1,0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
new file mode 100644
index 0000000000..3eac63076c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -0,0 +1,165 @@
+/**
+ * @file WLCloudsV.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+//////////////////////////////////////////////////////////////////////////
+// The vertex shader for creating the atmospheric sky
+///////////////////////////////////////////////////////////////////////////////
+
+// Output parameters
+varying vec4 vary_CloudColorSun;
+varying vec4 vary_CloudColorAmbient;
+varying float vary_CloudDensity;
+
+// Inputs
+uniform vec3 camPosLocal;
+
+uniform vec4 lightnorm;
+uniform vec4 sunlight_color;
+uniform vec4 ambient;
+uniform vec4 blue_horizon;
+uniform vec4 blue_density;
+uniform vec4 haze_horizon;
+uniform vec4 haze_density;
+
+uniform vec4 cloud_shadow;
+uniform vec4 density_multiplier;
+uniform vec4 max_y;
+
+uniform vec4 glow;
+
+uniform vec4 cloud_color;
+
+uniform vec4 cloud_scale;
+
+void main()
+{
+
+ // World / view / projection
+ gl_Position = ftransform();
+
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+
+ // Get relative position
+ vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
+
+ // Set altitude
+ if (P.y > 0.)
+ {
+ P *= (max_y.x / P.y);
+ }
+ else
+ {
+ P *= (-32000. / P.y);
+ }
+
+ // Can normalize then
+ vec3 Pn = normalize(P);
+ float Plen = length(P);
+
+ // Initialize temp variables
+ vec4 temp1 = vec4(0.);
+ vec4 temp2 = vec4(0.);
+ vec4 blue_weight;
+ vec4 haze_weight;
+ vec4 sunlight = sunlight_color;
+ vec4 light_atten;
+
+
+ // Sunlight attenuation effect (hue and brightness) due to atmosphere
+ // this is used later for sunlight modulation at various altitudes
+ light_atten = (blue_density * 1.0 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x);
+
+ // Calculate relative weights
+ temp1 = blue_density + haze_density.x;
+ blue_weight = blue_density / temp1;
+ haze_weight = haze_density.x / temp1;
+
+ // Compute sunlight from P & lightnorm (for long rays like sky)
+ temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Distance
+ temp2.z = Plen * density_multiplier.x;
+
+ // Transparency (-> temp1)
+ // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+ // compiler gets confused.
+ temp1 = exp(-temp1 * temp2.z);
+
+
+ // Compute haze glow
+ temp2.x = dot(Pn, lightnorm.xyz);
+ temp2.x = 1. - temp2.x;
+ // temp2.x is 0 at the sun and increases away from sun
+ temp2.x = max(temp2.x, .001);
+ // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+ temp2.x *= glow.x;
+ // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+ temp2.x = pow(temp2.x, glow.z);
+ // glow.z should be negative, so we're doing a sort of (1 / "angle") function
+
+ // Add "minimum anti-solar illumination"
+ temp2.x += .25;
+
+ // Increase ambient when there are more clouds
+ vec4 tmpAmbient = ambient;
+ tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5;
+
+ // Dim sunlight by cloud shadow percentage
+ sunlight *= (1. - cloud_shadow.x);
+
+ // Haze color below cloud
+ vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
+ + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+ );
+
+ // CLOUDS
+
+ sunlight = sunlight_color;
+ temp2.y = max(0., lightnorm.y * 2.);
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Cloud color out
+ vary_CloudColorSun = (sunlight * temp2.x) * cloud_color;
+ vary_CloudColorAmbient = tmpAmbient * cloud_color;
+
+ // Attenuate cloud color by atmosphere
+ temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
+ vary_CloudColorSun *= temp1;
+ vary_CloudColorAmbient *= temp1;
+ vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
+
+ // Make a nice cloud density based on the cloud_shadow value that was passed in.
+ vary_CloudDensity = 2. * (cloud_shadow.x - 0.25);
+
+
+ // Texture coords
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_TexCoord[0].xy -= 0.5;
+ gl_TexCoord[0].xy /= cloud_scale.x;
+ gl_TexCoord[0].xy += 0.5;
+
+ gl_TexCoord[1] = gl_TexCoord[0];
+ gl_TexCoord[1].x += lightnorm.x * 0.0125;
+ gl_TexCoord[1].y += lightnorm.z * 0.0125;
+
+ gl_TexCoord[2] = gl_TexCoord[0] * 16.;
+ gl_TexCoord[3] = gl_TexCoord[1] * 16.;
+
+ // Combine these to minimize register use
+ vary_CloudColorAmbient += oHazeColorBelowCloud;
+
+ // needs this to compile on mac
+ //vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
+
+ // END CLOUDS
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
index 35cfb80c93..43af480c50 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
@@ -20,3 +20,4 @@ void main()
vec3 nvn = normalize(vary_normal);
gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
new file mode 100644
index 0000000000..e7b5dcce7f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
@@ -0,0 +1,19 @@
+/**
+ * @file diffuseIndexedF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+varying vec3 vary_normal;
+
+void main()
+{
+ vec3 col = gl_Color.rgb * diffuseLookup(gl_TexCoord[0].xy).rgb;
+
+ gl_FragData[0] = vec4(col, 0.0);
+ gl_FragData[1] = gl_Color.aaaa; // spec
+ //gl_FragData[1] = vec4(vec3(gl_Color.a), gl_Color.a+(1.0-gl_Color.a)*gl_Color.a); // spec - from former class3 - maybe better, but not so well tested
+ vec3 nvn = normalize(vary_normal);
+ gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
index 9a45c03237..2c4caea109 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
varying vec3 vary_normal;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
index 03d3322cb6..b56d1493c3 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
@@ -5,16 +5,18 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_normal;
+varying float vary_texture_index;
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz, 1.0);
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texture_index = gl_Vertex.w;
vary_normal = normalize(gl_NormalMatrix * gl_Normal);
gl_FrontColor = gl_Color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
index 3429877397..029f282d7c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
@@ -5,60 +5,52 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2D diffuseMap;
-uniform sampler2DRect depthMap;
-uniform sampler2D noiseMap;
+varying float vary_texture_index;
+
+uniform sampler2D tex0;
+uniform sampler2D tex1;
+uniform sampler2D tex2;
+uniform sampler2D tex3;
+uniform sampler2D tex4;
+uniform sampler2D tex5;
+uniform sampler2D tex6;
+uniform sampler2D tex7;
-uniform vec4 shadow_clip;
-uniform vec2 screen_res;
+vec4 textureLookup(vec2 texcoord)
+{
+ switch (int(vary_texture_index+0.25))
+ {
+ case 0: return texture2D(tex0, texcoord);
+ case 1: return texture2D(tex1, texcoord);
+ case 2: return texture2D(tex2, texcoord);
+ case 3: return texture2D(tex3, texcoord);
+ case 4: return texture2D(tex4, texcoord);
+ case 5: return texture2D(tex5, texcoord);
+ case 6: return texture2D(tex6, texcoord);
+ case 7: return texture2D(tex7, texcoord);
+ }
+
+ return vec4(0,0,0,0);
+}
vec3 fullbrightAtmosTransport(vec3 light);
vec3 fullbrightScaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec4 vary_position;
-varying vec3 vary_normal;
-varying vec3 vary_fragcoord;
-
-uniform mat4 inv_proj;
-
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
void main()
{
- vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
- frag *= screen_res;
-
- vec3 samp_pos = getPosition(frag).xyz;
-
float shadow = 1.0;
- vec4 pos = vary_position;
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy)*gl_Color;
+ vec4 color = textureLookup(gl_TexCoord[0].xy)*gl_Color;
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = fullbrightScaleSoftClip(color.rgb);
- //gl_FragColor = gl_Color;
gl_FragColor = color;
- //gl_FragColor = vec4(1,0,1,1);
-
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
index 6c38d220e2..2eed044b7c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
@@ -14,30 +14,23 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_normal;
-varying vec3 vary_fragcoord;
-uniform float near_clip;
-varying vec4 vary_position;
+varying float vary_texture_index;
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 vert = vec4(gl_Vertex.xyz, 1.0);
+ vary_texture_index = gl_Vertex.w;
+
+ gl_Position = gl_ModelViewProjectionMatrix*vert;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vary_position = pos;
-
+ vec4 pos = (gl_ModelViewMatrix * vert);
+
calcAtmospherics(pos.xyz);
gl_FrontColor = gl_Color;
gl_FogFragCoord = pos.z;
-
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
-
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
index 75b555e8ae..41c149e774 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
index 8dc1410ea5..e86f2896da 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
index e3c15a2ab2..fa811f0d55 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform sampler2D normalMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
index 37148b3f1a..723777bd3a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
index 78df54d5dc..25e93ae266 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
index 0c820bfc6c..4baf1fc65a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index 609fc4f14f..3c5c780d94 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -36,7 +36,7 @@ uniform mat4 inv_proj;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl
new file mode 100644
index 0000000000..6c43679acf
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl
@@ -0,0 +1,137 @@
+/**
+ * @file multiPointLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS depthMap;
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS specularRect;
+uniform sampler2DMS normalMap;
+uniform sampler2D noiseMap;
+uniform sampler2D lightFunc;
+
+
+uniform vec3 env_mat[3];
+uniform float sun_wash;
+
+uniform int light_count;
+
+#define MAX_LIGHT_COUNT 16
+uniform vec4 light[MAX_LIGHT_COUNT];
+uniform vec4 light_col[MAX_LIGHT_COUNT];
+
+varying vec4 vary_fragcoord;
+uniform vec2 screen_res;
+
+uniform float far_z;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen, sample).r;
+ vec2 sc = vec2(pos_screen.xy)*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
+ ivec2 itc = ivec2(frag);
+
+ int wght = 0;
+ vec3 fcol = vec3(0,0,0);
+
+ for (int s = 0; s < samples; ++s)
+ {
+ vec3 pos = getPosition(itc, s).xyz;
+ if (pos.z >= far_z)
+ {
+ vec3 norm = texelFetch(normalMap, itc, s).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ norm = normalize(norm);
+ vec4 spec = texelFetch(specularRect, itc, s);
+ vec3 diff = texelFetch(diffuseRect, itc, s).rgb;
+ float noise = texture2D(noiseMap, frag.xy/128.0).b;
+ vec3 out_col = vec3(0,0,0);
+ vec3 npos = normalize(-pos);
+
+ // As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
+ for (int i = 0; i < MAX_LIGHT_COUNT; ++i)
+ {
+ bool light_contrib = (i < light_count);
+
+ vec3 lv = light[i].xyz-pos;
+ float dist2 = dot(lv,lv);
+ dist2 /= light[i].w;
+ if (dist2 > 1.0)
+ {
+ light_contrib = false;
+ }
+
+ float da = dot(norm, lv);
+ if (da < 0.0)
+ {
+ light_contrib = false;
+ }
+
+ if (light_contrib)
+ {
+ lv = normalize(lv);
+ da = dot(norm, lv);
+
+ float fa = light_col[i].a+1.0;
+ float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ dist_atten *= noise;
+
+ float lit = da * dist_atten;
+
+ vec3 col = light_col[i].rgb*lit*diff;
+ //vec3 col = vec3(dist2, light_col[i].a, lit);
+
+ if (spec.a > 0.0)
+ {
+ //vec3 ref = dot(pos+lv, norm);
+
+ float sa = dot(normalize(lv+npos),norm);
+
+ if (sa > 0.0)
+ {
+ sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
+ sa *= noise;
+ col += da*sa*light_col[i].rgb*spec.rgb;
+ }
+ }
+
+ out_col += col;
+ }
+ }
+
+ fcol += out_col;
+ ++wght;
+ }
+ }
+
+ if (wght <= 0)
+ {
+ discard;
+ }
+
+ gl_FragColor.rgb = fcol/samples;
+ gl_FragColor.a = 0.0;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
index 2e3e84dd15..434fb6f534 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index a9f03f7615..0d25d7792d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
//class 1 -- no shadows
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl
new file mode 100644
index 0000000000..c80a54346e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl
@@ -0,0 +1,232 @@
+/**
+ * @file multiSpotLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+//class 1 -- no shadows
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS specularRect;
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2D noiseMap;
+uniform sampler2D lightFunc;
+uniform sampler2D projectionMap;
+
+uniform mat4 proj_mat; //screen space to light space
+uniform float proj_near; //near clip for projection
+uniform vec3 proj_p; //plane projection is emitting from (in screen space)
+uniform vec3 proj_n;
+uniform float proj_focus; //distance from plane to begin blurring
+uniform float proj_lod; //(number of mips in proj map)
+uniform float proj_range; //range between near clip and far clip plane of projection
+uniform float proj_ambient_lod;
+uniform float proj_ambiance;
+uniform float near_clip;
+uniform float far_clip;
+
+uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
+uniform float sun_wash;
+uniform float shadow_fade;
+
+varying vec4 vary_light;
+
+varying vec4 vary_fragcoord;
+uniform vec2 screen_res;
+
+uniform mat4 inv_proj;
+
+vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float det = max(1.0-lod/(proj_lod*0.5), 0.0);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
+
+ float det = min(lod/(proj_lod*0.5), 1.0);
+
+ float d = min(dist.x, dist.y);
+
+ float edge = 0.25*det;
+
+ ret *= clamp(d/edge, 0.0, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
+
+ return ret;
+}
+
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen, sample).r;
+ vec2 sc = vec2(pos_screen.xy)*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ int wght = 0;
+
+ vec3 fcol = vec3(0,0,0);
+
+ vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
+
+ ivec2 itc = ivec2(frag.xy);
+
+ for (int i = 0; i < samples; ++i)
+ {
+ vec3 pos = getPosition(itc, i).xyz;
+ vec3 lv = vary_light.xyz-pos.xyz;
+ float dist2 = dot(lv,lv);
+ dist2 /= vary_light.w;
+ if (dist2 <= 1.0)
+ {
+ vec3 norm = texelFetch(normalMap, itc, i).xyz*2.0-1.0;
+
+ norm = normalize(norm);
+ float l_dist = -dot(lv, proj_n);
+
+ vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
+ if (proj_tc.z >= 0.0)
+ {
+ proj_tc.xyz /= proj_tc.w;
+
+ float fa = gl_Color.a+1.0;
+ float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
+ if (dist_atten > 0.0)
+ {
+ lv = proj_origin-pos.xyz;
+ lv = normalize(lv);
+ float da = dot(norm, lv);
+
+ vec3 col = vec3(0,0,0);
+
+ vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb;
+
+ float noise = texture2D(noiseMap, frag.xy/128.0).b;
+ if (proj_tc.z > 0.0 &&
+ proj_tc.x < 1.0 &&
+ proj_tc.y < 1.0 &&
+ proj_tc.x > 0.0 &&
+ proj_tc.y > 0.0)
+ {
+ float lit = 0.0;
+ float amb_da = proj_ambiance;
+
+ if (da > 0.0)
+ {
+ float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
+ float lod = diff * proj_lod;
+
+ vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
+
+ vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+
+ lit = da * dist_atten * noise;
+
+ col = lcol*lit*diff_tex;
+ amb_da += (da*0.5)*proj_ambiance;
+ }
+
+ //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
+ vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
+
+ amb_da += (da*da*0.5+0.5)*proj_ambiance;
+
+ amb_da *= dist_atten * noise;
+
+ amb_da = min(amb_da, 1.0-lit);
+
+ col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ }
+
+
+ vec4 spec = texelFetch(specularRect, itc, i);
+ if (spec.a > 0.0)
+ {
+ vec3 ref = reflect(normalize(pos), norm);
+
+ //project from point pos in direction ref to plane proj_p, proj_n
+ vec3 pdelta = proj_p-pos;
+ float ds = dot(ref, proj_n);
+
+ if (ds < 0.0)
+ {
+ vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
+
+ vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
+
+ if (stc.z > 0.0)
+ {
+ stc.xy /= stc.w;
+
+ float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
+
+ stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
+
+ if (stc.x < 1.0 &&
+ stc.y < 1.0 &&
+ stc.x > 0.0 &&
+ stc.y > 0.0)
+ {
+ vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
+ col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
+ }
+ }
+ }
+ }
+
+ fcol += col;
+ ++wght;
+ }
+ }
+ }
+ }
+
+ if (wght <= 0)
+ {
+ discard;
+ }
+
+ gl_FragColor.rgb = fcol/samples;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
index 22ed9dcd40..5efa3200d4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
- #version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -30,7 +30,7 @@ uniform vec4 viewport;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = (pos_screen.xy-viewport.xy)*2.0;
sc /= viewport.zw;
sc -= vec2(1.0,1.0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl
new file mode 100644
index 0000000000..feaf38115d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl
@@ -0,0 +1,108 @@
+/**
+ * @file pointLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS depthMap;
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS specularRect;
+uniform sampler2DMS normalMap;
+uniform sampler2D noiseMap;
+uniform sampler2D lightFunc;
+
+
+uniform vec3 env_mat[3];
+uniform float sun_wash;
+
+varying vec4 vary_light;
+
+varying vec4 vary_fragcoord;
+uniform vec2 screen_res;
+
+uniform mat4 inv_proj;
+uniform vec4 viewport;
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen, sample).r;
+ vec2 sc = (vec2(pos_screen.xy)-viewport.xy)*2.0;
+ sc /= viewport.zw;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec4 frag = vary_fragcoord;
+ frag.xyz /= frag.w;
+ frag.xyz = frag.xyz*0.5+0.5;
+ frag.xy *= screen_res;
+
+ ivec2 itc = ivec2(frag.xy);
+
+ int wght = 0;
+ vec3 fcol = vec3(0,0,0);
+
+ for (int s = 0; s < samples; ++s)
+ {
+ vec3 pos = getPosition(itc, s).xyz;
+ vec3 lv = vary_light.xyz-pos;
+ float dist2 = dot(lv,lv);
+ dist2 /= vary_light.w;
+ if (dist2 <= 1.0)
+ {
+ vec3 norm = texelFetch(normalMap, itc, s).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ float da = dot(norm, lv);
+ if (da >= 0.0)
+ {
+ norm = normalize(norm);
+ lv = normalize(lv);
+ da = dot(norm, lv);
+
+ float noise = texture2D(noiseMap, frag.xy/128.0).b;
+
+ vec3 col = texelFetch(diffuseRect, itc, s).rgb;
+ float fa = gl_Color.a+1.0;
+ float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ float lit = da * dist_atten * noise;
+
+ col = gl_Color.rgb*lit*col;
+
+ vec4 spec = texelFetch(specularRect, itc, s);
+ if (spec.a > 0.0)
+ {
+ float sa = dot(normalize(lv-normalize(pos)),norm);
+ if (sa > 0.0)
+ {
+ sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
+ sa *= noise;
+ col += da*sa*gl_Color.rgb*spec.rgb;
+ }
+ }
+
+ fcol += col;
+ ++wght;
+ }
+ }
+ }
+
+ if (wght <= 0)
+ {
+ discard;
+ }
+
+ gl_FragColor.rgb = fcol/samples;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
index 8e74feb615..c510d8ad77 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
@@ -5,19 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 vary_light;
varying vec4 vary_fragcoord;
-uniform vec2 screen_res;
-uniform float near_clip;
-
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
-
vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
vary_fragcoord = pos;
@@ -25,6 +20,8 @@ void main()
tex.w = 1.0;
vary_light = gl_MultiTexCoord0;
+
+ gl_Position = pos;
gl_FrontColor = gl_Color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
index 77f1b2224c..f6b0402bb9 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -29,7 +29,7 @@ varying vec2 vary_fragcoord;
float getDepth(vec2 pos_screen)
{
- float z = texture2DRect(depthMap, pos_screen.xy).a;
+ float z = texture2DRect(depthMap, pos_screen.xy).r;
z = z*2.0-1.0;
vec4 ndc = vec4(0.0, 0.0, z, 1.0);
vec4 p = inv_proj*ndc;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl
new file mode 100644
index 0000000000..62ae5f917a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl
@@ -0,0 +1,133 @@
+/**
+ * @file postDeferredF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS edgeMap;
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2D bloomMap;
+
+uniform float depth_cutoff;
+uniform float norm_cutoff;
+uniform float focal_distance;
+uniform float blur_constant;
+uniform float tan_pixel_angle;
+uniform float magnification;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+varying vec2 vary_fragcoord;
+
+vec4 texture2DMS(sampler2DMS tex, ivec2 tc)
+{
+ vec4 ret = vec4(0,0,0,0);
+ for (int i = 0; i < samples; ++i)
+ {
+ ret += texelFetch(tex, tc, i);
+ }
+
+ return ret/samples;
+}
+
+float getDepth(ivec2 pos_screen)
+{
+ float z = texture2DMS(depthMap, pos_screen.xy).r;
+ z = z*2.0-1.0;
+ vec4 ndc = vec4(0.0, 0.0, z, 1.0);
+ vec4 p = inv_proj*ndc;
+ return p.z/p.w;
+}
+
+float calc_cof(float depth)
+{
+ float sc = abs(depth-focal_distance)/-depth*blur_constant;
+
+ sc /= magnification;
+
+ // tan_pixel_angle = pixel_length/-depth;
+ float pixel_length = tan_pixel_angle*-focal_distance;
+
+ sc = sc/pixel_length;
+ sc *= 1.414;
+
+ return sc;
+}
+
+void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, ivec2 tc)
+{
+ float d = getDepth(tc);
+
+ float sc = calc_cof(d);
+
+ if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius
+ || d < cur_depth) //sampled pixel is further away than current pixel
+ {
+ float wg = 0.25;
+
+ vec4 s = texture2DMS(diffuseRect, tc);
+ // de-weight dull areas to make highlights 'pop'
+ wg += s.r+s.g+s.b;
+
+ diff += wg*s;
+
+ w += wg;
+ }
+}
+
+
+void main()
+{
+ ivec2 itc = ivec2(vary_fragcoord.xy);
+
+ vec3 norm = texture2DMS(normalMap, itc).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+
+ float depth = getDepth(itc);
+
+ vec4 diff = texture2DMS(diffuseRect, itc);
+
+ {
+ float w = 1.0;
+
+ float sc = calc_cof(depth);
+ sc = min(abs(sc), 10.0);
+
+ float fd = depth*0.5f;
+
+ float PI = 3.14159265358979323846264;
+
+ int isc = int(sc);
+
+ // sample quite uniformly spaced points within a circle, for a circular 'bokeh'
+ //if (depth < focal_distance)
+ {
+ for (int x = -isc; x <= isc; x+=2)
+ {
+ for (int y = -isc; y <= isc; y+=2)
+ {
+ ivec2 cur_samp = ivec2(x,y);
+ float cur_sc = length(vec2(cur_samp));
+ if (cur_sc < sc)
+ {
+ dofSample(diff, w, cur_sc, depth, itc+cur_samp);
+ }
+ }
+ }
+ }
+
+ diff /= w;
+ }
+
+ vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
+ gl_FragColor = diff + bloom;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
index ab48d08bbb..bf829bfc56 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl
new file mode 100644
index 0000000000..bf35dfe11c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file postDeferredF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseRect;
+uniform sampler2D bloomMap;
+
+uniform vec2 screen_res;
+varying vec2 vary_fragcoord;
+
+vec4 texture2DMS(sampler2DMS tex, ivec2 tc)
+{
+ vec4 ret = vec4(0,0,0,0);
+
+ for (int i = 0; i < samples; ++i)
+ {
+ ret += texelFetch(tex,tc,i);
+ }
+
+ return ret/samples;
+}
+
+void main()
+{
+ vec4 diff = texture2DMS(diffuseRect, ivec2(vary_fragcoord.xy));
+
+ vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
+ gl_FragColor = diff + bloom;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
index 12983baa94..876f65ee3a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
index 63b3c9f205..fa3f04bcc8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
index ae57227fe5..eebe930666 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
index 6674c4a5aa..e0c5406483 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
index db3bddc6be..9271a5115c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 post_pos;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
new file mode 100644
index 0000000000..820c82ffd7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
@@ -0,0 +1,44 @@
+/**
+ * @file WLSkyF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+/////////////////////////////////////////////////////////////////////////
+// The fragment shader for the sky
+/////////////////////////////////////////////////////////////////////////
+
+varying vec4 vary_HazeColor;
+
+uniform sampler2D cloud_noise_texture;
+uniform vec4 gamma;
+
+/// Soft clips the light with a gamma correction
+vec3 scaleSoftClip(vec3 light) {
+ //soft clip effect:
+ light = 1. - clamp(light, vec3(0.), vec3(1.));
+ light = 1. - pow(light, gamma.xxx);
+
+ return light;
+}
+
+void main()
+{
+ // Potential Fill-rate optimization. Add cloud calculation
+ // back in and output alpha of 0 (so that alpha culling kills
+ // the fragment) if the sky wouldn't show up because the clouds
+ // are fully opaque.
+
+ vec4 color;
+ color = vary_HazeColor;
+ color *= 2.;
+
+ /// Gamma correct for WL (soft clip effect).
+ gl_FragData[0] = vec4(scaleSoftClip(color.rgb), 1.0);
+ gl_FragData[1] = vec4(0.0,0.0,0.0,0.0);
+ gl_FragData[2] = vec4(0,0,1,0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
new file mode 100644
index 0000000000..1ea00f723a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
@@ -0,0 +1,140 @@
+/**
+ * @file WLSkyV.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+// SKY ////////////////////////////////////////////////////////////////////////
+// The vertex shader for creating the atmospheric sky
+///////////////////////////////////////////////////////////////////////////////
+
+// Output parameters
+varying vec4 vary_HazeColor;
+
+// Inputs
+uniform vec3 camPosLocal;
+
+uniform vec4 lightnorm;
+uniform vec4 sunlight_color;
+uniform vec4 ambient;
+uniform vec4 blue_horizon;
+uniform vec4 blue_density;
+uniform vec4 haze_horizon;
+uniform vec4 haze_density;
+
+uniform vec4 cloud_shadow;
+uniform vec4 density_multiplier;
+uniform vec4 max_y;
+
+uniform vec4 glow;
+
+uniform vec4 cloud_color;
+
+uniform vec4 cloud_scale;
+
+void main()
+{
+
+ // World / view / projection
+ gl_Position = ftransform();
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+
+ // Get relative position
+ vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
+ //vec3 P = gl_Vertex.xyz + vec3(0,50,0);
+
+ // Set altitude
+ if (P.y > 0.)
+ {
+ P *= (max_y.x / P.y);
+ }
+ else
+ {
+ P *= (-32000. / P.y);
+ }
+
+ // Can normalize then
+ vec3 Pn = normalize(P);
+ float Plen = length(P);
+
+ // Initialize temp variables
+ vec4 temp1 = vec4(0.);
+ vec4 temp2 = vec4(0.);
+ vec4 blue_weight;
+ vec4 haze_weight;
+ vec4 sunlight = sunlight_color;
+ vec4 light_atten;
+
+
+ // Sunlight attenuation effect (hue and brightness) due to atmosphere
+ // this is used later for sunlight modulation at various altitudes
+ light_atten = (blue_density * 1.0 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x);
+
+ // Calculate relative weights
+ temp1 = blue_density + haze_density.x;
+ blue_weight = blue_density / temp1;
+ haze_weight = haze_density.x / temp1;
+
+ // Compute sunlight from P & lightnorm (for long rays like sky)
+ temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Distance
+ temp2.z = Plen * density_multiplier.x;
+
+ // Transparency (-> temp1)
+ // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+ // compiler gets confused.
+ temp1 = exp(-temp1 * temp2.z);
+
+
+ // Compute haze glow
+ temp2.x = dot(Pn, lightnorm.xyz);
+ temp2.x = 1. - temp2.x;
+ // temp2.x is 0 at the sun and increases away from sun
+ temp2.x = max(temp2.x, .001);
+ // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+ temp2.x *= glow.x;
+ // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+ temp2.x = pow(temp2.x, glow.z);
+ // glow.z should be negative, so we're doing a sort of (1 / "angle") function
+
+ // Add "minimum anti-solar illumination"
+ temp2.x += .25;
+
+
+ // Haze color above cloud
+ vary_HazeColor = ( blue_horizon * blue_weight * (sunlight + ambient)
+ + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + ambient)
+ );
+
+
+ // Increase ambient when there are more clouds
+ vec4 tmpAmbient = ambient;
+ tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5;
+
+ // Dim sunlight by cloud shadow percentage
+ sunlight *= (1. - cloud_shadow.x);
+
+ // Haze color below cloud
+ vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
+ + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+ );
+
+ // Final atmosphere additive
+ vary_HazeColor *= (1. - temp1);
+
+ // Attenuate cloud color by atmosphere
+ temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
+
+ // At horizon, blend high altitude sky color towards the darker color below the clouds
+ vary_HazeColor += (additiveColorBelowCloud - vary_HazeColor) * (1. - sqrt(temp1));
+
+ // won't compile on mac without this being set
+ //vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 29340c7e9f..60082f40d6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -259,7 +259,7 @@ vec3 scaleSoftClip(vec3 light)
void main()
{
vec2 tc = vary_fragcoord.xy;
- float depth = texture2DRect(depthMap, tc.xy).a;
+ float depth = texture2DRect(depthMap, tc.xy).r;
vec3 pos = getPosition_d(tc, depth).xyz;
vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl
new file mode 100644
index 0000000000..9dfacfb520
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl
@@ -0,0 +1,318 @@
+/**
+ * @file softenLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS specularRect;
+uniform sampler2DMS normalMap;
+uniform sampler2DMS depthMap;
+uniform sampler2D noiseMap;
+uniform samplerCube environmentMap;
+uniform sampler2D lightFunc;
+
+uniform float blur_size;
+uniform float blur_fidelity;
+
+// Inputs
+uniform vec4 morphFactor;
+uniform vec3 camPosLocal;
+//uniform vec4 camPosWorld;
+uniform vec4 gamma;
+uniform vec4 lightnorm;
+uniform vec4 sunlight_color;
+uniform vec4 ambient;
+uniform vec4 blue_horizon;
+uniform vec4 blue_density;
+uniform vec4 haze_horizon;
+uniform vec4 haze_density;
+uniform vec4 cloud_shadow;
+uniform vec4 density_multiplier;
+uniform vec4 distance_multiplier;
+uniform vec4 max_y;
+uniform vec4 glow;
+uniform float scene_light_strength;
+uniform vec3 env_mat[3];
+//uniform mat4 shadow_matrix[3];
+//uniform vec4 shadow_clip;
+uniform mat3 ssao_effect_mat;
+
+varying vec4 vary_light;
+varying vec2 vary_fragcoord;
+
+vec3 vary_PositionEye;
+
+vec3 vary_SunlitColor;
+vec3 vary_AmblitColor;
+vec3 vary_AdditiveColor;
+vec3 vary_AtmosAttenuation;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+vec4 getPosition_d(vec2 pos_screen, float depth)
+{
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+vec3 getSunlitColor()
+{
+ return vary_SunlitColor;
+}
+vec3 getAmblitColor()
+{
+ return vary_AmblitColor;
+}
+vec3 getAdditiveColor()
+{
+ return vary_AdditiveColor;
+}
+vec3 getAtmosAttenuation()
+{
+ return vary_AtmosAttenuation;
+}
+
+
+void setPositionEye(vec3 v)
+{
+ vary_PositionEye = v;
+}
+
+void setSunlitColor(vec3 v)
+{
+ vary_SunlitColor = v;
+}
+
+void setAmblitColor(vec3 v)
+{
+ vary_AmblitColor = v;
+}
+
+void setAdditiveColor(vec3 v)
+{
+ vary_AdditiveColor = v;
+}
+
+void setAtmosAttenuation(vec3 v)
+{
+ vary_AtmosAttenuation = v;
+}
+
+void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
+
+ vec3 P = inPositionEye;
+ setPositionEye(P);
+
+ //(TERRAIN) limit altitude
+ if (P.y > max_y.x) P *= (max_y.x / P.y);
+ if (P.y < -max_y.x) P *= (-max_y.x / P.y);
+
+ vec3 tmpLightnorm = lightnorm.xyz;
+
+ vec3 Pn = normalize(P);
+ float Plen = length(P);
+
+ vec4 temp1 = vec4(0);
+ vec3 temp2 = vec3(0);
+ vec4 blue_weight;
+ vec4 haze_weight;
+ vec4 sunlight = sunlight_color;
+ vec4 light_atten;
+
+ //sunlight attenuation effect (hue and brightness) due to atmosphere
+ //this is used later for sunlight modulation at various altitudes
+ light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
+ //I had thought blue_density and haze_density should have equal weighting,
+ //but attenuation due to haze_density tends to seem too strong
+
+ temp1 = blue_density + vec4(haze_density.r);
+ blue_weight = blue_density / temp1;
+ haze_weight = vec4(haze_density.r) / temp1;
+
+ //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
+ temp2.y = max(0.0, tmpLightnorm.y);
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // main atmospheric scattering line integral
+ temp2.z = Plen * density_multiplier.x;
+
+ // Transparency (-> temp1)
+ // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
+ // compiler gets confused.
+ temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
+
+ //final atmosphere attenuation factor
+ setAtmosAttenuation(temp1.rgb);
+
+ //compute haze glow
+ //(can use temp2.x as temp because we haven't used it yet)
+ temp2.x = dot(Pn, tmpLightnorm.xyz);
+ temp2.x = 1. - temp2.x;
+ //temp2.x is 0 at the sun and increases away from sun
+ temp2.x = max(temp2.x, .03); //was glow.y
+ //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+ temp2.x *= glow.x;
+ //higher glow.x gives dimmer glow (because next step is 1 / "angle")
+ temp2.x = pow(temp2.x, glow.z);
+ //glow.z should be negative, so we're doing a sort of (1 / "angle") function
+
+ //add "minimum anti-solar illumination"
+ temp2.x += .25;
+
+ //increase ambient when there are more clouds
+ vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5;
+
+ /* decrease value and saturation (that in HSV, not HSL) for occluded areas
+ * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
+ * // The following line of code performs the equivalent of:
+ * float ambAlpha = tmpAmbient.a;
+ * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis
+ * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue);
+ * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha);
+ */
+ tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);
+
+ //haze color
+ setAdditiveColor(
+ vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
+ + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
+ + tmpAmbient)));
+
+ //brightness of surface both sunlight and ambient
+ setSunlitColor(vec3(sunlight * .5));
+ setAmblitColor(vec3(tmpAmbient * .25));
+ setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));
+}
+
+vec3 atmosLighting(vec3 light)
+{
+ light *= getAtmosAttenuation().r;
+ light += getAdditiveColor();
+ return (2.0 * light);
+}
+
+vec3 atmosTransport(vec3 light) {
+ light *= getAtmosAttenuation().r;
+ light += getAdditiveColor() * 2.0;
+ return light;
+}
+vec3 atmosGetDiffuseSunlightColor()
+{
+ return getSunlitColor();
+}
+
+vec3 scaleDownLight(vec3 light)
+{
+ return (light / scene_light_strength );
+}
+
+vec3 scaleUpLight(vec3 light)
+{
+ return (light * scene_light_strength);
+}
+
+vec3 atmosAmbient(vec3 light)
+{
+ return getAmblitColor() + light / 2.0;
+}
+
+vec3 atmosAffectDirectionalLight(float lightIntensity)
+{
+ return getSunlitColor() * lightIntensity;
+}
+
+vec3 scaleSoftClip(vec3 light)
+{
+ //soft clip effect:
+ light = 1. - clamp(light, vec3(0.), vec3(1.));
+ light = 1. - pow(light, gamma.xxx);
+
+ return light;
+}
+
+vec4 texture2DMS(sampler2DMS tex, ivec2 tc)
+{
+ vec4 ret = vec4(0,0,0,0);
+
+ for (int i = 0; i < samples; ++i)
+ {
+ ret += texelFetch(tex,tc,i);
+ }
+
+ return ret/samples;
+}
+
+void main()
+{
+ vec2 tc = vary_fragcoord.xy;
+ ivec2 itc = ivec2(tc);
+
+ vec3 fcol = vec3(0,0,0);
+
+ for (int i = 0; i < samples; ++i)
+ {
+ float depth = texelFetch(depthMap, itc, i).r;
+ vec3 pos = getPosition_d(tc, depth).xyz;
+ vec3 norm = texelFetch(normalMap, itc, i).xyz;
+
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
+
+ float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
+
+ vec4 diffuse = texelFetch(diffuseRect, itc, i);
+ if (diffuse.a >= 1.0)
+ {
+ fcol += diffuse.rgb;
+ }
+ else
+ {
+ vec4 spec = texelFetch(specularRect, itc, i);
+
+ calcAtmospherics(pos.xyz, 1.0);
+
+ vec3 col = atmosAmbient(vec3(0));
+ col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a));
+
+ col *= diffuse.rgb;
+
+ if (spec.a > 0.0) // specular reflection
+ {
+ // the old infinite-sky shiny reflection
+ //
+ vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
+ float sa = dot(refnormpersp, vary_light.xyz);
+ vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).a;
+
+ // add the two types of shiny together
+ col += dumbshiny * spec.rgb;
+ }
+
+ col = atmosLighting(col);
+ col = scaleSoftClip(col);
+ fcol += col;
+ }
+ }
+
+ gl_FragColor.rgb = fcol.rgb/samples;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
index 8f0bcca76b..745cc01992 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
index 29fac46bfe..9aaffc15bf 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl
new file mode 100644
index 0000000000..4bb9bad275
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl
@@ -0,0 +1,234 @@
+/**
+ * @file multiSpotLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+//class 1 -- no shadows
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS specularRect;
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2D noiseMap;
+uniform sampler2D lightFunc;
+uniform sampler2D projectionMap;
+
+uniform mat4 proj_mat; //screen space to light space
+uniform float proj_near; //near clip for projection
+uniform vec3 proj_p; //plane projection is emitting from (in screen space)
+uniform vec3 proj_n;
+uniform float proj_focus; //distance from plane to begin blurring
+uniform float proj_lod; //(number of mips in proj map)
+uniform float proj_range; //range between near clip and far clip plane of projection
+uniform float proj_ambient_lod;
+uniform float proj_ambiance;
+uniform float near_clip;
+uniform float far_clip;
+
+uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
+uniform float sun_wash;
+uniform int proj_shadow_idx;
+uniform float shadow_fade;
+
+varying vec4 vary_light;
+
+varying vec4 vary_fragcoord;
+uniform vec2 screen_res;
+
+uniform mat4 inv_proj;
+
+vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float det = max(1.0-lod/(proj_lod*0.5), 0.0);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
+
+ float det = min(lod/(proj_lod*0.5), 1.0);
+
+ float d = min(dist.x, dist.y);
+
+ float edge = 0.25*det;
+
+ ret *= clamp(d/edge, 0.0, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
+
+ return ret;
+}
+
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen, sample).r;
+ vec2 sc = vec2(pos_screen.xy)*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec4 frag = vary_fragcoord;
+ frag.xyz /= frag.w;
+ frag.xyz = frag.xyz*0.5+0.5;
+ frag.xy *= screen_res;
+ ivec2 itc = ivec2(frag.xy);
+
+ vec3 fcol = vec3(0,0,0);
+ int wght = 0;
+
+ for (int i = 0; i < samples; ++i)
+ {
+ vec3 pos = getPosition(itc, i).xyz;
+ vec3 lv = vary_light.xyz-pos.xyz;
+ float dist2 = dot(lv,lv);
+ dist2 /= vary_light.w;
+ if (dist2 <= 1.0)
+ {
+ vec3 norm = texelFetch(normalMap, itc, i).xyz*2.0-1.0;
+
+ norm = normalize(norm);
+ float l_dist = -dot(lv, proj_n);
+
+ vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
+ if (proj_tc.z >= 0.0)
+ {
+ proj_tc.xyz /= proj_tc.w;
+
+ float fa = gl_Color.a+1.0;
+ float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
+ if (dist_atten > 0.0)
+ {
+ lv = proj_origin-pos.xyz;
+ lv = normalize(lv);
+ float da = dot(norm, lv);
+
+ vec3 col = vec3(0,0,0);
+
+ vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb;
+
+ float noise = texture2D(noiseMap, frag.xy/128.0).b;
+ if (proj_tc.z > 0.0 &&
+ proj_tc.x < 1.0 &&
+ proj_tc.y < 1.0 &&
+ proj_tc.x > 0.0 &&
+ proj_tc.y > 0.0)
+ {
+ float lit = 0.0;
+ float amb_da = proj_ambiance;
+
+ if (da > 0.0)
+ {
+ float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
+ float lod = diff * proj_lod;
+
+ vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
+
+ vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+
+ lit = da * dist_atten * noise;
+
+ col = lcol*lit*diff_tex;
+ amb_da += (da*0.5)*proj_ambiance;
+ }
+
+ //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
+ vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
+
+ amb_da += (da*da*0.5+0.5)*proj_ambiance;
+
+ amb_da *= dist_atten * noise;
+
+ amb_da = min(amb_da, 1.0-lit);
+
+ col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ }
+
+
+ vec4 spec = texelFetch(specularRect, itc, i);
+ if (spec.a > 0.0)
+ {
+ vec3 ref = reflect(normalize(pos), norm);
+
+ //project from point pos in direction ref to plane proj_p, proj_n
+ vec3 pdelta = proj_p-pos;
+ float ds = dot(ref, proj_n);
+
+ if (ds < 0.0)
+ {
+ vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
+
+ vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
+
+ if (stc.z > 0.0)
+ {
+ stc.xy /= stc.w;
+
+ float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
+
+ stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
+
+ if (stc.x < 1.0 &&
+ stc.y < 1.0 &&
+ stc.x > 0.0 &&
+ stc.y > 0.0)
+ {
+ vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
+ col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
+ }
+ }
+ }
+ }
+
+ fcol += col;
+ ++wght;
+ }
+ }
+ }
+ }
+
+ if (wght <= 0)
+ {
+ discard;
+ }
+
+ gl_FragColor.rgb = fcol/samples;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
new file mode 100644
index 0000000000..2cf7d194cc
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
@@ -0,0 +1,19 @@
+/**
+ * @file starsF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+uniform sampler2D diffuseMap;
+
+void main()
+{
+ vec4 col = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
+
+ gl_FragData[0] = col;
+ gl_FragData[1] = vec4(0,0,0,0);
+ gl_FragData[2] = vec4(0,0,1,0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
new file mode 100644
index 0000000000..c43125dad9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
@@ -0,0 +1,17 @@
+/**
+ * @file starsV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+
+void main()
+{
+ //transform vertex
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_FrontColor = gl_Color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
index 00093836a2..f20886565a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
//class 1, no shadow, no SSAO, should never be called
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl
new file mode 100644
index 0000000000..f20886565a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl
@@ -0,0 +1,17 @@
+/**
+ * @file sunLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+//class 1, no shadow, no SSAO, should never be called
+
+#extension GL_ARB_texture_rectangle : enable
+
+void main()
+{
+ gl_FragColor = vec4(0,0,0,0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
index cd91351ad4..665d8126a0 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -35,7 +35,7 @@ uniform float shadow_offset;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl
new file mode 100644
index 0000000000..32d1b2149a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl
@@ -0,0 +1,123 @@
+/**
+ * @file sunLightSSAOF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+//class 1 -- no shadow, SSAO only
+
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2D noiseMap;
+
+
+// Inputs
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform float ssao_radius;
+uniform float ssao_max_radius;
+uniform float ssao_factor;
+uniform float ssao_factor_inv;
+
+varying vec2 vary_fragcoord;
+varying vec4 vary_light;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+uniform float shadow_bias;
+uniform float shadow_offset;
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen, sample).r;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+//calculate decreases in ambient lighting when crowded out (SSAO)
+float calcAmbientOcclusion(vec4 pos, vec3 norm, int sample)
+{
+ float ret = 1.0;
+
+ vec2 kern[8];
+ // exponentially (^2) distant occlusion samples spread around origin
+ kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
+ kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
+ kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
+ kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
+ kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
+ kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
+ kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
+ kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
+
+ vec2 pos_screen = vary_fragcoord.xy;
+ vec3 pos_world = pos.xyz;
+ vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
+
+ float angle_hidden = 0.0;
+ int points = 0;
+
+ float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
+
+ // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations unrolling?)
+ for (int i = 0; i < 8; i++)
+ {
+ ivec2 samppos_screen = ivec2(pos_screen + scale * reflect(kern[i], noise_reflect));
+ vec3 samppos_world = getPosition(samppos_screen, sample).xyz;
+
+ vec3 diff = pos_world - samppos_world;
+ float dist2 = dot(diff, diff);
+
+ // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
+ // --> solid angle shrinking by the square of distance
+ //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
+ //(k should vary inversely with # of samples, but this is taken care of later)
+
+ angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+
+ // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
+ points = points + int(diff.z > -1.0);
+ }
+
+ angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
+
+ ret = (1.0 - (float(points != 0) * angle_hidden));
+
+ return min(ret, 1.0);
+}
+
+void main()
+{
+ vec2 pos_screen = vary_fragcoord.xy;
+ ivec2 itc = ivec2(pos_screen);
+
+ float col = 0;
+
+ for (int i = 0; i < samples; i++)
+ {
+ vec4 pos = getPosition(itc, i);
+ vec3 norm = texelFetch(normalMap, itc, i).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ col += calcAmbientOcclusion(pos,norm,i);
+ }
+
+ col /= samples;
+
+ gl_FragColor[0] = 1.0;
+ gl_FragColor[1] = col;
+ gl_FragColor[2] = 1.0;
+ gl_FragColor[3] = 1.0;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
index 9beb513ad8..814deb3677 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 vary_light;
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
index 0edae47918..d005f67bf6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D detail_0;
uniform sampler2D detail_1;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
index a6163063be..3038fd2966 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_normal;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
index c54d9a1e3e..de7e038402 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
index 29689ecbaf..a9bef4292d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_normal;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
index e76f598d09..2710422d32 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
index 649e392630..5397290b11 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
index f2023fa5ea..32f5f5f236 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl
new file mode 100644
index 0000000000..9267a8585d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl
@@ -0,0 +1,38 @@
+/**
+ * @file glowExtractF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseMap;
+uniform float minLuminance;
+uniform float maxExtractAlpha;
+uniform vec3 lumWeights;
+uniform vec3 warmthWeights;
+uniform float warmthAmount;
+
+void main()
+{
+ ivec2 itc = ivec2(gl_TexCoord[0].xy);
+ vec4 fcol = vec4(0,0,0,0);
+
+ for (int i = 0; i < samples; i++)
+ {
+ vec4 col = texelFetch(diffuseMap, itc, i);
+
+ /// CALCULATING LUMINANCE (Using NTSC lum weights)
+ /// http://en.wikipedia.org/wiki/Luma_%28video%29
+ float lum = smoothstep(minLuminance, minLuminance+1.0, dot(col.rgb, lumWeights ) );
+ float warmth = smoothstep(minLuminance, minLuminance+1.0, max(col.r * warmthWeights.r, max(col.g * warmthWeights.g, col.b * warmthWeights.b)) );
+
+ fcol += vec4(col.rgb, max(col.a, mix(lum, warmth, warmthAmount) * maxExtractAlpha));
+ }
+
+ gl_FragColor = fcol/samples;
+}
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
index 0ca0608b45..76736fed53 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
index 65fc2e9f99..d3225546b3 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform float glowStrength;
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
index 0bd44cec90..9bb41626ae 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 glowDelta;
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
index ac00f15b35..cdc2ca3da2 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D detail0;
uniform sampler2D detail1;
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
index 1e19ee7699..8af981915b 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
index 34f78565a5..d94d986581 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// this class1 shader is just a copy of terrainF
diff --git a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
index 0dfac84a6e..06854fcc0a 100644
--- a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
index 4e9c09b1ea..0f24e3c35a 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 scaleSoftClip(vec3 inColor);
vec3 atmosTransport(vec3 inColor);
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
index a34cf23790..630459b324 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 applyWaterFog(vec4 color)
{
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
index 161c794c68..831d6a761c 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
index 6f821f893d..f6c6d945de 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
index d1c98bf70c..f114f766bf 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void main()
{
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
index 9c59e8c3ad..1796730c92 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
index 1fee99c446..bfe0be9fdf 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
index fb5da21c72..6f1fe91007 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
index 1bdaccf9b8..19072cd052 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
@@ -6,7 +6,7 @@
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
index 2e94d3bbf1..0ae6dc89e2 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
@@ -6,7 +6,7 @@
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
index 714f9a2551..5d4bf2c33e 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l)
{
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
index 65b45f8081..574252af12 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l)
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
index 7f65ea76f7..29f575b7e5 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
index 8f13e6dc04..65da5a6825 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
index 56f31f6a79..d491f1102e 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
index 64d549ff52..ef38ee9699 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
index c5d084c132..286c92326b 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
index 732d246471..772a420e33 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 atmosAmbient(vec3 light);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
index 73e1a1ec26..da60a3ddf5 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
index afc3dc89bf..c0b72115dd 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void fullbright_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
index 3dc4294f67..391c06edc8 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void fullbright_shiny_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
index f0baeeeee5..f44a5ce32e 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
mat4 getObjectSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
index 02367b9439..31e0f0a429 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
index 5daf66fb31..8ffb252f57 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
void fullbright_shiny_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
index 02ff3cc2a9..e5dafa8c78 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
mat4 getObjectSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
index 38e07dbd80..3382384c99 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
index afaac4f69c..220f26614f 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void fullbright_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
index 2cf7a69baa..d079de5377 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void shiny_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
index 4146646058..cd655f3bb5 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
index 6ea83b721d..68a086dbc1 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
index e3babe2210..4649d1c47c 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void shiny_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
index d449d37c0c..b4e4dcfbbf 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
@@ -5,8 +5,6 @@
* $/LicenseInfo$
*/
-#version 120
-
void default_lighting();
void main()
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
index be38a14d52..900448035c 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index 0d8e14e2e3..b493f76fcc 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
index 68bd81e029..4ec5ee43b4 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void default_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
index f337bde329..3d05850ab3 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 atmosLighting(vec3 light)
{
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
index 4b402a7028..f1a0af21af 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 atmosAmbient(vec3 light)
{
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
index 20948b1e46..73bbd57315 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void setPositionEye(vec3 v);
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
index 8a2c2a7186..e0eb7b3767 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_PositionEye;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
index a1dd4ed5fe..a251213ff5 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_PositionEye;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
index 7aed1fd3b5..4958cb2f72 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec4 gamma;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
index 6780dc4d3e..75929bc609 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 atmosTransport(vec3 light)
{
diff --git a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
index 172c2ca078..3e8b719f93 100644
--- a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
index 6dfc1b952c..681e52de2a 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -5,11 +5,10 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2D diffuseMap;
uniform sampler2DRectShadow shadowMap0;
uniform sampler2DRectShadow shadowMap1;
uniform sampler2DRectShadow shadowMap2;
@@ -105,7 +104,7 @@ void main()
}
}
- vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 diff = diffuseLookup(gl_TexCoord[0].xy);
vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a);
vec4 color = diff * col;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
new file mode 100644
index 0000000000..5350359f75
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
@@ -0,0 +1,125 @@
+/**
+ * @file alphaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+
+uniform sampler2DRectShadow shadowMap0;
+uniform sampler2DRectShadow shadowMap1;
+uniform sampler2DRectShadow shadowMap2;
+uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DRect depthMap;
+uniform sampler2D diffuseMap;
+
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform vec2 screen_res;
+uniform vec2 shadow_res;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+varying vec3 vary_ambient;
+varying vec3 vary_directional;
+varying vec3 vary_fragcoord;
+varying vec3 vary_position;
+varying vec3 vary_pointlight_col;
+
+uniform float shadow_bias;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(vec2 pos_screen)
+{
+ float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos.xyz /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
+{
+ stc.xyz /= stc.w;
+ stc.z += shadow_bias;
+
+ float cs = shadow2DRect(shadowMap, stc.xyz).x;
+ float shadow = cs;
+
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs);
+
+ return shadow/5.0;
+}
+
+
+void main()
+{
+ vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+ frag *= screen_res;
+
+ float shadow = 1.0;
+ vec4 pos = vec4(vary_position, 1.0);
+
+ vec4 spos = pos;
+
+ if (spos.z > -shadow_clip.w)
+ {
+ vec4 lpos;
+
+ if (spos.z < -shadow_clip.z)
+ {
+ lpos = shadow_matrix[3]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap3, lpos, 1.5);
+ shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
+ }
+ else if (spos.z < -shadow_clip.y)
+ {
+ lpos = shadow_matrix[2]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap2, lpos, 1.5);
+ }
+ else if (spos.z < -shadow_clip.x)
+ {
+ lpos = shadow_matrix[1]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap1, lpos, 1.5);
+ }
+ else
+ {
+ lpos = shadow_matrix[0]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap0, lpos, 1.5);
+ }
+ }
+
+ vec4 diff = texture2D(diffuseMap,gl_TexCoord[0].xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ //gl_FragColor = gl_Color;
+ gl_FragColor = color;
+ //gl_FragColor.r = 0.0;
+ //gl_FragColor = vec4(1,shadow,1,1);
+
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
index d227346163..948a52da5b 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
index 86f014df35..f616ecc872 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
@@ -22,6 +22,7 @@ varying vec3 vary_directional;
varying vec3 vary_fragcoord;
varying vec3 vary_position;
varying vec3 vary_pointlight_col;
+varying float vary_texture_index;
uniform float near_clip;
uniform float shadow_offset;
@@ -35,19 +36,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
@@ -55,11 +61,13 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 vert = vec4(gl_Vertex.xyz, 1.0);
+ vary_texture_index = gl_Vertex.w;
+ gl_Position = gl_ModelViewProjectionMatrix * vert;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
+ vec4 pos = (gl_ModelViewMatrix * vert);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
@@ -94,7 +102,7 @@ void main()
gl_FogFragCoord = pos.z;
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ pos = gl_ModelViewProjectionMatrix * vert;
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
index 495e86c8db..01e40afc4f 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -37,19 +37,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
//get distance
float d = length(lv);
- //normalize light vector
- lv *= 1.0/d;
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv *= 1.0/d;
- //distance attenuation
- float dist2 = d*d/(la*la);
- float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ //distance attenuation
+ float dist2 = d*d/(la*la);
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- // spotlight coefficient.
- float spot = max(dot(-ln, lv), is_pointlight);
- da *= spot*spot; // GL_SPOT_EXPONENT=2
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
- //angular attenuation
- da *= calcDirectionalLight(n, lv);
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+ }
return da;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
index 3155f3f929..729e4b5543 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -22,7 +22,7 @@ uniform vec2 screen_res;
float getDepth(vec2 pos_screen)
{
- float z = texture2DRect(depthMap, pos_screen.xy).a;
+ float z = texture2DRect(depthMap, pos_screen.xy).r;
z = z*2.0-1.0;
vec4 ndc = vec4(0.0, 0.0, z, 1.0);
vec4 p = inv_proj*ndc;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl
new file mode 100644
index 0000000000..b22bc5b288
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl
@@ -0,0 +1,74 @@
+/**
+ * @file edgeF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+
+varying vec2 vary_fragcoord;
+
+uniform float depth_cutoff;
+uniform float norm_cutoff;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+float getDepth(ivec2 pos_screen, int sample)
+{
+ float z = texelFetch(depthMap, pos_screen, sample).r;
+ z = z*2.0-1.0;
+ vec4 ndc = vec4(0.0, 0.0, z, 1.0);
+ vec4 p = inv_proj*ndc;
+ return p.z/p.w;
+}
+
+void main()
+{
+ float e = 0;
+
+ ivec2 itc = ivec2(vary_fragcoord.xy);
+
+ for (int i = 0; i < samples; i++)
+ {
+ vec3 norm = texelFetch(normalMap, itc, i).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+ float depth = getDepth(itc, i);
+
+ vec2 tc = vary_fragcoord.xy;
+
+ int sc = 1;
+
+ vec2 de;
+ de.x = (depth-getDepth(itc+ivec2(sc, sc),i)) + (depth-getDepth(itc+ivec2(-sc, -sc), i));
+ de.y = (depth-getDepth(itc+ivec2(-sc, sc),i)) + (depth-getDepth(itc+ivec2(sc, -sc), i));
+ de /= depth;
+ de *= de;
+ de = step(depth_cutoff, de);
+
+ vec2 ne;
+ vec3 nexnorm = texelFetch(normalMap, itc+ivec2(-sc,-sc), i).rgb;
+ nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm
+ ne.x = dot(nexnorm, norm);
+ vec3 neynorm = texelFetch(normalMap, itc+ivec2(sc,sc), i).rgb;
+ neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm
+ ne.y = dot(neynorm, norm);
+
+ ne = 1.0-ne;
+
+ ne = step(norm_cutoff, ne);
+
+ e += dot(de,de)+dot(ne,ne);
+ }
+
+ e /= samples;
+
+ gl_FragColor.a = e;
+}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
index b3413c301f..393084a3db 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index d6cd984ebe..f54186ffca 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -91,7 +91,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl
new file mode 100644
index 0000000000..fee32be3e3
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl
@@ -0,0 +1,244 @@
+/**
+ * @file multiSpotLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS specularRect;
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2DRect lightMap;
+uniform sampler2D noiseMap;
+uniform sampler2D lightFunc;
+uniform sampler2D projectionMap;
+
+uniform mat4 proj_mat; //screen space to light space
+uniform float proj_near; //near clip for projection
+uniform vec3 proj_p; //plane projection is emitting from (in screen space)
+uniform vec3 proj_n;
+uniform float proj_focus; //distance from plane to begin blurring
+uniform float proj_lod; //(number of mips in proj map)
+uniform float proj_range; //range between near clip and far clip plane of projection
+uniform float proj_ambient_lod;
+uniform float proj_ambiance;
+uniform float near_clip;
+uniform float far_clip;
+
+uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
+uniform float sun_wash;
+uniform int proj_shadow_idx;
+uniform float shadow_fade;
+
+varying vec4 vary_light;
+
+varying vec4 vary_fragcoord;
+uniform vec2 screen_res;
+
+uniform mat4 inv_proj;
+
+vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float det = max(1.0-lod/(proj_lod*0.5), 0.0);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
+
+ float det = min(lod/(proj_lod*0.5), 1.0);
+
+ float d = min(dist.x, dist.y);
+
+ float edge = 0.25*det;
+
+ ret *= clamp(d/edge, 0.0, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
+
+ return ret;
+}
+
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen, sample).r;
+ vec2 sc = vec2(pos_screen.xy)*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ int wght = 0;
+
+ vec3 fcol = vec3(0,0,0);
+
+ vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
+
+ ivec2 itc = ivec2(frag.xy);
+
+ float shadow = 1.0;
+
+ if (proj_shadow_idx >= 0)
+ {
+ vec4 shd = texture2DRect(lightMap, frag);
+ float sh[2];
+ sh[0] = shd.b;
+ sh[1] = shd.a;
+ shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0);
+ }
+
+ for (int i = 0; i < samples; i++)
+ {
+ vec3 pos = getPosition(itc, i).xyz;
+ vec3 lv = vary_light.xyz-pos.xyz;
+ float dist2 = dot(lv,lv);
+ dist2 /= vary_light.w;
+ if (dist2 <= 1.0)
+ {
+ vec3 norm = texelFetch(normalMap, itc, i).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+
+ norm = normalize(norm);
+ float l_dist = -dot(lv, proj_n);
+
+ vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
+ if (proj_tc.z >= 0.0)
+ {
+ proj_tc.xyz /= proj_tc.w;
+
+ float fa = gl_Color.a+1.0;
+ float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
+ if (dist_atten > 0.0)
+ {
+ lv = proj_origin-pos.xyz;
+ lv = normalize(lv);
+ float da = dot(norm, lv);
+
+ vec3 col = vec3(0,0,0);
+
+ vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb;
+
+ float noise = texture2D(noiseMap, frag.xy/128.0).b;
+ if (proj_tc.z > 0.0 &&
+ proj_tc.x < 1.0 &&
+ proj_tc.y < 1.0 &&
+ proj_tc.x > 0.0 &&
+ proj_tc.y > 0.0)
+ {
+ float lit = 0.0;
+ float amb_da = proj_ambiance;
+
+ if (da > 0.0)
+ {
+ float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
+ float lod = diff * proj_lod;
+
+ vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
+
+ vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+
+ lit = da * dist_atten * noise;
+
+ col = lcol*lit*diff_tex*shadow;
+ amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;
+ }
+
+ //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
+ vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
+
+ amb_da += (da*da*0.5+0.5)*proj_ambiance;
+
+ amb_da *= dist_atten * noise;
+
+ amb_da = min(amb_da, 1.0-lit);
+
+ col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ }
+
+
+ vec4 spec = texelFetch(specularRect, itc, i);
+ if (spec.a > 0.0)
+ {
+ vec3 ref = reflect(normalize(pos), norm);
+
+ //project from point pos in direction ref to plane proj_p, proj_n
+ vec3 pdelta = proj_p-pos;
+ float ds = dot(ref, proj_n);
+
+ if (ds < 0.0)
+ {
+ vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
+
+ vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
+
+ if (stc.z > 0.0)
+ {
+ stc.xy /= stc.w;
+
+ float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
+
+ stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
+
+ if (stc.x < 1.0 &&
+ stc.y < 1.0 &&
+ stc.x > 0.0 &&
+ stc.y > 0.0)
+ {
+ vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
+ col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
+ }
+ }
+ }
+ }
+
+ fcol += col;
+ wght++;
+ }
+ }
+ }
+ }
+
+ if (wght <= 0)
+ {
+ discard;
+ }
+
+ gl_FragColor.rgb = fcol/samples;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index 0160e84278..66a1a8515f 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -71,7 +71,7 @@ vec4 getPosition_d(vec2 pos_screen, float depth)
vec4 getPosition(vec2 pos_screen)
{ //get position in screen space (world units) given window coordinate and depth map
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
return getPosition_d(pos_screen, depth);
}
@@ -258,7 +258,7 @@ vec3 scaleSoftClip(vec3 light)
void main()
{
vec2 tc = vary_fragcoord.xy;
- float depth = texture2DRect(depthMap, tc.xy).a;
+ float depth = texture2DRect(depthMap, tc.xy).r;
vec3 pos = getPosition_d(tc, depth).xyz;
vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
@@ -288,54 +288,8 @@ void main()
float sa = dot(refnormpersp, vary_light.xyz);
vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a;
- /*
- // screen-space cheap fakey reflection map
- //
- vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz));
- depth -= 0.5; // unbias depth
- // first figure out where we'll make our 2D guess from
- vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth;
- // Offset the guess source a little according to a trivial
- // checkerboard dither function and spec.a.
- // This is meant to be similar to sampling a blurred version
- // of the diffuse map. LOD would be better in that regard.
- // The goal of the blur is to soften reflections in surfaces
- // with low shinyness, and also to disguise our lameness.
- float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0
- float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5);
- ref2d += vec2(checkoffset, checkoffset);
- ref2d += tc.xy; // use as offset from destination
- // Get attributes from the 2D guess point.
- // We average two samples of diffuse (not of anything else) per
- // pixel to try to reduce aliasing some more.
- vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb +
- texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb);
- float refdepth = texture2DRect(depthMap, ref2d).a;
- vec3 refpos = getPosition_d(ref2d, refdepth).xyz;
- float refshad = texture2DRect(lightMap, ref2d).r;
- vec3 refn = texture2DRect(normalMap, ref2d).rgb;
- refn = vec3((refn.xy-0.5)*2.0,refn.z); // unpack norm
- refn = normalize(refn);
- // figure out how appropriate our guess actually was
- float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos)));
- // darken reflections from points which face away from the reflected ray - our guess was a back-face
- //refapprop *= step(dot(refnorm, refn), 0.0);
- refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant
- // get appropriate light strength for guess-point
- // reflect light direction to increase the illusion that
- // these are reflections.
- vec3 reflight = reflect(lightnorm.xyz, norm.xyz);
- float reflit = min(max(dot(refn, reflight.xyz), 0.0), refshad);
- // apply sun color to guess-point, dampen according to inappropriateness of guess
- float refmod = min(refapprop, reflit);
- vec3 refprod = vary_SunlitColor * refcol.rgb * refmod;
- vec3 ssshiny = (refprod * spec.a);
- ssshiny *= 0.3; // dampen it even more
- */
- vec3 ssshiny = vec3(0,0,0);
-
// add the two types of shiny together
- col += (ssshiny + dumbshiny) * spec.rgb;
+ col += dumbshiny * spec.rgb;
}
col = atmosLighting(col);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl
new file mode 100644
index 0000000000..0bae10ca7d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl
@@ -0,0 +1,307 @@
+/**
+ * @file softenLightMSF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS specularRect;
+uniform sampler2DMS normalMap;
+uniform sampler2DRect lightMap;
+uniform sampler2DMS depthMap;
+uniform sampler2D noiseMap;
+uniform samplerCube environmentMap;
+uniform sampler2D lightFunc;
+uniform vec3 gi_quad;
+
+uniform float blur_size;
+uniform float blur_fidelity;
+
+// Inputs
+uniform vec4 morphFactor;
+uniform vec3 camPosLocal;
+//uniform vec4 camPosWorld;
+uniform vec4 gamma;
+uniform vec4 lightnorm;
+uniform vec4 sunlight_color;
+uniform vec4 ambient;
+uniform vec4 blue_horizon;
+uniform vec4 blue_density;
+uniform vec4 haze_horizon;
+uniform vec4 haze_density;
+uniform vec4 cloud_shadow;
+uniform vec4 density_multiplier;
+uniform vec4 distance_multiplier;
+uniform vec4 max_y;
+uniform vec4 glow;
+uniform float scene_light_strength;
+uniform vec3 env_mat[3];
+uniform vec4 shadow_clip;
+uniform mat3 ssao_effect_mat;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+varying vec4 vary_light;
+varying vec2 vary_fragcoord;
+
+vec3 vary_PositionEye;
+
+vec3 vary_SunlitColor;
+vec3 vary_AmblitColor;
+vec3 vary_AdditiveColor;
+vec3 vary_AtmosAttenuation;
+
+vec4 getPosition_d(vec2 pos_screen, float depth)
+{
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+vec3 getSunlitColor()
+{
+ return vary_SunlitColor;
+}
+vec3 getAmblitColor()
+{
+ return vary_AmblitColor;
+}
+vec3 getAdditiveColor()
+{
+ return vary_AdditiveColor;
+}
+vec3 getAtmosAttenuation()
+{
+ return vary_AtmosAttenuation;
+}
+
+
+void setPositionEye(vec3 v)
+{
+ vary_PositionEye = v;
+}
+
+void setSunlitColor(vec3 v)
+{
+ vary_SunlitColor = v;
+}
+
+void setAmblitColor(vec3 v)
+{
+ vary_AmblitColor = v;
+}
+
+void setAdditiveColor(vec3 v)
+{
+ vary_AdditiveColor = v;
+}
+
+void setAtmosAttenuation(vec3 v)
+{
+ vary_AtmosAttenuation = v;
+}
+
+void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
+
+ vec3 P = inPositionEye;
+ setPositionEye(P);
+
+ //(TERRAIN) limit altitude
+ if (P.y > max_y.x) P *= (max_y.x / P.y);
+ if (P.y < -max_y.x) P *= (-max_y.x / P.y);
+
+ vec3 tmpLightnorm = lightnorm.xyz;
+
+ vec3 Pn = normalize(P);
+ float Plen = length(P);
+
+ vec4 temp1 = vec4(0);
+ vec3 temp2 = vec3(0);
+ vec4 blue_weight;
+ vec4 haze_weight;
+ vec4 sunlight = sunlight_color;
+ vec4 light_atten;
+
+ //sunlight attenuation effect (hue and brightness) due to atmosphere
+ //this is used later for sunlight modulation at various altitudes
+ light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
+ //I had thought blue_density and haze_density should have equal weighting,
+ //but attenuation due to haze_density tends to seem too strong
+
+ temp1 = blue_density + vec4(haze_density.r);
+ blue_weight = blue_density / temp1;
+ haze_weight = vec4(haze_density.r) / temp1;
+
+ //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
+ temp2.y = max(0.0, tmpLightnorm.y);
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // main atmospheric scattering line integral
+ temp2.z = Plen * density_multiplier.x;
+
+ // Transparency (-> temp1)
+ // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
+ // compiler gets confused.
+ temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
+
+ //final atmosphere attenuation factor
+ setAtmosAttenuation(temp1.rgb);
+
+ //compute haze glow
+ //(can use temp2.x as temp because we haven't used it yet)
+ temp2.x = dot(Pn, tmpLightnorm.xyz);
+ temp2.x = 1. - temp2.x;
+ //temp2.x is 0 at the sun and increases away from sun
+ temp2.x = max(temp2.x, .03); //was glow.y
+ //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+ temp2.x *= glow.x;
+ //higher glow.x gives dimmer glow (because next step is 1 / "angle")
+ temp2.x = pow(temp2.x, glow.z);
+ //glow.z should be negative, so we're doing a sort of (1 / "angle") function
+
+ //add "minimum anti-solar illumination"
+ temp2.x += .25;
+
+ //increase ambient when there are more clouds
+ vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5;
+
+ /* decrease value and saturation (that in HSV, not HSL) for occluded areas
+ * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
+ * // The following line of code performs the equivalent of:
+ * float ambAlpha = tmpAmbient.a;
+ * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis
+ * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue);
+ * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha);
+ */
+ tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);
+
+ //haze color
+ setAdditiveColor(
+ vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
+ + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
+ + tmpAmbient)));
+
+ //brightness of surface both sunlight and ambient
+ setSunlitColor(vec3(sunlight * .5));
+ setAmblitColor(vec3(tmpAmbient * .25));
+ setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));
+}
+
+vec3 atmosLighting(vec3 light)
+{
+ light *= getAtmosAttenuation().r;
+ light += getAdditiveColor();
+ return (2.0 * light);
+}
+
+vec3 atmosTransport(vec3 light) {
+ light *= getAtmosAttenuation().r;
+ light += getAdditiveColor() * 2.0;
+ return light;
+}
+vec3 atmosGetDiffuseSunlightColor()
+{
+ return getSunlitColor();
+}
+
+vec3 scaleDownLight(vec3 light)
+{
+ return (light / scene_light_strength );
+}
+
+vec3 scaleUpLight(vec3 light)
+{
+ return (light * scene_light_strength);
+}
+
+vec3 atmosAmbient(vec3 light)
+{
+ return getAmblitColor() + light / 2.0;
+}
+
+vec3 atmosAffectDirectionalLight(float lightIntensity)
+{
+ return getSunlitColor() * lightIntensity;
+}
+
+vec3 scaleSoftClip(vec3 light)
+{
+ //soft clip effect:
+ light = 1. - clamp(light, vec3(0.), vec3(1.));
+ light = 1. - pow(light, gamma.xxx);
+
+ return light;
+}
+
+void main()
+{
+ vec2 tc = vary_fragcoord.xy;
+ ivec2 itc = ivec2(tc);
+
+ vec3 fcol = vec3(0,0,0);
+
+ vec2 scol_ambocc = texture2DRect(lightMap, tc).rg;
+ float ambocc = scol_ambocc.g;
+
+ for (int i = 0; i < samples; ++i)
+ {
+ float depth = texelFetch(depthMap, itc.xy, i).r;
+ vec3 pos = getPosition_d(tc, depth).xyz;
+ vec3 norm = texelFetch(normalMap, itc, i).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+
+ float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
+
+ vec4 diffuse = texelFetch(diffuseRect, itc, i);
+ vec4 spec = texelFetch(specularRect, itc, i);
+
+ float amb = 0;
+
+ float scol = max(scol_ambocc.r, diffuse.a);
+ amb += ambocc;
+
+ calcAtmospherics(pos.xyz, ambocc);
+
+ vec3 col = atmosAmbient(vec3(0));
+ col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));
+
+ col *= diffuse.rgb;
+
+ if (spec.a > 0.0) // specular reflection
+ {
+ // the old infinite-sky shiny reflection
+ //
+ vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
+ float sa = dot(refnormpersp, vary_light.xyz);
+ vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a;
+
+ // add the two types of shiny together
+ col += dumbshiny * spec.rgb;
+ }
+
+ col = atmosLighting(col);
+ col = scaleSoftClip(col);
+
+ fcol += col;
+ }
+
+ gl_FragColor.rgb = fcol/samples;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
index 8f0bcca76b..745cc01992 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index 50b9ef276e..cd3828fbd4 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl
new file mode 100644
index 0000000000..ec9b547a47
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl
@@ -0,0 +1,245 @@
+/**
+ * @file multiSpotLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS diffuseRect;
+uniform sampler2DMS specularRect;
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2DRect lightMap;
+uniform sampler2D noiseMap;
+uniform sampler2D lightFunc;
+uniform sampler2D projectionMap;
+
+uniform mat4 proj_mat; //screen space to light space
+uniform float proj_near; //near clip for projection
+uniform vec3 proj_p; //plane projection is emitting from (in screen space)
+uniform vec3 proj_n;
+uniform float proj_focus; //distance from plane to begin blurring
+uniform float proj_lod; //(number of mips in proj map)
+uniform float proj_range; //range between near clip and far clip plane of projection
+uniform float proj_ambient_lod;
+uniform float proj_ambiance;
+uniform float near_clip;
+uniform float far_clip;
+
+uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
+uniform float sun_wash;
+uniform int proj_shadow_idx;
+uniform float shadow_fade;
+
+varying vec4 vary_light;
+
+varying vec4 vary_fragcoord;
+uniform vec2 screen_res;
+
+uniform mat4 inv_proj;
+
+vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float det = max(1.0-lod/(proj_lod*0.5), 0.0);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));
+
+ float det = min(lod/(proj_lod*0.5), 1.0);
+
+ float d = min(dist.x, dist.y);
+
+ float edge = 0.25*det;
+
+ ret *= clamp(d/edge, 0.0, 1.0);
+
+ return ret;
+}
+
+vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
+{
+ vec4 ret = texture2DLod(projectionMap, tc, lod);
+
+ vec2 dist = tc-vec2(0.5);
+
+ float d = dot(dist,dist);
+
+ ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0);
+
+ return ret;
+}
+
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen, sample).r;
+ vec2 sc = vec2(pos_screen.xy)*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec4 frag = vary_fragcoord;
+ frag.xyz /= frag.w;
+ frag.xyz = frag.xyz*0.5+0.5;
+ frag.xy *= screen_res;
+ ivec2 itc = ivec2(frag.xy);
+
+ vec3 fcol = vec3(0,0,0);
+ int wght = 0;
+
+ float shadow = 1.0;
+
+ if (proj_shadow_idx >= 0)
+ {
+ vec4 shd = texture2DRect(lightMap, frag.xy);
+ float sh[2];
+ sh[0] = shd.b;
+ sh[1] = shd.a;
+ shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0);
+ }
+
+ for (int i = 0; i < samples; i++)
+ {
+ vec3 pos = getPosition(itc, i).xyz;
+ vec3 lv = vary_light.xyz-pos.xyz;
+ float dist2 = dot(lv,lv);
+ dist2 /= vary_light.w;
+ if (dist2 <= 1.0)
+ {
+ vec3 norm = texelFetch(normalMap, itc, i).xyz;
+ norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
+
+ norm = normalize(norm);
+ float l_dist = -dot(lv, proj_n);
+
+ vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
+ if (proj_tc.z >= 0.0)
+ {
+ proj_tc.xyz /= proj_tc.w;
+
+ float fa = gl_Color.a+1.0;
+ float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
+ if (dist_atten > 0.0)
+ {
+ lv = proj_origin-pos.xyz;
+ lv = normalize(lv);
+ float da = dot(norm, lv);
+
+ vec3 col = vec3(0,0,0);
+
+ vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb;
+
+ float noise = texture2D(noiseMap, frag.xy/128.0).b;
+ if (proj_tc.z > 0.0 &&
+ proj_tc.x < 1.0 &&
+ proj_tc.y < 1.0 &&
+ proj_tc.x > 0.0 &&
+ proj_tc.y > 0.0)
+ {
+ float lit = 0.0;
+ float amb_da = proj_ambiance;
+
+ if (da > 0.0)
+ {
+ float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0);
+ float lod = diff * proj_lod;
+
+ vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
+
+ vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+
+ lit = da * dist_atten * noise;
+
+ col = lcol*lit*diff_tex*shadow;
+ amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance;
+ }
+
+ //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
+ vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
+
+ amb_da += (da*da*0.5+0.5)*proj_ambiance;
+
+ amb_da *= dist_atten * noise;
+
+ amb_da = min(amb_da, 1.0-lit);
+
+ col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ }
+
+
+ vec4 spec = texelFetch(specularRect, itc, i);
+ if (spec.a > 0.0)
+ {
+ vec3 ref = reflect(normalize(pos), norm);
+
+ //project from point pos in direction ref to plane proj_p, proj_n
+ vec3 pdelta = proj_p-pos;
+ float ds = dot(ref, proj_n);
+
+ if (ds < 0.0)
+ {
+ vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds;
+
+ vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0));
+
+ if (stc.z > 0.0)
+ {
+ stc.xy /= stc.w;
+
+ float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0);
+
+ stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5);
+
+ if (stc.x < 1.0 &&
+ stc.y < 1.0 &&
+ stc.x > 0.0 &&
+ stc.y > 0.0)
+ {
+ vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
+ col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
+ }
+ }
+ }
+ }
+
+ fcol += col;
+ wght++;
+ }
+ }
+ }
+ }
+
+ if (wght <= 0)
+ {
+ discard;
+ }
+
+ gl_FragColor.rgb = fcol/wght;
+ gl_FragColor.a = 0.0;
+}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index 4369b3b34f..315139b415 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -45,7 +45,7 @@ uniform float spot_shadow_offset;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl
new file mode 100644
index 0000000000..63d13c996d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl
@@ -0,0 +1,202 @@
+/**
+ * @file sunLightMSF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+//class 2, shadows, no SSAO
+
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2DRectShadow shadowMap0;
+uniform sampler2DRectShadow shadowMap1;
+uniform sampler2DRectShadow shadowMap2;
+uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DShadow shadowMap4;
+uniform sampler2DShadow shadowMap5;
+
+
+// Inputs
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform float ssao_radius;
+uniform float ssao_max_radius;
+uniform float ssao_factor;
+uniform float ssao_factor_inv;
+
+varying vec2 vary_fragcoord;
+varying vec4 vary_light;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+uniform vec2 shadow_res;
+uniform vec2 proj_shadow_res;
+
+uniform float shadow_bias;
+uniform float shadow_offset;
+
+uniform float spot_shadow_bias;
+uniform float spot_shadow_offset;
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen.xy, sample).r;
+ vec2 sc = vec2(pos_screen.xy)*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
+{
+ stc.xyz /= stc.w;
+ stc.z += shadow_bias*scl;
+
+ float cs = shadow2DRect(shadowMap, stc.xyz).x;
+ float shadow = cs;
+
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs);
+
+ return shadow/5.0;
+
+ //return shadow;
+}
+
+float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
+{
+ stc.xyz /= stc.w;
+ stc.z += spot_shadow_bias*scl;
+
+ float cs = shadow2D(shadowMap, stc.xyz).x;
+ float shadow = cs;
+
+ vec2 off = 1.5/proj_shadow_res;
+
+ shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, off.y, 0.0)).x, cs);
+ shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs);
+ shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs);
+ shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs);
+
+ return shadow/5.0;
+
+ //return shadow;
+}
+
+void main()
+{
+ vec2 pos_screen = vary_fragcoord.xy;
+ ivec2 itc = ivec2(pos_screen);
+
+ //try doing an unproject here
+
+ vec4 fcol = vec4(0,0,0,0);
+
+ for (int i = 0; i < samples; i++)
+ {
+ vec4 pos = getPosition(itc, i);
+
+ vec4 nmap4 = texelFetch(normalMap, itc, i);
+ nmap4 = vec4((nmap4.xy-0.5)*2.0,nmap4.z,nmap4.w); // unpack norm
+ float displace = nmap4.w;
+ vec3 norm = nmap4.xyz;
+
+ /*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL
+ {
+ gl_FragColor = vec4(0.0); // doesn't matter
+ return;
+ }*/
+
+ float shadow = 1.0;
+ float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
+
+ vec3 shadow_pos = pos.xyz + displace*norm;
+ vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
+
+ vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
+
+ if (spos.z > -shadow_clip.w)
+ {
+ if (dp_directional_light == 0.0)
+ {
+ // if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup
+ shadow = 0.0;
+ }
+ else
+ {
+ vec4 lpos;
+
+ if (spos.z < -shadow_clip.z)
+ {
+ lpos = shadow_matrix[3]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap3, lpos, 0.25);
+ shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
+ }
+ else if (spos.z < -shadow_clip.y)
+ {
+ lpos = shadow_matrix[2]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap2, lpos, 0.5);
+ }
+ else if (spos.z < -shadow_clip.x)
+ {
+ lpos = shadow_matrix[1]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap1, lpos, 0.75);
+ }
+ else
+ {
+ lpos = shadow_matrix[0]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap0, lpos, 1.0);
+ }
+
+ // take the most-shadowed value out of these two:
+ // * the blurred sun shadow in the light (shadow) map
+ // * an unblurred dot product between the sun and this norm
+ // the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting
+ shadow = min(shadow, dp_directional_light);
+
+ //lpos.xy /= lpos.w*32.0;
+ //if (fract(lpos.x) < 0.1 || fract(lpos.y) < 0.1)
+ //{
+ // shadow = 0.0;
+ //}
+
+ }
+ }
+ else
+ {
+ // more distant than the shadow map covers
+ shadow = 1.0;
+ }
+
+ fcol[0] += shadow;
+ fcol[1] += 1.0;
+
+ spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0);
+
+ //spotlight shadow 1
+ vec4 lpos = shadow_matrix[4]*spos;
+ fcol[2] += pcfShadow(shadowMap4, lpos, 0.8);
+
+ //spotlight shadow 2
+ lpos = shadow_matrix[5]*spos;
+ fcol[3] += pcfShadow(shadowMap5, lpos, 0.8);
+ }
+
+ gl_FragColor = fcol/samples;
+}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
index 847b36b1ac..6dbcc479e1 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -5,7 +5,7 @@
* $License$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
@@ -45,7 +45,7 @@ uniform float spot_shadow_offset;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl
new file mode 100644
index 0000000000..a2a76eed9f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl
@@ -0,0 +1,241 @@
+/**
+ * @file sunLightSSAOF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+
+#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_texture_multisample : enable
+
+//class 2 -- shadows and SSAO
+
+uniform sampler2DMS depthMap;
+uniform sampler2DMS normalMap;
+uniform sampler2DRectShadow shadowMap0;
+uniform sampler2DRectShadow shadowMap1;
+uniform sampler2DRectShadow shadowMap2;
+uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DShadow shadowMap4;
+uniform sampler2DShadow shadowMap5;
+uniform sampler2D noiseMap;
+
+// Inputs
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform float ssao_radius;
+uniform float ssao_max_radius;
+uniform float ssao_factor;
+uniform float ssao_factor_inv;
+
+varying vec2 vary_fragcoord;
+varying vec4 vary_light;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+uniform vec2 shadow_res;
+uniform vec2 proj_shadow_res;
+
+uniform float shadow_bias;
+uniform float shadow_offset;
+
+uniform float spot_shadow_bias;
+uniform float spot_shadow_offset;
+
+vec4 getPosition(ivec2 pos_screen, int sample)
+{
+ float depth = texelFetch(depthMap, pos_screen, sample).r;
+ vec2 sc = vec2(pos_screen.xy)*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+//calculate decreases in ambient lighting when crowded out (SSAO)
+float calcAmbientOcclusion(vec4 pos, vec3 norm, int sample)
+{
+ float ret = 1.0;
+
+ vec2 kern[8];
+ // exponentially (^2) distant occlusion samples spread around origin
+ kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
+ kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
+ kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
+ kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
+ kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
+ kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
+ kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
+ kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
+
+ vec2 pos_screen = vary_fragcoord.xy;
+ vec3 pos_world = pos.xyz;
+ vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
+
+ float angle_hidden = 0.0;
+ int points = 0;
+
+ float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
+
+ // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
+ for (int i = 0; i < 8; i++)
+ {
+ ivec2 samppos_screen = ivec2(pos_screen + scale * reflect(kern[i], noise_reflect));
+ vec3 samppos_world = getPosition(samppos_screen, sample).xyz;
+
+ vec3 diff = pos_world - samppos_world;
+ float dist2 = dot(diff, diff);
+
+ // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
+ // --> solid angle shrinking by the square of distance
+ //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
+ //(k should vary inversely with # of samples, but this is taken care of later)
+
+ angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+
+ // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
+ points = points + int(diff.z > -1.0);
+ }
+
+ angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
+
+ ret = (1.0 - (float(points != 0) * angle_hidden));
+
+ return min(ret, 1.0);
+}
+
+float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
+{
+ stc.xyz /= stc.w;
+ stc.z += shadow_bias*scl;
+
+ float cs = shadow2DRect(shadowMap, stc.xyz).x;
+ float shadow = cs;
+
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs);
+
+ return shadow/5.0;
+
+ //return shadow;
+}
+
+float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
+{
+ stc.xyz /= stc.w;
+ stc.z += spot_shadow_bias*scl;
+
+ float cs = shadow2D(shadowMap, stc.xyz).x;
+ float shadow = cs;
+
+ vec2 off = 1.5/proj_shadow_res;
+
+ shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, off.y, 0.0)).x, cs);
+ shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs);
+ shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs);
+ shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs);
+
+
+ return shadow/5.0;
+
+ //return shadow;
+}
+
+void main()
+{
+ vec2 pos_screen = vary_fragcoord.xy;
+ ivec2 itc = ivec2(pos_screen);
+ vec4 fcol = vec4(0,0,0,0);
+
+ for (int i = 0; i < samples; i++)
+ {
+ vec4 pos = getPosition(itc, i);
+
+ vec4 nmap4 = texelFetch(normalMap, itc, i);
+ nmap4 = vec4((nmap4.xy-0.5)*2.0,nmap4.z,nmap4.w); // unpack norm
+ float displace = nmap4.w;
+ vec3 norm = nmap4.xyz;
+
+ float shadow = 1.0;
+ float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
+
+ vec3 shadow_pos = pos.xyz + displace*norm;
+ vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
+
+ vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
+
+ if (spos.z > -shadow_clip.w)
+ {
+ if (dp_directional_light == 0.0)
+ {
+ // if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup
+ shadow = 0.0;
+ }
+ else
+ {
+ vec4 lpos;
+
+ if (spos.z < -shadow_clip.z)
+ {
+ lpos = shadow_matrix[3]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap3, lpos, 0.25);
+ shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
+ }
+ else if (spos.z < -shadow_clip.y)
+ {
+ lpos = shadow_matrix[2]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap2, lpos, 0.5);
+ }
+ else if (spos.z < -shadow_clip.x)
+ {
+ lpos = shadow_matrix[1]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap1, lpos, 0.75);
+ }
+ else
+ {
+ lpos = shadow_matrix[0]*spos;
+ lpos.xy *= shadow_res;
+ shadow = pcfShadow(shadowMap0, lpos, 1.0);
+ }
+
+ // take the most-shadowed value out of these two:
+ // * the blurred sun shadow in the light (shadow) map
+ // * an unblurred dot product between the sun and this norm
+ // the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting
+ shadow = min(shadow, dp_directional_light);
+
+ }
+ }
+ else
+ {
+ // more distant than the shadow map covers
+ shadow = 1.0;
+ }
+
+
+ fcol[0] += shadow;
+ fcol[1] += calcAmbientOcclusion(pos, norm, i);
+
+ spos.xyz = shadow_pos+offset*spot_shadow_offset;
+
+ //spotlight shadow 1
+ vec4 lpos = shadow_matrix[4]*spos;
+ fcol[2] += pcfShadow(shadowMap4, lpos, 0.8);
+
+ //spotlight shadow 2
+ lpos = shadow_matrix[5]*spos;
+ fcol[3] += pcfShadow(shadowMap5, lpos, 0.8);
+ }
+
+ gl_FragColor = fcol / samples;
+}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
index 9beb513ad8..814deb3677 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec4 vary_light;
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
index a4ad0bfa15..dff4d4a68f 100644
--- a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
uniform float bloomStrength;
diff --git a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
index d471a6c5e5..de469542f9 100644
--- a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 texelSize;
uniform vec2 blurDirection;
diff --git a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
index 66880b958e..8871bb3fc7 100644
--- a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
uniform float brightness;
diff --git a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
index c35c500d62..9c52b8dd5d 100644
--- a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void main(void)
{
diff --git a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
index e77baa5bee..713f8021de 100644
--- a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
uniform float extractLow;
diff --git a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
index 8e0eec6f5e..fd94b2e95f 100644
--- a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
uniform sampler2D NoiseTexture;
diff --git a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
index 98a50e22fc..a1a9c9716c 100644
--- a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
+++ b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect RenderTexture;
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
index bbb8951f3a..9527dc469b 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D detail_0;
uniform sampler2D detail_1;
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
index 84906c16bf..2658bee88d 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
void calcAtmospherics(vec3 inPositionEye);
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
index 7590c542ef..974e227b77 100644
--- a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D detail_0;
uniform sampler2D detail_1;
diff --git a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
index 900f1a6cb8..702e0881ac 100644
--- a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
index f4f6b6e90f..c4e4bc08c5 100644
--- a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec3 scaleSoftClip(vec3 inColor);
vec3 atmosTransport(vec3 inColor);
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
index 9f3328cbf0..b66b72b401 100644
--- a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec4 lightnorm;
uniform vec4 waterPlane;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
index 342bc2ab66..4c31602736 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
@@ -5,16 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
void default_lighting()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
color.rgb = atmosLighting(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
index dad18b5883..95bd052b5d 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
@@ -5,16 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
vec3 fullbrightAtmosTransport(vec3 light);
vec3 fullbrightScaleSoftClip(vec3 light);
void fullbright_lighting()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
color.rgb = fullbrightAtmosTransport(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl
new file mode 100644
index 0000000000..b1e61e1a33
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl
@@ -0,0 +1,25 @@
+/**
+ * @file lightFullbrightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+uniform sampler2D diffuseMap;
+
+void fullbright_lighting()
+{
+ vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
index 73ff81e03a..26f0ea84e0 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
@@ -5,9 +5,8 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
uniform samplerCube environmentMap;
vec3 fullbrightShinyAtmosTransport(vec3 light);
@@ -15,7 +14,7 @@ vec3 fullbrightScaleSoftClip(vec3 light);
void fullbright_shiny_lighting()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy);
color.rgb *= gl_Color.rgb;
vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl
new file mode 100644
index 0000000000..953298da0d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl
@@ -0,0 +1,32 @@
+/**
+ * @file lightFullbrightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+void fullbright_shiny_lighting()
+{
+ vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ color.rgb *= gl_Color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ color.a = max(color.a, gl_Color.a);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
index 9b4b584369..a6e10a249d 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl
@@ -5,9 +5,9 @@
* $License$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
+
uniform samplerCube environmentMap;
vec3 fullbrightShinyAtmosTransport(vec3 light);
@@ -16,7 +16,7 @@ vec4 applyWaterFog(vec4 color);
void fullbright_shiny_lighting_water()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy);
color.rgb *= gl_Color.rgb;
vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..b4bb665a2b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
@@ -0,0 +1,32 @@
+/**
+ * @file lightFullbrightShinyWaterF.glsl
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void fullbright_shiny_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy);
+ color.rgb *= gl_Color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+ color.a = max(color.a, gl_Color.a);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
index 3d46c8d874..887d4130e7 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
@@ -5,16 +5,16 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
+vec4 diffuseLookup(vec2 texcoord);
vec3 fullbrightAtmosTransport(vec3 light);
vec4 applyWaterFog(vec4 color);
void fullbright_lighting_water()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
color.rgb = fullbrightAtmosTransport(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..1234682ae9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl
@@ -0,0 +1,23 @@
+/**
+ * @file lightFullbrightWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void fullbright_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl
new file mode 100644
index 0000000000..149cf791f5
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl
@@ -0,0 +1,25 @@
+/**
+ * @file lightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+void default_lighting()
+{
+ vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
index ebe21320b4..300fcac092 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
@@ -5,9 +5,9 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
+
uniform samplerCube environmentMap;
vec3 scaleSoftClip(vec3 light);
@@ -16,7 +16,7 @@ vec4 applyWaterFog(vec4 color);
void shiny_lighting()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy);
color.rgb *= gl_Color.rgb;
vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl
new file mode 100644
index 0000000000..e877c0abb1
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl
@@ -0,0 +1,32 @@
+/**
+ * @file lightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 scaleSoftClip(vec3 light);
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting()
+{
+ vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy);
+ color.rgb *= gl_Color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+ color.a = max(color.a, gl_Color.a);
+ gl_FragColor = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
index 7f48e2cf1d..07572fa915 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
@@ -5,10 +5,9 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
+
uniform samplerCube environmentMap;
vec3 atmosLighting(vec3 light);
@@ -16,7 +15,7 @@ vec4 applyWaterFog(vec4 color);
void shiny_lighting_water()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy);
color.rgb *= gl_Color.rgb;
vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..3904179427
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl
@@ -0,0 +1,29 @@
+/**
+ * @file lightShinyWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+
+uniform sampler2D diffuseMap;
+uniform samplerCube environmentMap;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy);
+ color.rgb *= gl_Color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+ color.a = max(color.a, gl_Color.a);
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
index ad1dc4da77..3384f64d07 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// All lights, no specular highlights
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
index a0f6e019ef..10c770fcc2 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// All lights, no specular highlights
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
index 97eba92d7b..61341a9f1f 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
@@ -5,16 +5,14 @@
* $/LicenseInfo$
*/
-#version 120
-uniform sampler2D diffuseMap;
vec3 atmosLighting(vec3 light);
vec4 applyWaterFog(vec4 color);
void default_lighting_water()
{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
+ vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color;
color.rgb = atmosLighting(color.rgb);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..ba850b61d0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl
@@ -0,0 +1,23 @@
+/**
+ * @file lightWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void default_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ gl_FragColor = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
index fde32ed035..8df2e6f222 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 calcPointLightSpecular(inout vec4 specular, vec3 view, vec3 v, vec3 n, vec3 l, float r, float pw, vec3 lightCol);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
index 8fe49e3be0..3d43a1813a 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl
new file mode 100644
index 0000000000..f49e74406f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl
@@ -0,0 +1,35 @@
+/**
+ * @file fullbrightShinyV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+void calcAtmospherics(vec3 inPositionEye);
+
+uniform vec4 origin;
+
+varying float vary_texture_index;
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(gl_Vertex.xyz,1.0);
+ vary_texture_index = gl_Vertex.w;
+ gl_Position = gl_ModelViewProjectionMatrix*vert;
+
+ vec4 pos = (gl_ModelViewMatrix * vert);
+ vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 ref = reflect(pos.xyz, -norm);
+
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
+
+ calcAtmospherics(pos.xyz);
+
+ gl_FrontColor = gl_Color;
+
+ gl_FogFragCoord = pos.z;
+}
diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl
new file mode 100644
index 0000000000..3076fa3260
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl
@@ -0,0 +1,29 @@
+/**
+ * @file fullbrightV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+void calcAtmospherics(vec3 inPositionEye);
+
+varying float vary_texture_index;
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(gl_Vertex.xyz,1.0);
+ vary_texture_index = gl_Vertex.w;
+ gl_Position = gl_ModelViewProjectionMatrix*vert;
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ vec4 pos = (gl_ModelViewMatrix * vert);
+
+ calcAtmospherics(pos.xyz);
+
+ gl_FrontColor = gl_Color;
+
+ gl_FogFragCoord = pos.z;
+}
diff --git a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
index 4cebb06df0..49992d3535 100644
--- a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
@@ -5,20 +5,24 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
+varying float vary_texture_index;
+
uniform vec4 origin;
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 vert = vec4(gl_Vertex.xyz,1.0);
+ vary_texture_index = gl_Vertex.w;
+ gl_Position = gl_ModelViewProjectionMatrix*vert;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
+ vec4 pos = (gl_ModelViewMatrix * vert);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
vec3 ref = reflect(pos.xyz, -norm);
diff --git a/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl
new file mode 100644
index 0000000000..5e02391767
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl
@@ -0,0 +1,33 @@
+/**
+ * @file simpleV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+varying float vary_texture_index;
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(gl_Vertex.xyz,1.0);
+ vary_texture_index = gl_Vertex.w;
+ gl_Position = gl_ModelViewProjectionMatrix*vert;
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ vec4 pos = (gl_ModelViewMatrix * vert);
+
+ vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
+ gl_FrontColor = color;
+
+ gl_FogFragCoord = pos.z;
+}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
index 77d15fba9a..21a0812c1b 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
//////////////////////////////////////////////////////////
// The fragment shader for the terrain atmospherics
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
index 8c5b864cbe..ab4cf4806d 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// Output variables
vec3 getSunlitColor();
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
index 8d365c15ca..b61b0bb396 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// varying param funcs
void setSunlitColor(vec3 v);
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
index cf9ef30632..3a6585bb33 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_PositionEye;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
index 398f1556a0..0f6e231ca6 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec3 vary_PositionEye;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
index 13207997b2..20f907a006 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index 267ef36d4d..3eac63076c 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
//////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
diff --git a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
index a658edd21f..6570dcb608 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec4 gamma;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
index 77ca4868a6..d14c638130 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
index 03bca8f27e..1ea00f723a 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
// SKY ////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
diff --git a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
index 7f1ad4d5b4..28381482c1 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
@@ -5,8 +5,6 @@
* $/LicenseInfo$
*/
-#version 120
-
//////////////////////////////////////////////////////////
// The fragment shader for the terrain atmospherics
//////////////////////////////////////////////////////////
diff --git a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
index a003e2a1f1..3d970d252c 100644
--- a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
index fc370ef367..498fee7c66 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2DRect giLightMap;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
index ae57227fe5..eebe930666 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
index 951e3e97ae..9896f8dafe 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
index b2f8b2c633..df4c6b3e0a 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
index 19c4e07b8b..7e20d71529 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
index 8dc1410ea5..e86f2896da 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
index 5f3bf68b24..980def6443 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
index a24eda35dc..9afeac6ddf 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
index ab99a88971..6d4c20f68c 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
index 12983baa94..876f65ee3a 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
index f037754708..fc65881680 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
index ae57227fe5..eebe930666 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
varying vec2 vary_fragcoord;
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index ce32f66000..d38d33cc21 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
#extension GL_ARB_texture_rectangle : enable
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
index 8f0bcca76b..745cc01992 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform vec2 screen_res;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
index c54d9a1e3e..de7e038402 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
uniform sampler2D diffuseMap;
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
index 04533fdce1..92347a5b4a 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 calcPointLightSpecular(inout vec4 specular, vec3 view, vec3 v, vec3 n, vec3 l, float r, float pw, vec3 lightCol);
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
index 73bc18b866..24bbc0a1a1 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
@@ -5,7 +5,7 @@
* $/LicenseInfo$
*/
-#version 120
+
float calcDirectionalLight(vec3 n, vec3 l);
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index dd8a88e558..25dd2ffe78 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -467,7 +467,6 @@ RenderAvatarCloth 0 0
list ATI
RenderUseStreamVBO 1 0
-RenderAvatarVP 1 0
// Disable vertex buffer objects by default for ATI cards with little video memory
list ATIVramLT256
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index e2b979d9e9..8b8340bd71 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 23
+version 24
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -412,31 +412,6 @@ Disregard128DefaultDrawDistance 1 0
list ATI_Mobility_Radeon_X1xxx
Disregard128DefaultDrawDistance 1 0
-
-
-
-// Avatar hardware skinning causes
-// invisible avatars on HD 2600... so I masked
-// out other possible bad ones till it's fixed
-
-list ATI_Radeon_HD_2300
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-Disregard128DefaultDrawDistance 1 0
-list ATI_Radeon_HD_2400
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-Disregard128DefaultDrawDistance 1 0
-list ATI_Radeon_HD_2600
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_2900
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_3800
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-
/// Tweaked NVIDIA
list NVIDIA_GeForce_FX_5100
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index 3339172a1a..65a6f59bbe 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -466,7 +466,6 @@ RenderAvatarCloth 0 0
list ATI
RenderUseStreamVBO 1 0
-RenderAvatarVP 1 0
// Disable vertex buffer objects by default for ATI cards with little video memory
list ATIVramLT256
diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp
index 3758896b85..ef015a950d 100644
--- a/indra/newview/groupchatlistener.cpp
+++ b/indra/newview/groupchatlistener.cpp
@@ -4,8 +4,25 @@
* @date 2011-04-11
* @brief Implementation for groupchatlistener.
*
- * $LicenseInfo:firstyear=2011&license=internal$
- * Copyright (c) 2011, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h
index 719e3e877f..0c76db305e 100644
--- a/indra/newview/groupchatlistener.h
+++ b/indra/newview/groupchatlistener.h
@@ -4,8 +4,25 @@
* @date 2011-04-11
* @brief
*
- * $LicenseInfo:firstyear=2011&license=internal$
- * Copyright (c) 2011, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
diff --git a/indra/newview/llaccountingquotamanager.cpp b/indra/newview/llaccountingquotamanager.cpp
index ada74ea44c..9b77ada8b7 100644
--- a/indra/newview/llaccountingquotamanager.cpp
+++ b/indra/newview/llaccountingquotamanager.cpp
@@ -77,12 +77,10 @@ public:
return;
}
- //Differentiate what the incoming caps could be from the data
- //bool VOContent = content.has("Objects");
+ //Differentiate what the incoming caps could be from the data
bool containsParcel = content.has("parcel");
bool containsSelection = content.has("selected");
- //bool VORegion = content.has("region");
-
+
//Loop over the stored object ids checking against the incoming data
for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
{
@@ -97,16 +95,17 @@ public:
for(S32 i = 0; i < dataCount; i++)
{
//prep#todo verify that this is safe, otherwise just add a bool
- S32 parcelId = 0;
- S32 parcelOwner = 0;
+ LLUUID parcelId;
+ //S32 parcelOwner = 0;
if ( content["parcel"][i].has("parcel_id") )
{
- parcelId = content["parcel"][i]["parcel_id"].asInteger();
- }
- if ( content["parcel"][i].has("parcel_owner") )
- {
- parcelOwner = content["parcel"][i]["parcel_owner"].asInteger();
+ parcelId = content["parcel"][i]["parcel_id"].asUUID();
}
+
+ //if ( content["parcel"][i].has("parcel_owner") )
+ //{
+ // parcelOwner = content["parcel"][i]["parcel_owner"].asInteger();
+ //}
F32 ownerRenderCost = 0;
F32 ownerPhysicsCost = 0;
@@ -123,48 +122,69 @@ public:
F32 otherNetworkCost = 0;
F32 otherSimulationCost = 0;
- F32 totalRenderCost = 0;
- F32 totalPhysicsCost = 0;
- F32 totalNetworkCost = 0;
- F32 totalSimulationCost = 0;
+ F32 tempRenderCost = 0;
+ F32 tempPhysicsCost = 0;
+ F32 tempNetworkCost = 0;
+ F32 tempSimulationCost = 0;
+
+ F32 selectedRenderCost = 0;
+ F32 selectedPhysicsCost = 0;
+ F32 selectedNetworkCost = 0;
+ F32 selectedSimulationCost = 0;
+ F32 parcelCapacity = 0;
+
+ if ( content["parcel"][i].has("capacity") )
+ {
+ parcelCapacity = content["parcel"][i].has("capacity");
+ }
+
if ( content["parcel"][i].has("owner") )
{
- ownerRenderCost = content["parcel"][i]["owner"]["render"].asReal();
+ ownerRenderCost = content["parcel"][i]["owner"]["rendering"].asReal();
ownerPhysicsCost = content["parcel"][i]["owner"]["physics"].asReal();
- ownerNetworkCost = content["parcel"][i]["owner"]["network"].asReal();
- ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
-
+ ownerNetworkCost = content["parcel"][i]["owner"]["streaming"].asReal();
+ ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
}
+
if ( content["parcel"][i].has("group") )
{
- groupRenderCost = content["parcel"][i]["group"]["render"].asReal();
+ groupRenderCost = content["parcel"][i]["group"]["rendering"].asReal();
groupPhysicsCost = content["parcel"][i]["group"]["physics"].asReal();
- groupNetworkCost = content["parcel"][i]["group"]["network"].asReal();
+ groupNetworkCost = content["parcel"][i]["group"]["streaming"].asReal();
groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal();
}
if ( content["parcel"][i].has("other") )
{
- otherRenderCost = content["parcel"][i]["other"]["render"].asReal();
+ otherRenderCost = content["parcel"][i]["other"]["rendering"].asReal();
otherPhysicsCost = content["parcel"][i]["other"]["physics"].asReal();
- otherNetworkCost = content["parcel"][i]["other"]["network"].asReal();
+ otherNetworkCost = content["parcel"][i]["other"]["streaming"].asReal();
otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal();
}
- if ( content["parcel"][i].has("total") )
+ if ( content["parcel"][i].has("temp") )
{
- totalRenderCost = content["parcel"][i]["total"]["render"].asReal();
- totalPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
- totalNetworkCost = content["parcel"][i]["total"]["network"].asReal();
- totalSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
-
+ tempRenderCost = content["parcel"][i]["total"]["rendering"].asReal();
+ tempPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
+ tempNetworkCost = content["parcel"][i]["total"]["streaming"].asReal();
+ tempSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("selected") )
+ {
+ selectedRenderCost = content["parcel"][i]["total"]["rendering"].asReal();
+ selectedPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
+ selectedNetworkCost = content["parcel"][i]["total"]["streaming"].asReal();
+ selectedSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
}
- ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
- groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
- otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
- totalRenderCost, totalPhysicsCost, totalNetworkCost, totalSimulationCost );
+ ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
+ groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
+ otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
+ tempRenderCost, tempPhysicsCost, tempNetworkCost, tempSimulationCost,
+ selectedRenderCost, selectedPhysicsCost, selectedNetworkCost, selectedSimulationCost,
+ parcelCapacity );
//Update the Parcel
LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
if ( pParcel )
@@ -185,18 +205,18 @@ public:
F32 networkCost = 0;
F32 simulationCost = 0;
- S32 localId = 0;
+ LLUUID objectId;
- localId = content["selected"][i]["local_id"].asInteger();
- renderCost = content["selected"][i]["render"].asReal();
+ objectId = content["selected"][i]["local_id"].asUUID();
+ renderCost = content["selected"][i]["rendering"].asReal();
physicsCost = content["selected"][i]["physics"].asReal();
- networkCost = content["selected"][i]["network"].asReal();
+ networkCost = content["selected"][i]["streaming"].asReal();
simulationCost = content["selected"][i]["simulation"].asReal();
- SelectionQuota selectionQuota( localId, renderCost, physicsCost, networkCost, simulationCost );
+ SelectionQuota selectionQuota( objectId, renderCost, physicsCost, networkCost, simulationCost );
//Update the objects
- //gObjectList.updateQuota( localId, selectionQuota );
+ gObjectList.updateQuota( objectId, selectionQuota );
}
}
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index c08771c5e7..d7ba4ea470 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -384,18 +384,18 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
// Continuing the horrible hack above, we need to extract the originally requested permissions data, if any,
// and use them for each next file to be uploaded. Note the requested perms are not the same as the
U32 everyone_perms =
- content.has("everyone_mask") ?
- content["everyone_mask"].asInteger() :
+ content.has("new_everyone_mask") ?
+ content["new_everyone_mask"].asInteger() :
PERM_NONE;
U32 group_perms =
- content.has("group_mask") ?
- content["group_mask"].asInteger() :
+ content.has("new_group_mask") ?
+ content["new_group_mask"].asInteger() :
PERM_NONE;
U32 next_owner_perms =
- content.has("next_owner_mask") ?
- content["next_owner_mask"].asInteger() :
+ content.has("new_next_owner_mask") ?
+ content["new_next_owner_mask"].asInteger() :
PERM_NONE;
std::string display_name = LLStringUtil::null;
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index bdc12ec0e3..ad3710843c 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -94,7 +94,9 @@ void LLDrawable::init()
mRenderType = 0;
mCurrentScale = LLVector3(1,1,1);
mDistanceWRTCamera = 0.0f;
-
+ mPositionGroup.clear();
+ mExtents[0].clear();
+ mExtents[1].clear();
mQuietCount = 0;
mState = 0;
@@ -587,7 +589,10 @@ void LLDrawable::setRadius(F32 radius)
void LLDrawable::moveUpdatePipeline(BOOL moved)
{
- makeActive();
+ if (moved)
+ {
+ makeActive();
+ }
// Update the face centers.
for (S32 i = 0; i < getNumFaces(); i++)
@@ -695,7 +700,8 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
{
if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
- llerrs << "WTF?" << llendl;
+ llwarns << "Attempted to update distance for non-world camera." << llendl;
+ return;
}
//switch LOD with the spatial group to avoid artifacts
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index 9ebe1a45b4..e268640a21 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -276,6 +276,7 @@ public:
REBUILD_SHADOW = 0x02000000,
HAS_ALPHA = 0x04000000,
RIGGED = 0x08000000,
+ PARTITION_MOVE = 0x10000000,
} EDrawableFlags;
private: //aligned members
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 25e4bc847c..f5483d969d 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -191,6 +191,16 @@ void LLDrawPool::renderPostDeferred(S32 pass)
//virtual
void LLDrawPool::endRenderPass( S32 pass )
{
+ for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
+ { //dummy cleanup of any currently bound textures
+ if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
+ {
+ gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
+ gGL.getTexUnit(i)->disable();
+ }
+ }
+
+ gGL.getTexUnit(0)->activate();
}
//virtual
@@ -430,14 +440,14 @@ void LLRenderPass::renderTexture(U32 type, U32 mask)
pushBatches(type, mask, TRUE);
}
-void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture)
+void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures)
{
for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
{
LLDrawInfo* pparams = *i;
if (pparams)
{
- pushBatch(*pparams, mask, texture);
+ pushBatch(*pparams, mask, texture, batch_textures);
}
}
}
@@ -456,26 +466,43 @@ void LLRenderPass::applyModelMatrix(LLDrawInfo& params)
}
}
-void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
applyModelMatrix(params);
+ bool tex_setup = false;
+
if (texture)
{
- if (params.mTexture.notNull())
+ if (batch_textures && params.mTextureList.size() > 1)
{
- params.mTexture->addTextureStats(params.mVSize);
- gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
- if (params.mTextureMatrix)
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
- gPipeline.mTextureMatrixOps++;
+ if (params.mTextureList[i].notNull())
+ {
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
+ }
}
}
else
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTexture.notNull())
+ {
+ params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
+ if (params.mTextureMatrix)
+ {
+ tex_setup = true;
+ gGL.getTexUnit(0)->activate();
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
+ gPipeline.mTextureMatrixOps++;
+ }
+ }
+ else
+ {
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
}
@@ -490,7 +517,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
- if (params.mTextureMatrix && texture && params.mTexture.notNull())
+ if (tex_setup)
{
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index d3fd9ead0d..c7acbb42c6 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -146,8 +146,8 @@ public:
void resetDrawOrders() { }
static void applyModelMatrix(LLDrawInfo& params);
- virtual void pushBatches(U32 type, U32 mask, BOOL texture = TRUE);
- virtual void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture);
+ virtual void pushBatches(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE);
+ virtual void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE);
virtual void renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture = TRUE);
virtual void renderGroups(U32 type, U32 mask, BOOL texture = TRUE);
virtual void renderTexture(U32 type, U32 mask);
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 8b5a2ce781..71eee0188c 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -124,7 +124,7 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
if (pass == 0)
{
simple_shader = &gDeferredAlphaProgram;
- fullbright_shader = &gDeferredFullbrightProgram;
+ fullbright_shader = &gObjectFullbrightProgram;
}
else
{
@@ -228,13 +228,13 @@ void LLDrawPoolAlpha::render(S32 pass)
if (!LLPipeline::sRenderDeferred)
{
simple_shader->bind();
- pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
+ pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
if (fullbright_shader)
{
fullbright_shader->bind();
}
- pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
LLGLSLShader::bindNoShader();
}
else
@@ -273,7 +273,14 @@ void LLDrawPoolAlpha::render(S32 pass)
}
}
- renderAlpha(getVertexDataMask());
+ if (mVertexShaderLevel > 0)
+ {
+ renderAlpha(getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX);
+ }
+ else
+ {
+ renderAlpha(getVertexDataMask());
+ }
gGL.setColorMask(true, false);
@@ -341,10 +348,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
BOOL light_enabled = TRUE;
S32 diffuse_channel = 0;
- BOOL use_shaders = (LLPipeline::sUnderWaterRender && gPipeline.canUseVertexShaders())
- || gPipeline.canUseWindLightShadersOnObjects();
-
-
+ BOOL use_shaders = gPipeline.canUseVertexShaders();
+
for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
{
LLSpatialGroup* group = *i;
@@ -368,92 +373,107 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
LLRenderPass::applyModelMatrix(params);
+
+ if (params.mFullbright)
{
- if (params.mFullbright)
- {
- // Turn off lighting if it hasn't already been so.
- if (light_enabled || !initialized_lighting)
- {
- initialized_lighting = TRUE;
- if (use_shaders)
- {
- target_shader = fullbright_shader;
- }
- else
- {
- gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
- }
- light_enabled = FALSE;
- }
- }
- // Turn on lighting if it isn't already.
- else if (!light_enabled || !initialized_lighting)
+ // Turn off lighting if it hasn't already been so.
+ if (light_enabled || !initialized_lighting)
{
initialized_lighting = TRUE;
if (use_shaders)
{
- target_shader = simple_shader;
+ target_shader = fullbright_shader;
}
else
{
- gPipeline.enableLightsDynamic();
+ gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
}
- light_enabled = TRUE;
+ light_enabled = FALSE;
}
-
- // If we need shaders, and we're not ALREADY using the proper shader, then bind it
- // (this way we won't rebind shaders unnecessarily).
- if(use_shaders && (current_shader != target_shader))
+ }
+ // Turn on lighting if it isn't already.
+ else if (!light_enabled || !initialized_lighting)
+ {
+ initialized_lighting = TRUE;
+ if (use_shaders)
{
- llassert(target_shader != NULL);
- if (deferred_render && current_shader != NULL)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- diffuse_channel = 0;
- }
- current_shader = target_shader;
- if (deferred_render)
- {
- gPipeline.bindDeferredShader(*current_shader);
- diffuse_channel = current_shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- }
- else
- {
- current_shader->bind();
- }
+ target_shader = simple_shader;
}
- else if (!use_shaders && current_shader != NULL)
+ else
{
- if (deferred_render)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- diffuse_channel = 0;
- }
- LLGLSLShader::bindNoShader();
- current_shader = NULL;
+ gPipeline.enableLightsDynamic();
}
+ light_enabled = TRUE;
+ }
- if (params.mGroup)
+ // If we need shaders, and we're not ALREADY using the proper shader, then bind it
+ // (this way we won't rebind shaders unnecessarily).
+ if(use_shaders && (current_shader != target_shader))
+ {
+ llassert(target_shader != NULL);
+ if (deferred_render && current_shader != NULL)
+ {
+ gPipeline.unbindDeferredShader(*current_shader);
+ diffuse_channel = 0;
+ }
+ current_shader = target_shader;
+ if (deferred_render)
+ {
+ gPipeline.bindDeferredShader(*current_shader);
+ diffuse_channel = current_shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ }
+ else
{
- params.mGroup->rebuildMesh();
+ current_shader->bind();
}
+ }
+ else if (!use_shaders && current_shader != NULL)
+ {
+ if (deferred_render)
+ {
+ gPipeline.unbindDeferredShader(*current_shader);
+ diffuse_channel = 0;
+ }
+ LLGLSLShader::bindNoShader();
+ current_shader = NULL;
+ }
-
- if (params.mTexture.notNull())
+ if (params.mGroup)
+ {
+ params.mGroup->rebuildMesh();
+ }
+
+ bool tex_setup = false;
+
+ if (use_shaders && params.mTextureList.size() > 1)
+ {
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- gGL.getTexUnit(diffuse_channel)->bind(params.mTexture.get());
- if(params.mTexture.notNull())
+ if (params.mTextureList[i].notNull())
{
- params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
}
+ }
+ }
+ else
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTexture.notNull())
+ {
+ params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
if (params.mTextureMatrix)
{
+ tex_setup = true;
gGL.getTexUnit(0)->activate();
glMatrixMode(GL_TEXTURE);
glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
}
}
+ else
+ {
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
params.mVertexBuffer->setBuffer(mask);
@@ -480,7 +500,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
}
- if (params.mTextureMatrix && params.mTexture.notNull())
+ if (tex_setup)
{
gGL.getTexUnit(0)->activate();
glLoadIdentity();
@@ -494,9 +514,6 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
{
gPipeline.unbindDeferredShader(*current_shader);
LLVertexBuffer::unbind();
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
}
if (!light_enabled)
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 645c7ebcae..870aec4eff 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -613,11 +613,11 @@ void LLDrawPoolAvatar::beginRigid()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectSimpleWaterProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectSimpleProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedProgram;
}
if (sVertexProgram != NULL)
@@ -669,7 +669,7 @@ void LLDrawPoolAvatar::endDeferredImpostor()
void LLDrawPoolAvatar::beginDeferredRigid()
{
- sVertexProgram = &gDeferredDiffuseProgram;
+ sVertexProgram = &gDeferredNonIndexedDiffuseProgram;
sVertexProgram->bind();
}
@@ -700,11 +700,11 @@ void LLDrawPoolAvatar::beginSkinned()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectSimpleWaterProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectSimpleProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedProgram;
}
}
@@ -789,11 +789,11 @@ void LLDrawPoolAvatar::beginRiggedSimple()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectSimpleWaterProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectSimpleProgram;
+ sVertexProgram = &gObjectSimpleNonIndexedProgram;
}
}
@@ -864,11 +864,11 @@ void LLDrawPoolAvatar::beginRiggedFullbright()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectFullbrightWaterProgram;
+ sVertexProgram = &gObjectFullbrightNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectFullbrightProgram;
+ sVertexProgram = &gObjectFullbrightNonIndexedProgram;
}
}
@@ -908,11 +908,11 @@ void LLDrawPoolAvatar::beginRiggedShinySimple()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectShinyWaterProgram;
+ sVertexProgram = &gObjectShinyNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectShinyProgram;
+ sVertexProgram = &gObjectShinyNonIndexedProgram;
}
}
@@ -953,11 +953,11 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectFullbrightShinyWaterProgram;
+ sVertexProgram = &gObjectFullbrightShinyNonIndexedWaterProgram;
}
else
{
- sVertexProgram = &gObjectFullbrightShinyProgram;
+ sVertexProgram = &gObjectFullbrightShinyNonIndexedProgram;
}
}
@@ -1456,7 +1456,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
continue;
}
- const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id);
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id, vobj);
if (!skin)
{
continue;
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 29b50761d8..4ac4b89ab4 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -309,6 +309,9 @@ void LLDrawPoolBump::endRenderPass(S32 pass)
llassert(0);
break;
}
+
+ //to cleanup texture channels
+ LLRenderPass::endRenderPass(pass);
}
//static
@@ -347,6 +350,11 @@ void LLDrawPoolBump::beginShiny(bool invisible)
}
bindCubeMap(shader, mVertexShaderLevel, diffuse_channel, cube_channel, invisible);
+
+ if (mVertexShaderLevel > 1)
+ { //indexed texture rendering, channel 0 is always diffuse
+ diffuse_channel = 0;
+ }
}
//static
@@ -414,16 +422,16 @@ void LLDrawPoolBump::renderShiny(bool invisible)
LLGLEnable blend_enable(GL_BLEND);
if (!invisible && mVertexShaderLevel > 1)
{
- LLRenderPass::renderTexture(LLRenderPass::PASS_SHINY, sVertexMask);
+ LLRenderPass::pushBatches(LLRenderPass::PASS_SHINY, sVertexMask | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
else if (!invisible)
{
renderGroups(LLRenderPass::PASS_SHINY, sVertexMask);
}
- else // invisible
- {
- renderGroups(LLRenderPass::PASS_INVISI_SHINY, sVertexMask);
- }
+ //else // invisible (deprecated)
+ //{
+ //renderGroups(LLRenderPass::PASS_INVISI_SHINY, sVertexMask);
+ //}
}
}
@@ -536,7 +544,15 @@ void LLDrawPoolBump::renderFullbrightShiny()
if( gSky.mVOSkyp->getCubeMap() )
{
LLGLEnable blend_enable(GL_BLEND);
- LLRenderPass::renderTexture(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask);
+
+ if (mVertexShaderLevel > 1)
+ {
+ LLRenderPass::pushBatches(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ }
+ else
+ {
+ LLRenderPass::renderTexture(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask);
+ }
}
}
@@ -836,6 +852,9 @@ void LLDrawPoolBump::endPostDeferredPass(S32 pass)
endBump(LLRenderPass::PASS_POST_BUMP);
break;
}
+
+ //to disable texture channels
+ LLRenderPass::endRenderPass(pass);
}
void LLDrawPoolBump::renderPostDeferred(S32 pass)
@@ -889,9 +908,9 @@ void LLBumpImageList::destroyGL()
void LLBumpImageList::restoreGL()
{
- if(!gTextureList.isInitialized())
- {
- return ;
+ if(!gTextureList.isInitialized())
+ {
+ return ;
}
LLStandardBumpmap::restoreGL();
@@ -1292,43 +1311,60 @@ void LLDrawPoolBump::renderBump(U32 type, U32 mask)
}
}
-void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
applyModelMatrix(params);
- if (params.mTextureMatrix)
+ bool tex_setup = false;
+
+ if (batch_textures && params.mTextureList.size() > 1)
{
- if (mShiny)
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- gGL.getTexUnit(0)->activate();
- glMatrixMode(GL_TEXTURE);
+ if (params.mTextureList[i].notNull())
+ {
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
+ }
}
- else
+ }
+ else
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTextureMatrix)
{
- gGL.getTexUnit(1)->activate();
- glMatrixMode(GL_TEXTURE);
+ if (mShiny)
+ {
+ gGL.getTexUnit(0)->activate();
+ glMatrixMode(GL_TEXTURE);
+ }
+ else
+ {
+ gGL.getTexUnit(1)->activate();
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
+ gPipeline.mTextureMatrixOps++;
+ gGL.getTexUnit(0)->activate();
+ }
+
glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
- gGL.getTexUnit(0)->activate();
- }
-
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
- gPipeline.mTextureMatrixOps++;
- }
- if (mShiny && mVertexShaderLevel > 1 && texture)
- {
- if (params.mTexture.notNull())
- {
- gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ;
- params.mTexture->addTextureStats(params.mVSize);
+ tex_setup = true;
}
- else
+
+ if (mShiny && mVertexShaderLevel > 1 && texture)
{
- gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE);
+ if (params.mTexture.notNull())
+ {
+ gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ;
+ params.mTexture->addTextureStats(params.mVSize);
+ }
+ else
+ {
+ gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
}
-
+
if (params.mGroup)
{
params.mGroup->rebuildMesh();
@@ -1336,7 +1372,7 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
params.mVertexBuffer->setBuffer(mask);
params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
- if (params.mTextureMatrix)
+ if (tex_setup)
{
if (mShiny)
{
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index f4702bf61d..476b1d41b7 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -55,7 +55,7 @@ public:
virtual void endRenderPass( S32 pass );
virtual S32 getNumPasses();
/*virtual*/ void prerender();
- /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture);
+ /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE);
void renderBump(U32 type, U32 mask);
void renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture);
diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp
index 2e83167851..5dbb27cabb 100644
--- a/indra/newview/lldrawpoolsimple.cpp
+++ b/indra/newview/lldrawpoolsimple.cpp
@@ -44,6 +44,36 @@ static LLGLSLShader* fullbright_shader = NULL;
static LLFastTimer::DeclareTimer FTM_RENDER_SIMPLE_DEFERRED("Deferred Simple");
static LLFastTimer::DeclareTimer FTM_RENDER_GRASS_DEFERRED("Deferred Grass");
+void LLDrawPoolGlow::beginPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.bind();
+}
+
+void LLDrawPoolGlow::renderPostDeferred(S32 pass)
+{
+ LLFastTimer t(FTM_RENDER_GLOW);
+ LLGLEnable blend(GL_BLEND);
+ LLGLDisable test(GL_ALPHA_TEST);
+ gGL.flush();
+ /// Get rid of z-fighting with non-glow pass.
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.0f, -1.0f);
+ gGL.setSceneBlendType(LLRender::BT_ADD);
+
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ gGL.setColorMask(false, true);
+ pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+
+ gGL.setColorMask(true, false);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+}
+
+void LLDrawPoolGlow::endPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.unbind();
+ LLRenderPass::endRenderPass(pass);
+}
+
void LLDrawPoolGlow::render(S32 pass)
{
LLFastTimer t(FTM_RENDER_GLOW);
@@ -68,7 +98,15 @@ void LLDrawPoolGlow::render(S32 pass)
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.setColorMask(false, true);
- renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask());
+
+ if (shader_level > 1)
+ {
+ pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ }
+ else
+ {
+ renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask());
+ }
gGL.setColorMask(true, false);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -79,10 +117,10 @@ void LLDrawPoolGlow::render(S32 pass)
}
}
-void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
glColor4ubv(params.mGlowColor.mV);
- LLRenderPass::pushBatch(params, mask, texture);
+ LLRenderPass::pushBatch(params, mask, texture, batch_textures);
}
@@ -126,10 +164,11 @@ void LLDrawPoolSimple::beginRenderPass(S32 pass)
void LLDrawPoolSimple::endRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_SIMPLE);
+ stop_glerror();
LLRenderPass::endRenderPass(pass);
-
- if (mVertexShaderLevel > 0){
-
+ stop_glerror();
+ if (mVertexShaderLevel > 0)
+ {
simple_shader->unbind();
}
}
@@ -142,13 +181,24 @@ void LLDrawPoolSimple::render(S32 pass)
{ //render simple
LLFastTimer t(FTM_RENDER_SIMPLE);
gPipeline.enableLightsDynamic();
- renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
- if (LLPipeline::sRenderDeferred)
- { //if deferred rendering is enabled, bump faces aren't registered as simple
- //render bump faces here as simple so bump faces will appear under water
- renderTexture(LLRenderPass::PASS_BUMP, getVertexDataMask());
+ if (mVertexShaderLevel > 0)
+ {
+ U32 mask = getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX;
+
+ pushBatches(LLRenderPass::PASS_SIMPLE, mask, TRUE, TRUE);
+
+ if (LLPipeline::sRenderDeferred)
+ { //if deferred rendering is enabled, bump faces aren't registered as simple
+ //render bump faces here as simple so bump faces will appear under water
+ pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE);
+ }
+ }
+ else
+ {
+ renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
}
+
}
}
@@ -177,7 +227,7 @@ void LLDrawPoolSimple::renderDeferred(S32 pass)
{ //render simple
LLFastTimer t(FTM_RENDER_SIMPLE_DEFERRED);
- renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
+ pushBatches(LLRenderPass::PASS_SIMPLE, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
}
@@ -200,11 +250,11 @@ void LLDrawPoolGrass::beginRenderPass(S32 pass)
if (LLPipeline::sUnderWaterRender)
{
- simple_shader = &gObjectSimpleWaterProgram;
+ simple_shader = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- simple_shader = &gObjectSimpleProgram;
+ simple_shader = &gObjectSimpleNonIndexedProgram;
}
if (mVertexShaderLevel > 0)
@@ -285,6 +335,26 @@ void LLDrawPoolFullbright::prerender()
mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
}
+void LLDrawPoolFullbright::beginPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.bind();
+}
+
+void LLDrawPoolFullbright::renderPostDeferred(S32 pass)
+{
+ LLFastTimer t(FTM_RENDER_FULLBRIGHT);
+
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE);
+}
+
+void LLDrawPoolFullbright::endPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.unbind();
+ LLRenderPass::endRenderPass(pass);
+}
+
void LLDrawPoolFullbright::beginRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
@@ -313,25 +383,21 @@ void LLDrawPoolFullbright::endRenderPass(S32 pass)
void LLDrawPoolFullbright::render(S32 pass)
{ //render fullbright
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
if (mVertexShaderLevel > 0)
{
fullbright_shader->bind();
fullbright_shader->uniform1f(LLViewerShaderMgr::FULLBRIGHT, 1.f);
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE);
}
else
{
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;
+ renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
}
-
- //gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f);
-
- //LLGLEnable test(GL_ALPHA_TEST);
- //LLGLEnable blend(GL_BLEND);
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;
- renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
-
- //gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
S32 LLDrawPoolFullbright::getNumPasses()
diff --git a/indra/newview/lldrawpoolsimple.h b/indra/newview/lldrawpoolsimple.h
index 5f3bbebbda..3811b3d398 100644
--- a/indra/newview/lldrawpoolsimple.h
+++ b/indra/newview/lldrawpoolsimple.h
@@ -98,9 +98,9 @@ public:
LLDrawPoolFullbright();
/*virtual*/ S32 getNumPostDeferredPasses() { return 1; }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ void beginPostDeferredPass(S32 pass);
+ /*virtual*/ void endPostDeferredPass(S32 pass);
+ /*virtual*/ void renderPostDeferred(S32 pass);
/*virtual*/ void beginRenderPass(S32 pass);
/*virtual*/ void endRenderPass(S32 pass);
@@ -126,12 +126,12 @@ public:
virtual void prerender() { }
/*virtual*/ S32 getNumPostDeferredPasses() { return 1; }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ void beginPostDeferredPass(S32 pass);
+ /*virtual*/ void endPostDeferredPass(S32 pass);
+ /*virtual*/ void renderPostDeferred(S32 pass);
void render(S32 pass = 0);
- void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE);
+ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE);
};
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 195ee60a2e..81c796b146 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -66,11 +66,11 @@ void LLDrawPoolTree::beginRenderPass(S32 pass)
if (LLPipeline::sUnderWaterRender)
{
- shader = &gObjectSimpleWaterProgram;
+ shader = &gObjectSimpleNonIndexedWaterProgram;
}
else
{
- shader = &gObjectSimpleProgram;
+ shader = &gObjectSimpleNonIndexedProgram;
}
if (gPipeline.canUseWindLightShadersOnObjects())
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 696c2d1abd..409b18d522 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -44,6 +44,8 @@ LLPointer<LLViewerTexture> LLDrawPoolWLSky::sCloudNoiseTexture = NULL;
LLPointer<LLImageRaw> LLDrawPoolWLSky::sCloudNoiseRawImage = NULL;
+static LLGLSLShader* cloud_shader = NULL;
+static LLGLSLShader* sky_shader = NULL;
LLDrawPoolWLSky::LLDrawPoolWLSky(void) :
@@ -83,12 +85,32 @@ LLViewerTexture *LLDrawPoolWLSky::getDebugTexture()
void LLDrawPoolWLSky::beginRenderPass( S32 pass )
{
+ sky_shader =
+ LLPipeline::sUnderWaterRender ?
+ &gObjectSimpleWaterProgram :
+ &gWLSkyProgram;
+
+ cloud_shader =
+ LLPipeline::sUnderWaterRender ?
+ &gObjectSimpleWaterProgram :
+ &gWLCloudProgram;
}
void LLDrawPoolWLSky::endRenderPass( S32 pass )
{
}
+void LLDrawPoolWLSky::beginDeferredPass(S32 pass)
+{
+ sky_shader = &gDeferredWLSkyProgram;
+ cloud_shader = &gDeferredWLCloudProgram;
+}
+
+void LLDrawPoolWLSky::endDeferredPass(S32 pass)
+{
+
+}
+
void LLDrawPoolWLSky::renderDome(F32 camHeightLocal, LLGLSLShader * shader) const
{
LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
@@ -128,19 +150,14 @@ void LLDrawPoolWLSky::renderSkyHaze(F32 camHeightLocal) const
{
if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
{
- LLGLSLShader* shader =
- LLPipeline::sUnderWaterRender ?
- &gObjectSimpleWaterProgram :
- &gWLSkyProgram;
-
LLGLDisable blend(GL_BLEND);
- shader->bind();
+ sky_shader->bind();
/// Render the skydome
- renderDome(camHeightLocal, shader);
+ renderDome(camHeightLocal, sky_shader);
- shader->unbind();
+ sky_shader->unbind();
}
}
@@ -186,23 +203,18 @@ void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const
{
if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS))
{
- LLGLSLShader* shader =
- LLPipeline::sUnderWaterRender ?
- &gObjectSimpleWaterProgram :
- &gWLCloudProgram;
-
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.getTexUnit(0)->bind(sCloudNoiseTexture);
- shader->bind();
+ cloud_shader->bind();
/// Render the skydome
- renderDome(camHeightLocal, shader);
+ renderDome(camHeightLocal, cloud_shader);
- shader->unbind();
+ cloud_shader->unbind();
}
}
@@ -246,6 +258,53 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
}
}
+void LLDrawPoolWLSky::renderDeferred(S32 pass)
+{
+ if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
+ {
+ return;
+ }
+ LLFastTimer ftm(FTM_RENDER_WL_SKY);
+
+ const F32 camHeightLocal = LLWLParamManager::instance()->getDomeOffset() * LLWLParamManager::instance()->getDomeRadius();
+
+ LLGLSNoFog disableFog;
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ LLGLDisable clip(GL_CLIP_PLANE0);
+
+ gGL.setColorMask(true, false);
+
+ LLGLSquashToFarClip far_clip(glh_get_current_projection());
+
+ renderSkyHaze(camHeightLocal);
+
+ LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
+ glPushMatrix();
+
+
+ glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+
+ gDeferredStarProgram.bind();
+ // *NOTE: have to bind a texture here since register combiners blending in
+ // renderStars() requires something to be bound and we might as well only
+ // bind the moon's texture once.
+ gGL.getTexUnit(0)->bind(gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture());
+
+ renderHeavenlyBodies();
+
+ renderStars();
+
+ gDeferredStarProgram.unbind();
+
+ glPopMatrix();
+
+ renderSkyClouds(camHeightLocal);
+
+ gGL.setColorMask(true, true);
+ //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+}
+
void LLDrawPoolWLSky::render(S32 pass)
{
if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h
index 8ca1ebb942..cd15c991ee 100644
--- a/indra/newview/lldrawpoolwlsky.h
+++ b/indra/newview/lldrawpoolwlsky.h
@@ -44,10 +44,10 @@ public:
/*virtual*/ BOOL isDead() { return FALSE; }
- /*virtual*/ S32 getNumPostDeferredPasses() { return getNumPasses(); }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ S32 getNumDeferredPasses() { return 1; }
+ /*virtual*/ void beginDeferredPass(S32 pass);
+ /*virtual*/ void endDeferredPass(S32 pass);
+ /*virtual*/ void renderDeferred(S32 pass);
/*virtual*/ LLViewerTexture *getDebugTexture();
/*virtual*/ void beginRenderPass( S32 pass );
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 5398c13c44..540ed054e9 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -165,6 +165,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mIndexInTex = 0;
mTexture = NULL;
mTEOffset = -1;
+ mTextureIndex = 255;
setDrawable(drawablep);
mVObjp = objp;
@@ -364,14 +365,7 @@ void LLFace::setSize(S32 num_vertices, S32 num_indices, bool align)
//allocate vertices in blocks of 4 for alignment
num_vertices = (num_vertices + 0x3) & ~0x3;
}
- else
- {
- if (mDrawablep->getVOVolume())
- {
- llerrs << "WTF?" << llendl;
- }
- }
-
+
if (mGeomCount != num_vertices ||
mIndicesCount != num_indices)
{
@@ -393,6 +387,26 @@ void LLFace::setGeomIndex(U16 idx)
}
}
+void LLFace::setTextureIndex(U8 index)
+{
+ if (index != mTextureIndex)
+ {
+ mTextureIndex = index;
+
+ if (mTextureIndex != 255)
+ {
+ mDrawablep->setState(LLDrawable::REBUILD_POSITION);
+ }
+ else
+ {
+ if (mDrawInfo && !mDrawInfo->mTextureList.empty())
+ {
+ llerrs << "Face with no texture index references indexed texture draw info." << llendl;
+ }
+ }
+ }
+}
+
void LLFace::setIndicesIndex(S32 idx)
{
if (mIndicesIndex != idx)
@@ -415,11 +429,11 @@ U16 LLFace::getGeometryAvatar(
if (mVertexBuffer.notNull())
{
- mVertexBuffer->getVertexStrider (vertices, mGeomIndex);
- mVertexBuffer->getNormalStrider (normals, mGeomIndex);
- mVertexBuffer->getTexCoord0Strider (tex_coords, mGeomIndex);
- mVertexBuffer->getWeightStrider(vertex_weights, mGeomIndex);
- mVertexBuffer->getClothWeightStrider(clothing_weights, mGeomIndex);
+ mVertexBuffer->getVertexStrider (vertices, mGeomIndex, mGeomCount);
+ mVertexBuffer->getNormalStrider (normals, mGeomIndex, mGeomCount);
+ mVertexBuffer->getTexCoord0Strider (tex_coords, mGeomIndex, mGeomCount);
+ mVertexBuffer->getWeightStrider(vertex_weights, mGeomIndex, mGeomCount);
+ mVertexBuffer->getClothWeightStrider(clothing_weights, mGeomIndex, mGeomCount);
}
return mGeomIndex;
@@ -432,17 +446,17 @@ U16 LLFace::getGeometry(LLStrider<LLVector3> &vertices, LLStrider<LLVector3> &no
if (mVertexBuffer.notNull())
{
- mVertexBuffer->getVertexStrider(vertices, mGeomIndex);
+ mVertexBuffer->getVertexStrider(vertices, mGeomIndex, mGeomCount);
if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL))
{
- mVertexBuffer->getNormalStrider(normals, mGeomIndex);
+ mVertexBuffer->getNormalStrider(normals, mGeomIndex, mGeomCount);
}
if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD0))
{
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex);
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount);
}
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount);
}
return mGeomIndex;
@@ -1078,27 +1092,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const LLTextureEntry *tep = mVObjp->getTE(f);
const U8 bump_code = tep ? tep->getBumpmap() : 0;
- if (rebuild_pos)
- {
- mVertexBuffer->getVertexStrider(vert, mGeomIndex);
- vertices = (LLVector4a*) vert.get();
- }
- if (rebuild_normal)
- {
- mVertexBuffer->getNormalStrider(norm, mGeomIndex);
- normals = (LLVector4a*) norm.get();
- }
- if (rebuild_binormal)
- {
- mVertexBuffer->getBinormalStrider(binorm, mGeomIndex);
- binormals = (LLVector4a*) binorm.get();
- }
- if (rebuild_weights)
- {
- mVertexBuffer->getWeight4Strider(wght, mGeomIndex);
- weights = (LLVector4a*) wght.get();
- }
-
F32 tcoord_xoffset = 0.f ;
F32 tcoord_yoffset = 0.f ;
F32 tcoord_xscale = 1.f ;
@@ -1107,12 +1100,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (rebuild_tcoord)
{
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex);
- if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1))
- {
- mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex);
- }
-
in_atlas = isAtlasInUse() ;
if(in_atlas)
{
@@ -1125,11 +1112,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
tcoord_yscale = tmp->mV[1] ;
}
}
- if (rebuild_color)
- {
- mVertexBuffer->getColorStrider(colors, mGeomIndex);
- }
-
+
BOOL is_static = mDrawablep->isStatic();
BOOL is_global = is_static;
@@ -1168,7 +1151,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
// INDICES
if (full_rebuild)
{
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, true);
+
__m128i* dst = (__m128i*) indicesp.get();
__m128i* src = (__m128i*) vf.mIndices;
__m128i offset = _mm_set1_epi16(index_offset);
@@ -1185,6 +1169,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
indicesp[i] = vf.mIndices[i]+index_offset;
}
+
+ mVertexBuffer->setBuffer(0);
}
LLMatrix4a mat_normal;
@@ -1330,6 +1316,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (!in_atlas && !do_bump)
{ //not in atlas or not bump mapped, might be able to do a cheap update
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount);
+
if (texgen != LLTextureEntry::TEX_GEN_PLANAR)
{
if (!do_tex_mat)
@@ -1402,9 +1390,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
}
+
+ mVertexBuffer->setBuffer(0);
}
else
{ //either bump mapped or in atlas, just do the whole expensive loop
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, true);
+
+ std::vector<LLVector2> bump_tc;
+
for (S32 i = 0; i < num_vertices; i++)
{
LLVector2 tc(vf.mTexCoords[i]);
@@ -1535,8 +1529,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
*tex_coords++ = tc;
-
- if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1))
+ if (do_bump)
+ {
+ bump_tc.push_back(tc);
+ }
+ }
+
+ mVertexBuffer->setBuffer(0);
+
+
+ if (do_bump)
+ {
+ mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, true);
+
+ for (S32 i = 0; i < num_vertices; i++)
{
LLVector4a tangent;
tangent.setCross3(vf.mBinormals[i], vf.mNormals[i]);
@@ -1558,16 +1564,22 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
binormal.normalize3fast();
+ LLVector2 tc = bump_tc[i];
tc += LLVector2( bump_s_primary_light_ray.dot3(tangent).getF32(), bump_t_primary_light_ray.dot3(binormal).getF32() );
*tex_coords2++ = tc;
- }
+ }
+
+ mVertexBuffer->setBuffer(0);
}
}
}
if (rebuild_pos)
{
+ mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, true);
+ vertices = (LLVector4a*) vert.get();
+
LLMatrix4a mat_vert;
mat_vert.loadu(mat_vert_in);
@@ -1580,10 +1592,28 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
mat_vert.affineTransform(*src++, *dst++);
}
while(dst < end);
+
+ F32 index = (F32) (mTextureIndex < 255 ? mTextureIndex : 0);
+ F32 *index_dst = (F32*) vertices;
+ F32 *index_end = (F32*) end;
+
+ index_dst += 3;
+ index_end += 3;
+ do
+ {
+ *index_dst = index;
+ index_dst += 4;
+ }
+ while (index_dst < index_end);
+
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_normal)
{
+ mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, true);
+ normals = (LLVector4a*) norm.get();
+
for (S32 i = 0; i < num_vertices; i++)
{
LLVector4a normal;
@@ -1591,10 +1621,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
normal.normalize3fast();
normals[i] = normal;
}
+
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_binormal)
{
+ mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, true);
+ binormals = (LLVector4a*) binorm.get();
+
for (S32 i = 0; i < num_vertices; i++)
{
LLVector4a binormal;
@@ -1602,15 +1637,22 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
binormal.normalize3fast();
binormals[i] = binormal;
}
+
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_weights && vf.mWeights)
{
+ mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, true);
+ weights = (LLVector4a*) wght.get();
LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_color)
{
+ mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, true);
+
LLVector4a src;
U32 vec[4];
@@ -1629,6 +1671,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
dst[i] = src;
}
+
+ mVertexBuffer->setBuffer(0);
}
if (rebuild_tcoord)
@@ -2045,13 +2089,13 @@ S32 LLFace::getColors(LLStrider<LLColor4U> &colors)
}
// llassert(mGeomIndex >= 0);
- mVertexBuffer->getColorStrider(colors, mGeomIndex);
+ mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount);
return mGeomIndex;
}
S32 LLFace::getIndices(LLStrider<U16> &indicesp)
{
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount);
llassert(indicesp[0] != indicesp[1]);
return mIndicesIndex;
}
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index b2170c4cf3..b5eaeecd60 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -94,6 +94,8 @@ public:
U16 getGeomCount() const { return mGeomCount; } // vertex count for this face
U16 getGeomIndex() const { return mGeomIndex; } // index into draw pool
U16 getGeomStart() const { return mGeomIndex; } // index into draw pool
+ void setTextureIndex(U8 index);
+ U8 getTextureIndex() const { return mTextureIndex; }
void setTexture(LLViewerTexture* tex) ;
void switchTexture(LLViewerTexture* new_texture);
void dirtyTexture();
@@ -262,6 +264,7 @@ private:
U16 mGeomCount; // vertex count for this face
U16 mGeomIndex; // index into draw pool
+ U8 mTextureIndex; // index of texture channel to use for pseudo-atlasing
U32 mIndicesCount;
U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!)
S32 mIndexInTex ;
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 50b19a4221..610142b5a9 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -461,15 +461,15 @@ void LLFloaterBuyLandUI::updateParcelInfo()
if (!authorizedBuyer.isNull() && buyer != authorizedBuyer)
{
- // Maybe the parcel is set for sale to a group we are in.
- bool authorized_group =
- gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_DEED)
- && gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_SET_SALE_INFO);
-
- if (!authorized_group)
- {
- mCannotBuyReason = getString("set_to_sell_to_other");
- return;
+ // Maybe the parcel is set for sale to a group we are in.
+ bool authorized_group =
+ gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_DEED)
+ && gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_SET_SALE_INFO);
+
+ if (!authorized_group)
+ {
+ mCannotBuyReason = getString("set_to_sell_to_other");
+ return;
}
}
}
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 2a3bd37129..8be5c427fe 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -314,15 +314,17 @@ BOOL LLFloaterModelPreview::postBuild()
childSetCommitCallback("pelvis_offset", onPelvisOffsetCommit, this);
childSetCommitCallback("lod_file_or_limit", refresh, this);
- childSetCommitCallback("physics_load_radio", refresh, this);
+ childSetCommitCallback("physics_load_radio", onPhysicsLoadRadioCommit, this);
//childSetCommitCallback("physics_optimize", refresh, this);
//childSetCommitCallback("physics_use_hull", refresh, this);
childDisable("upload_skin");
childDisable("upload_joints");
-
+
childDisable("ok_btn");
+ childSetCommitCallback("confirm_checkbox", refresh, this);
+
mViewOptionMenuButton = getChild<LLMenuButton>("options_gear_btn");
mCommitCallbackRegistrar.add("ModelImport.ViewOption.Action", boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _2));
@@ -470,6 +472,29 @@ void LLFloaterModelPreview::onPelvisOffsetCommit( LLUICtrl*, void* userdata )
}
//static
+void LLFloaterModelPreview::onPhysicsLoadRadioCommit( LLUICtrl*, void *userdata)
+{
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (fmp)
+ {
+ if (fmp->childGetValue("physics_use_lod").asBoolean())
+ {
+ onPhysicsUseLOD(NULL,NULL);
+ }
+ if (fmp->childGetValue("physics_load_from_file").asBoolean())
+ {
+
+ }
+ LLModelPreview *model_preview = fmp->mModelPreview;
+ if (model_preview)
+ {
+ model_preview->refresh();
+ model_preview->updateStatusMessages();
+ }
+ }
+}
+
+//static
void LLFloaterModelPreview::onUploadJointsCommit(LLUICtrl*,void* userdata)
{
LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
@@ -1634,7 +1659,7 @@ bool LLModelLoader::doLoadModel()
{
if (pos.getCount() <= j+2)
{
- llerrs << "WTF?" << llendl;
+ llerrs << "Invalid position array size." << llendl;
}
LLVector3 v(pos[j], pos[j+1], pos[j+2]);
@@ -2296,8 +2321,11 @@ void LLModelLoader::processElement(daeElement* element)
{
domFloat3 dom_value = scale->getValue();
+
+ LLVector3 scale_vector = LLVector3(dom_value[0], dom_value[1], dom_value[2]);
+ scale_vector.abs(); // Set all values positive, since we don't currently support mirrored meshes
LLMatrix4 scaling;
- scaling.initScale(LLVector3(dom_value[0], dom_value[1], dom_value[2]));
+ scaling.initScale(scale_vector);
scaling *= mTransform;
mTransform = scaling;
@@ -2675,7 +2703,8 @@ U32 LLModelPreview::calcResourceCost()
if (mFMP && mModelLoader)
{
- if ( getLoadState() < LLModelLoader::ERROR_PARSING )
+ const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean();
+ if ( getLoadState() < LLModelLoader::ERROR_PARSING && confirmed_checkbox )
{
mFMP->childEnable("ok_btn");
}
@@ -2817,7 +2846,8 @@ void LLModelPreview::rebuildUploadData()
F32 max_scale = 0.f;
- if ( mBaseScene.size() > 0 )
+ const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean();
+ if ( mBaseScene.size() > 0 && confirmed_checkbox )
{
mFMP->childEnable("ok_btn");
}
@@ -3221,6 +3251,8 @@ void LLModelPreview::loadModelCallback(S32 lod)
}
mLoading = false;
+ if (mFMP)
+ mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);
refresh();
mModelLoadedSignal();
@@ -3876,7 +3908,8 @@ void LLModelPreview::updateStatusMessages()
}
}
- if ( upload_ok && !errorStateFromLoader && skinAndRigOk )
+ const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean();
+ if ( upload_ok && !errorStateFromLoader && skinAndRigOk && confirmed_checkbox)
{
mFMP->childEnable("ok_btn");
}
@@ -4238,11 +4271,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
const LLModel::weight_list& weight_list = base_mdl->getJointInfluences(pos);
LLVector4 w(0,0,0,0);
- if (weight_list.size() > 4)
- {
- llerrs << "WTF?" << llendl;
- }
-
+
for (U32 i = 0; i < weight_list.size(); ++i)
{
F32 wght = llmin(weight_list[i].mWeight, 0.999999f);
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index f6d4a08d1f..ed7cbe6d1e 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -199,6 +199,8 @@ protected:
static void onUploadJointsCommit(LLUICtrl*,void*);
static void onUploadSkinCommit(LLUICtrl*,void*);
+ static void onPhysicsLoadRadioCommit(LLUICtrl*,void *data);
+
static void onPreviewLODCommit(LLUICtrl*,void*);
static void onGenerateNormalsCommit(LLUICtrl*,void*);
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index b79f120eda..12e0b26fed 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1,3938 +1,3957 @@
-/**
- * @file llmeshrepository.cpp
- * @brief Mesh repository implementation.
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "apr_pools.h"
-#include "apr_dso.h"
-#include "llhttpstatuscodes.h"
-#include "llmeshrepository.h"
-
-#include "llagent.h"
-#include "llappviewer.h"
-#include "llbufferstream.h"
-#include "llcurl.h"
-#include "lldatapacker.h"
-#include "llfasttimer.h"
-#include "llfloatermodelpreview.h"
-#include "llfloaterperms.h"
-#include "lleconomy.h"
-#include "llimagej2c.h"
-#include "llhost.h"
-#include "llnotificationsutil.h"
-#include "llsd.h"
-#include "llsdutil_math.h"
-#include "llsdserialize.h"
-#include "llthread.h"
-#include "llvfile.h"
-#include "llviewercontrol.h"
-#include "llviewermenufile.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llviewertexturelist.h"
-#include "llvolume.h"
-#include "llvolumemgr.h"
-#include "llvovolume.h"
-#include "llworld.h"
-#include "material_codes.h"
-#include "pipeline.h"
-#include "llinventorymodel.h"
-#include "llfoldertype.h"
-
-#ifndef LL_WINDOWS
-#include "netdb.h"
-#endif
-
-#include <queue>
-
-LLFastTimer::DeclareTimer FTM_MESH_UPDATE("Mesh Update");
-LLFastTimer::DeclareTimer FTM_LOAD_MESH("Load Mesh");
-
-LLMeshRepository gMeshRepo;
-
-const U32 MAX_MESH_REQUESTS_PER_SECOND = 100;
-
-U32 LLMeshRepository::sBytesReceived = 0;
-U32 LLMeshRepository::sHTTPRequestCount = 0;
-U32 LLMeshRepository::sHTTPRetryCount = 0;
-U32 LLMeshRepository::sCacheBytesRead = 0;
-U32 LLMeshRepository::sCacheBytesWritten = 0;
-U32 LLMeshRepository::sPeakKbps = 0;
-
-
-const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
-
-void dumpLLSDToFile(const LLSD& content, std::string filename);
-
-std::string header_lod[] =
-{
- "lowest_lod",
- "low_lod",
- "medium_lod",
- "high_lod"
-};
-
-
-//get the number of bytes resident in memory for given volume
-U32 get_volume_memory_size(const LLVolume* volume)
-{
- U32 indices = 0;
- U32 vertices = 0;
-
- for (U32 i = 0; i < volume->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = volume->getVolumeFace(i);
- indices += face.mNumIndices;
- vertices += face.mNumVertices;
- }
-
-
- return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces();
-}
-
-void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res, F32 scale = 1.f)
-{
- res.mPositions.clear();
- res.mNormals.clear();
-
- const F32* v = mesh.mVertexBase;
-
- if (mesh.mIndexType == LLCDMeshData::INT_16)
- {
- U16* idx = (U16*) mesh.mIndexBase;
- for (S32 j = 0; j < mesh.mNumTriangles; ++j)
- {
- F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
- F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
- F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
-
- idx = (U16*) (((U8*)idx)+mesh.mIndexStrideBytes);
-
- LLVector3 v0(mp0);
- LLVector3 v1(mp1);
- LLVector3 v2(mp2);
-
- LLVector3 n = (v1-v0)%(v2-v0);
- n.normalize();
-
- res.mPositions.push_back(v0*scale);
- res.mPositions.push_back(v1*scale);
- res.mPositions.push_back(v2*scale);
-
- res.mNormals.push_back(n);
- res.mNormals.push_back(n);
- res.mNormals.push_back(n);
- }
- }
- else
- {
- U32* idx = (U32*) mesh.mIndexBase;
- for (S32 j = 0; j < mesh.mNumTriangles; ++j)
- {
- F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
- F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
- F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
-
- idx = (U32*) (((U8*)idx)+mesh.mIndexStrideBytes);
-
- LLVector3 v0(mp0);
- LLVector3 v1(mp1);
- LLVector3 v2(mp2);
-
- LLVector3 n = (v1-v0)%(v2-v0);
- n.normalize();
-
- res.mPositions.push_back(v0*scale);
- res.mPositions.push_back(v1*scale);
- res.mPositions.push_back(v2*scale);
-
- res.mNormals.push_back(n);
- res.mNormals.push_back(n);
- res.mNormals.push_back(n);
- }
- }
-}
-
-S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
-S32 LLMeshRepoThread::sActiveLODRequests = 0;
-U32 LLMeshRepoThread::sMaxConcurrentRequests = 1;
-
-
-class LLTextureCostResponder : public LLCurl::Responder
-{
-public:
- LLTextureUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLTextureCostResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
-
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingConfirmations--;
- if (isGoodStatus(status))
- {
- mThread->priceResult(mData, content);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
-
- if (mData.mRetries < MAX_TEXTURE_UPLOAD_RETRIES)
- {
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 499 || status == 500)
- {
- mThread->uploadTexture(mData);
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- else
- {
- llwarns << "Giving up after " << mData.mRetries << " retries." << llendl;
- }
- }
- }
-};
-
-class LLTextureUploadResponder : public LLCurl::Responder
-{
-public:
- LLTextureUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLTextureUploadResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingUploads--;
- if (isGoodStatus(status))
- {
- mData.mUUID = content["new_asset"].asUUID();
- gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
- mThread->onTextureUploaded(mData);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 404)
- {
- mThread->uploadTexture(mData);
- }
- else if (status == 499)
- {
- mThread->mConfirmedTextureQ.push(mData);
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-class LLMeshCostResponder : public LLCurl::Responder
-{
-public:
- LLMeshUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLMeshCostResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
-
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingConfirmations--;
-
- if (isGoodStatus(status))
- {
- mThread->priceResult(mData, content);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
-
- if (status == HTTP_INTERNAL_ERROR)
- {
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
- mThread->uploadModel(mData);
- }
- else if (status == HTTP_BAD_REQUEST)
- {
- llwarns << "Status 400 received from server, giving up." << llendl;
- }
- else if (status == HTTP_NOT_FOUND)
- {
- llwarns <<"Status 404 received, server is disconnected, giving up." << llendl ;
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-class LLMeshUploadResponder : public LLCurl::Responder
-{
-public:
- LLMeshUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLMeshUploadResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingUploads--;
- if (isGoodStatus(status))
- {
- mData.mUUID = content["new_asset"].asUUID();
- if (mData.mUUID.isNull())
- {
- LLSD args;
- std::string message = content["error"]["message"];
- std::string identifier = content["error"]["identifier"];
- std::string invalidity_identifier = content["error"]["invalidity_identifier"];
-
- args["MESSAGE"] = message;
- args["IDENTIFIER"] = identifier;
- args["INVALIDITY_IDENTIFIER"] = invalidity_identifier;
- args["LABEL"] = mData.mBaseModel->mLabel;
-
- gMeshRepo.uploadError(args);
- }
- else
- {
- gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
- mThread->onModelUploaded(mData);
- }
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 404)
- {
- mThread->uploadModel(mData);
- }
- else if (status == 499)
- {
- mThread->mConfirmedQ.push(mData);
- }
- else if (status != 500)
- { //drop internal server errors on the floor, otherwise grab
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-
-class LLMeshHeaderResponder : public LLCurl::Responder
-{
-public:
- LLVolumeParams mMeshParams;
-
- LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
- : mMeshParams(mesh_params)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLMeshLODResponder : public LLCurl::Responder
-{
-public:
- LLVolumeParams mMeshParams;
- S32 mLOD;
- U32 mRequestedBytes;
- U32 mOffset;
-
- LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
- : mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLMeshSkinInfoResponder : public LLCurl::Responder
-{
-public:
- LLUUID mMeshID;
- U32 mRequestedBytes;
- U32 mOffset;
-
- LLMeshSkinInfoResponder(const LLUUID& id, U32 offset, U32 size)
- : mMeshID(id), mRequestedBytes(size), mOffset(offset)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLMeshDecompositionResponder : public LLCurl::Responder
-{
-public:
- LLUUID mMeshID;
- U32 mRequestedBytes;
- U32 mOffset;
-
- LLMeshDecompositionResponder(const LLUUID& id, U32 offset, U32 size)
- : mMeshID(id), mRequestedBytes(size), mOffset(offset)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLMeshPhysicsShapeResponder : public LLCurl::Responder
-{
-public:
- LLUUID mMeshID;
- U32 mRequestedBytes;
- U32 mOffset;
-
- LLMeshPhysicsShapeResponder(const LLUUID& id, U32 offset, U32 size)
- : mMeshID(id), mRequestedBytes(size), mOffset(offset)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLModelObjectUploadResponder: public LLCurl::Responder
-{
- LLSD mObjectAsset;
- LLMeshUploadThread* mThread;
-
-public:
- LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset):
- mThread(thread),
- mObjectAsset(object_asset)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- assert_main_thread();
-
- llinfos << "completed" << llendl;
- mThread->mPendingUploads--;
- mThread->mFinished = true;
- }
-};
-
-class LLWholeModelFeeResponder: public LLCurl::Responder
-{
- LLMeshUploadThread* mThread;
-public:
- LLWholeModelFeeResponder(LLMeshUploadThread* thread):
- mThread(thread)
- {
- }
- virtual void completed(U32 status,
- const std::string& reason,
- const LLSD& content)
- {
- //assert_main_thread();
- llinfos << "completed" << llendl;
- mThread->mPendingUploads--;
- dumpLLSDToFile(content,"whole_model_fee_response.xml");
- if (isGoodStatus(status))
- {
- mThread->mWholeModelUploadURL = content["uploader"].asString();
- }
- else
- {
- llinfos << "upload failed" << llendl;
- mThread->mWholeModelUploadURL = "";
- }
-
- }
-};
-
-class LLWholeModelUploadResponder: public LLCurl::Responder
-{
- LLMeshUploadThread* mThread;
- LLSD mPostData;
-
-public:
- LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& post_data):
- mThread(thread),
- mPostData(post_data)
- {
- }
- virtual void completed(U32 status,
- const std::string& reason,
- const LLSD& content)
- {
- //assert_main_thread();
- llinfos << "upload completed" << llendl;
- mThread->mPendingUploads--;
- dumpLLSDToFile(content,"whole_model_upload_response.xml");
- // requested "mesh" asset type isn't actually the type
- // of the resultant object, fix it up here.
- mPostData["asset_type"] = "object";
- gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mPostData,content));
- }
-};
-
-LLMeshRepoThread::LLMeshRepoThread()
-: LLThread("mesh repo", NULL)
-{
- mWaiting = false;
- mMutex = new LLMutex(NULL);
- mHeaderMutex = new LLMutex(NULL);
- mSignal = new LLCondition(NULL);
-}
-
-LLMeshRepoThread::~LLMeshRepoThread()
-{
- delete mMutex;
- mMutex = NULL;
- delete mHeaderMutex;
- mHeaderMutex = NULL;
- delete mSignal;
- mSignal = NULL;
-}
-
-void LLMeshRepoThread::run()
-{
- mCurlRequest = new LLCurlRequest();
- LLCDResult res = LLConvexDecomposition::initThread();
- if (res != LLCD_OK)
- {
- llwarns << "convex decomposition unable to be loaded" << llendl;
- }
-
- while (!LLApp::isQuitting())
- {
- mWaiting = true;
- mSignal->wait();
- mWaiting = false;
-
- if (!LLApp::isQuitting())
- {
- static U32 count = 0;
-
- static F32 last_hundred = gFrameTimeSeconds;
-
- if (gFrameTimeSeconds - last_hundred > 1.f)
- { //a second has gone by, clear count
- last_hundred = gFrameTimeSeconds;
- count = 0;
- }
-
- // NOTE: throttling intentionally favors LOD requests over header requests
-
- while (!mLODReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveLODRequests < sMaxConcurrentRequests)
- {
- {
- mMutex->lock();
- LODRequest req = mLODReqQ.front();
- mLODReqQ.pop();
- mMutex->unlock();
- if (fetchMeshLOD(req.mMeshParams, req.mLOD))
- {
- count++;
- }
- }
- }
-
- while (!mHeaderReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveHeaderRequests < sMaxConcurrentRequests)
- {
- {
- mMutex->lock();
- HeaderRequest req = mHeaderReqQ.front();
- mHeaderReqQ.pop();
- mMutex->unlock();
- if (fetchMeshHeader(req.mMeshParams))
- {
- count++;
- }
- }
- }
-
- { //mSkinRequests is protected by mSignal
- std::set<LLUUID> incomplete;
- for (std::set<LLUUID>::iterator iter = mSkinRequests.begin(); iter != mSkinRequests.end(); ++iter)
- {
- LLUUID mesh_id = *iter;
- if (!fetchMeshSkinInfo(mesh_id))
- {
- incomplete.insert(mesh_id);
- }
- }
- mSkinRequests = incomplete;
- }
-
- { //mDecompositionRequests is protected by mSignal
- std::set<LLUUID> incomplete;
- for (std::set<LLUUID>::iterator iter = mDecompositionRequests.begin(); iter != mDecompositionRequests.end(); ++iter)
- {
- LLUUID mesh_id = *iter;
- if (!fetchMeshDecomposition(mesh_id))
- {
- incomplete.insert(mesh_id);
- }
- }
- mDecompositionRequests = incomplete;
- }
-
- { //mPhysicsShapeRequests is protected by mSignal
- std::set<LLUUID> incomplete;
- for (std::set<LLUUID>::iterator iter = mPhysicsShapeRequests.begin(); iter != mPhysicsShapeRequests.end(); ++iter)
- {
- LLUUID mesh_id = *iter;
- if (!fetchMeshPhysicsShape(mesh_id))
- {
- incomplete.insert(mesh_id);
- }
- }
- mPhysicsShapeRequests = incomplete;
- }
-
- mCurlRequest->process();
- }
- }
-
- if (mSignal->isLocked())
- { //make sure to let go of the mutex associated with the given signal before shutting down
- mSignal->unlock();
- }
-
- res = LLConvexDecomposition::quitThread();
- if (res != LLCD_OK)
- {
- llwarns << "convex decomposition unable to be quit" << llendl;
- }
-
- delete mCurlRequest;
- mCurlRequest = NULL;
-}
-
-void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id)
-{ //protected by mSignal, no locking needed here
- mSkinRequests.insert(mesh_id);
-}
-
-void LLMeshRepoThread::loadMeshDecomposition(const LLUUID& mesh_id)
-{ //protected by mSignal, no locking needed here
- mDecompositionRequests.insert(mesh_id);
-}
-
-void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
-{ //protected by mSignal, no locking needed here
- mPhysicsShapeRequests.insert(mesh_id);
-}
-
-
-void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{ //protected by mSignal, no locking needed here
-
- mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
- if (iter != mMeshHeader.end())
- { //if we have the header, request LOD byte range
- LODRequest req(mesh_params, lod);
- {
- LLMutexLock lock(mMutex);
- mLODReqQ.push(req);
- }
- }
- else
- {
- HeaderRequest req(mesh_params);
-
- pending_lod_map::iterator pending = mPendingLOD.find(mesh_params);
-
- if (pending != mPendingLOD.end())
- { //append this lod request to existing header request
- pending->second.push_back(lod);
- if (pending->second.size() > 4)
- {
- llerrs << "WTF?" << llendl;
- }
- }
- else
- { //if no header request is pending, fetch header
- LLMutexLock lock(mMutex);
- mHeaderReqQ.push(req);
- mPendingLOD[mesh_params].push_back(lod);
- }
- }
-}
-
-//static
-std::string LLMeshRepoThread::constructUrl(LLUUID mesh_id)
-{
- std::string http_url;
-
- if (gAgent.getRegion())
- {
- http_url = gMeshRepo.mGetMeshCapability;
- }
-
- if (!http_url.empty())
- {
- http_url += "/?mesh_id=";
- http_url += mesh_id.asString().c_str();
- }
- else
- {
- llwarns << "Current region does not have GetMesh capability! Cannot load " << mesh_id << ".mesh" << llendl;
- }
-
- return http_url;
-}
-
-bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
-{ //protected by mMutex
- mHeaderMutex->lock();
-
- if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
- { //we have no header info for this mesh, do nothing
- mHeaderMutex->unlock();
- return false;
- }
-
- U32 header_size = mMeshHeaderSize[mesh_id];
-
- if (header_size > 0)
- {
- S32 offset = header_size + mMeshHeader[mesh_id]["skin"]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id]["skin"]["size"].asInteger();
-
- mHeaderMutex->unlock();
-
- if (offset >= 0 && size > 0)
- {
- //check VFS for mesh skin info
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesRead += size;
- file.seek(offset);
- U8* buffer = new U8[size];
- file.read(buffer, size);
-
- //make sure buffer isn't all 0's (reserved block but not written)
- bool zero = true;
- for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
- {
- zero = buffer[i] > 0 ? false : true;
- }
-
- if (!zero)
- { //attempt to parse
- if (skinInfoReceived(mesh_id, buffer, size))
- {
- delete[] buffer;
- return true;
- }
- }
-
- delete[] buffer;
- }
-
- //reading from VFS failed for whatever reason, fetch from sim
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_id);
- if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
- new LLMeshSkinInfoResponder(mesh_id, offset, size));
- }
- }
- }
- else
- {
- mHeaderMutex->unlock();
- }
-
- //early out was not hit, effectively fetched
- return true;
-}
-
-bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
-{ //protected by mMutex
- mHeaderMutex->lock();
-
- if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
- { //we have no header info for this mesh, do nothing
- mHeaderMutex->unlock();
- return false;
- }
-
- U32 header_size = mMeshHeaderSize[mesh_id];
-
- if (header_size > 0)
- {
- S32 offset = header_size + mMeshHeader[mesh_id]["decomposition"]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id]["decomposition"]["size"].asInteger();
-
- mHeaderMutex->unlock();
-
- if (offset >= 0 && size > 0)
- {
- //check VFS for mesh skin info
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesRead += size;
- file.seek(offset);
- U8* buffer = new U8[size];
- file.read(buffer, size);
-
- //make sure buffer isn't all 0's (reserved block but not written)
- bool zero = true;
- for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
- {
- zero = buffer[i] > 0 ? false : true;
- }
-
- if (!zero)
- { //attempt to parse
- if (decompositionReceived(mesh_id, buffer, size))
- {
- delete[] buffer;
- return true;
- }
- }
-
- delete[] buffer;
- }
-
- //reading from VFS failed for whatever reason, fetch from sim
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_id);
- if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, offset, size,
- new LLMeshDecompositionResponder(mesh_id, offset, size));
- }
- }
- }
- else
- {
- mHeaderMutex->unlock();
- }
-
- //early out was not hit, effectively fetched
- return true;
-}
-
-bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
-{ //protected by mMutex
- mHeaderMutex->lock();
-
- if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
- { //we have no header info for this mesh, do nothing
- mHeaderMutex->unlock();
- return false;
- }
-
- U32 header_size = mMeshHeaderSize[mesh_id];
-
- if (header_size > 0)
- {
- S32 offset = header_size + mMeshHeader[mesh_id]["physics_shape"]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id]["physics_shape"]["size"].asInteger();
-
- mHeaderMutex->unlock();
-
- if (offset >= 0 && size > 0)
- {
- //check VFS for mesh physics shape info
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesRead += size;
- file.seek(offset);
- U8* buffer = new U8[size];
- file.read(buffer, size);
-
- //make sure buffer isn't all 0's (reserved block but not written)
- bool zero = true;
- for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
- {
- zero = buffer[i] > 0 ? false : true;
- }
-
- if (!zero)
- { //attempt to parse
- if (physicsShapeReceived(mesh_id, buffer, size))
- {
- delete[] buffer;
- return true;
- }
- }
-
- delete[] buffer;
- }
-
- //reading from VFS failed for whatever reason, fetch from sim
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_id);
- if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, offset, size,
- new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
- }
- }
- else
- { //no physics shape whatsoever, report back NULL
- physicsShapeReceived(mesh_id, NULL, 0);
- }
- }
- else
- {
- mHeaderMutex->unlock();
- }
-
- //early out was not hit, effectively fetched
- return true;
-}
-
-bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
-{
- bool retval = false;
-
- {
- //look for mesh in asset in vfs
- LLVFile file(gVFS, mesh_params.getSculptID(), LLAssetType::AT_MESH);
-
- S32 size = file.getSize();
-
- if (size > 0)
- {
- U8 buffer[1024];
- S32 bytes = llmin(size, 1024);
- LLMeshRepository::sCacheBytesRead += bytes;
- file.read(buffer, bytes);
- if (headerReceived(mesh_params, buffer, bytes))
- { //did not do an HTTP request, return false
- return false;
- }
- }
- }
-
- //either cache entry doesn't exist or is corrupt, request header from simulator
-
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_params.getSculptID());
- if (!http_url.empty())
- {
- ++sActiveHeaderRequests;
- retval = true;
- //grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
- //within the first 4KB
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
- }
-
- return retval;
-}
-
-bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{ //protected by mMutex
- mHeaderMutex->lock();
-
- bool retval = false;
-
- LLUUID mesh_id = mesh_params.getSculptID();
-
- U32 header_size = mMeshHeaderSize[mesh_id];
-
- if (header_size > 0)
- {
- S32 offset = header_size + mMeshHeader[mesh_id][header_lod[lod]]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id][header_lod[lod]]["size"].asInteger();
- mHeaderMutex->unlock();
- if (offset >= 0 && size > 0)
- {
-
- //check VFS for mesh asset
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesRead += size;
- file.seek(offset);
- U8* buffer = new U8[size];
- file.read(buffer, size);
-
- //make sure buffer isn't all 0's (reserved block but not written)
- bool zero = true;
- for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
- {
- zero = buffer[i] > 0 ? false : true;
- }
-
- if (!zero)
- { //attempt to parse
- if (lodReceived(mesh_params, lod, buffer, size))
- {
- delete[] buffer;
- return false;
- }
- }
-
- delete[] buffer;
- }
-
- //reading from VFS failed for whatever reason, fetch from sim
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_id);
- if (!http_url.empty())
- {
- ++sActiveLODRequests;
- retval = true;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
- new LLMeshLODResponder(mesh_params, lod, offset, size));
- }
- else
- {
- mUnavailableQ.push(LODRequest(mesh_params, lod));
- }
- }
- else
- {
- mUnavailableQ.push(LODRequest(mesh_params, lod));
- }
- }
- else
- {
- mHeaderMutex->unlock();
- }
-
- return retval;
-}
-
-bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
-{
- LLSD header;
-
- U32 header_size = 0;
- if (data_size > 0)
- {
- std::string res_str((char*) data, data_size);
-
- std::string deprecated_header("<? LLSD/Binary ?>");
-
- if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
- {
- res_str = res_str.substr(deprecated_header.size()+1, data_size);
- header_size = deprecated_header.size()+1;
- }
- data_size = res_str.size();
-
- std::istringstream stream(res_str);
-
- if (!LLSDSerialize::fromBinary(header, stream, data_size))
- {
- llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
- return false;
- }
-
- header_size += stream.tellg();
- }
- else
- {
- llinfos
- << "Marking header as non-existent, will not retry." << llendl;
- header["404"] = 1;
- }
-
- {
- U32 cost = gMeshRepo.calcResourceCost(header);
-
- LLUUID mesh_id = mesh_params.getSculptID();
-
- mHeaderMutex->lock();
- mMeshHeaderSize[mesh_id] = header_size;
- mMeshHeader[mesh_id] = header;
- mMeshResourceCost[mesh_id] = cost;
- mHeaderMutex->unlock();
-
- //check for pending requests
- pending_lod_map::iterator iter = mPendingLOD.find(mesh_params);
- if (iter != mPendingLOD.end())
- {
- LLMutexLock lock(mMutex);
- for (U32 i = 0; i < iter->second.size(); ++i)
- {
- LODRequest req(mesh_params, iter->second[i]);
- mLODReqQ.push(req);
- }
- }
- mPendingLOD.erase(iter);
- }
-
- return true;
-}
-
-bool LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
-{
- LLVolume* volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
- std::string mesh_string((char*) data, data_size);
- std::istringstream stream(mesh_string);
-
- if (volume->unpackVolumeFaces(stream, data_size))
- {
- LoadedMesh mesh(volume, mesh_params, lod);
- if (volume->getNumFaces() > 0)
- {
- LLMutexLock lock(mMutex);
- mLoadedQ.push(mesh);
- return true;
- }
- }
-
- return false;
-}
-
-bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
-{
- LLSD skin;
-
- if (data_size > 0)
- {
- std::string res_str((char*) data, data_size);
-
- std::istringstream stream(res_str);
-
- if (!unzip_llsd(skin, stream, data_size))
- {
- llwarns << "Mesh skin info parse error. Not a valid mesh asset!" << llendl;
- return false;
- }
- }
-
- {
- LLMeshSkinInfo info(skin);
- info.mMeshID = mesh_id;
-
- //llinfos<<"info pelvis offset"<<info.mPelvisOffset<<llendl;
- mSkinInfoQ.push(info);
- }
-
- return true;
-}
-
-bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
-{
- LLSD decomp;
-
- if (data_size > 0)
- {
- std::string res_str((char*) data, data_size);
-
- std::istringstream stream(res_str);
-
- if (!unzip_llsd(decomp, stream, data_size))
- {
- llwarns << "Mesh decomposition parse error. Not a valid mesh asset!" << llendl;
- return false;
- }
- }
-
- {
- LLModel::Decomposition* d = new LLModel::Decomposition(decomp);
- d->mMeshID = mesh_id;
- mDecompositionQ.push(d);
- }
-
- return true;
-}
-
-bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
-{
- LLSD physics_shape;
-
- LLModel::Decomposition* d = new LLModel::Decomposition();
- d->mMeshID = mesh_id;
-
- if (data == NULL)
- { //no data, no physics shape exists
- d->mPhysicsShapeMesh.clear();
- }
- else
- {
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
- volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH);
- LLPointer<LLVolume> volume = new LLVolume(volume_params,0);
- std::string mesh_string((char*) data, data_size);
- std::istringstream stream(mesh_string);
-
- if (volume->unpackVolumeFaces(stream, data_size))
- {
- //load volume faces into decomposition buffer
- S32 vertex_count = 0;
- S32 index_count = 0;
-
- for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = volume->getVolumeFace(i);
- vertex_count += face.mNumVertices;
- index_count += face.mNumIndices;
- }
-
- d->mPhysicsShapeMesh.clear();
-
- std::vector<LLVector3>& pos = d->mPhysicsShapeMesh.mPositions;
- std::vector<LLVector3>& norm = d->mPhysicsShapeMesh.mNormals;
-
- for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = volume->getVolumeFace(i);
-
- for (S32 i = 0; i < face.mNumIndices; ++i)
- {
- U16 idx = face.mIndices[i];
-
- pos.push_back(LLVector3(face.mPositions[idx].getF32ptr()));
- norm.push_back(LLVector3(face.mNormals[idx].getF32ptr()));
- }
- }
- }
- }
-
- mDecompositionQ.push(d);
- return true;
-}
-
-LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints)
-: LLThread("mesh upload"),
- mDiscarded(FALSE)
-{
- mInstanceList = data;
- mUploadTextures = upload_textures;
- mUploadSkin = upload_skin;
- mUploadJoints = upload_joints;
- mMutex = new LLMutex(NULL);
- mCurlRequest = NULL;
- mPendingConfirmations = 0;
- mPendingUploads = 0;
- mPendingCost = 0;
- mFinished = false;
- mOrigin = gAgent.getPositionAgent();
- mHost = gAgent.getRegionHost();
-
- mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset");
- mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice");
- mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
-
- mOrigin += gAgent.getAtAxis() * scale.magVec();
-}
-
-LLMeshUploadThread::~LLMeshUploadThread()
-{
-
-}
-
-LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread)
-{
- mStage = "single_hull";
- mModel = mdl;
- mDecompID = &mdl->mDecompID;
- mBaseModel = base_model;
- mThread = thread;
-
- //copy out positions and indices
- if (mdl)
- {
- U16 index_offset = 0;
-
- mPositions.clear();
- mIndices.clear();
-
- //queue up vertex positions and indices
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = mdl->getVolumeFace(i);
- if (mPositions.size() + face.mNumVertices > 65535)
- {
- continue;
- }
-
- for (U32 j = 0; j < face.mNumVertices; ++j)
- {
- mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
- }
-
- for (U32 j = 0; j < face.mNumIndices; ++j)
- {
- mIndices.push_back(face.mIndices[j]+index_offset);
- }
-
- index_offset += face.mNumVertices;
- }
- }
-
- mThread->mFinalDecomp = this;
- mThread->mPhysicsComplete = false;
-}
-
-void LLMeshUploadThread::DecompRequest::completed()
-{
- if (mThread->mFinalDecomp == this)
- {
- mThread->mPhysicsComplete = true;
- }
-
- if (mHull.size() != 1)
- {
- llerrs << "WTF?" << llendl;
- }
-
- mThread->mHullMap[mBaseModel] = mHull[0];
-}
-
-//called in the main thread.
-void LLMeshUploadThread::preStart()
-{
- //build map of LLModel refs to instances for callbacks
- for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
- {
- mInstance[iter->mModel].push_back(*iter);
- }
-}
-
-void LLMeshUploadThread::discard()
-{
- LLMutexLock lock(mMutex) ;
- mDiscarded = TRUE ;
-}
-
-BOOL LLMeshUploadThread::isDiscarded()
-{
- LLMutexLock lock(mMutex) ;
- return mDiscarded ;
-}
-
-void LLMeshUploadThread::run()
-{
- if (gSavedSettings.getBOOL("MeshUseWholeModelUpload"))
- {
- doWholeModelUpload();
- }
- else
- {
- doIterativeUpload();
- }
-}
-
-void dumpLLSDToFile(const LLSD& content, std::string filename)
-{
-#if 1
- std::ofstream of(filename.c_str());
- LLSDSerialize::toPrettyXML(content,of);
-#endif
-}
-
-void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
-{
- LLSD result;
-
- LLSD res;
- result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
- result["asset_type"] = "mesh";
- result["inventory_type"] = "object";
- result["name"] = "mesh model";
- result["description"] = "your description here";
-
- res["mesh_list"] = LLSD::emptyArray();
- res["texture_list"] = LLSD::emptyArray();
- res["instance_list"] = LLSD::emptyArray();
- S32 mesh_num = 0;
- S32 texture_num = 0;
-
- std::set<LLViewerTexture* > textures;
- std::map<LLViewerTexture*,S32> texture_index;
-
- std::map<LLModel*,S32> mesh_index;
-
- S32 instance_num = 0;
-
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
- {
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
- LLModelInstance& instance = *(iter->second.begin());
- LLModel* model = instance.mModel;
- if (mesh_index.find(model) == mesh_index.end())
- {
- // Have not seen this model before - create a new mesh_list entry for it.
- std::string model_name = data.mBaseModel->getName();
- if (!model_name.empty())
- {
- result["name"] = model_name;
- }
-
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- decomp.mBaseHull = mHullMap[data.mBaseModel];
-
- LLSD mesh_header = LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints);
-
- data.mAssetData = ostr.str();
- std::string str = ostr.str();
-
- res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
- mesh_index[model] = mesh_num;
- mesh_num++;
- }
-
- LLSD instance_entry;
-
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
-
- LLVector3 pos, scale;
- LLQuaternion rot;
- LLMatrix4 transformation = instance.mTransform;
- decomposeMeshMatrix(transformation,pos,rot,scale);
- instance_entry["position"] = ll_sd_from_vector3(pos);
- instance_entry["rotation"] = ll_sd_from_quaternion(rot);
- instance_entry["scale"] = ll_sd_from_vector3(scale);
-
- instance_entry["material"] = LL_MCODE_WOOD;
- LLPermissions perm;
- perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
- perm.setCreator(gAgent.getID());
-
- perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
- PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
- LLFloaterPerms::getEveryonePerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getNextOwnerPerms());
- instance_entry["permissions"] = ll_create_sd_from_permissions(perm);
- instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
- instance_entry["mesh"] = mesh_index[model];
-
- if (mUploadTextures)
- {
- instance_entry["face_list"] = LLSD::emptyArray();
-
- for (S32 face_num = 0; face_num < model->getNumVolumeFaces(); face_num++)
- {
- LLImportMaterial& material = instance.mMaterial[face_num];
- LLSD face_entry = LLSD::emptyMap();
- LLViewerFetchedTexture *texture = material.mDiffuseMap.get();
-
- if (texture != NULL)
- {
- if (textures.find(texture) == textures.end())
- {
- textures.insert(texture);
- }
-
- std::stringstream ostr;
- if (include_textures) // otherwise data is blank.
- {
- LLTextureUploadData data(texture, material.mDiffuseMapLabel);
- if (!data.mTexture->isRawImageValid())
- {
- data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
- }
-
- LLPointer<LLImageJ2C> upload_file =
- LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
- ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
- }
-
- if (texture_index.find(texture) == texture_index.end())
- {
- texture_index[texture] = texture_num;
- std::string str = ostr.str();
- res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
- texture_num++;
- }
- }
-
- // Subset of TextureEntry fields.
- if (texture)
- {
- face_entry["image"] = texture_index[texture];
- }
- face_entry["scales"] = 1.0;
- face_entry["scalet"] = 1.0;
- face_entry["offsets"] = 0.0;
- face_entry["offsett"] = 0.0;
- face_entry["imagerot"] = 0.0;
- face_entry["colors"] = ll_sd_from_color4(material.mDiffuseColor);
- face_entry["fullbright"] = material.mFullbright;
- instance_entry["face_list"][face_num] = face_entry;
- }
- }
-
- res["instance_list"][instance_num] = instance_entry;
- instance_num++;
- }
-
- result["asset_resources"] = res;
- dumpLLSDToFile(result,"whole_model.xml");
-
- dest = result;
-}
-
-void LLMeshUploadThread::doWholeModelUpload()
-{
- mCurlRequest = new LLCurlRequest();
-
- // Queue up models for hull generation (viewer-side)
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
- {
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
-
- LLModelInstance& instance = *(iter->second.begin());
-
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
-
- //queue up models for hull generation
- LLModel* physics = NULL;
-
- if (data.mModel[LLModel::LOD_PHYSICS].notNull())
- {
- physics = data.mModel[LLModel::LOD_PHYSICS];
- }
- else if (data.mModel[LLModel::LOD_MEDIUM].notNull())
- {
- physics = data.mModel[LLModel::LOD_MEDIUM];
- }
- else
- {
- physics = data.mModel[LLModel::LOD_HIGH];
- }
-
- if (!physics)
- {
- llerrs << "WTF?" << llendl;
- }
-
- DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
- gMeshRepo.mDecompThread->submitRequest(request);
- }
-
- while (!mPhysicsComplete)
- {
- apr_sleep(100);
- }
-
- LLSD model_data;
- wholeModelToLLSD(model_data,false);
- dumpLLSDToFile(model_data,"whole_model_fee_request.xml");
-
- mPendingUploads++;
- LLCurlRequest::headers_t headers;
- mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
- new LLWholeModelFeeResponder(this));
-
- do
- {
- mCurlRequest->process();
- } while (mCurlRequest->getQueued() > 0);
-
-
- if (mWholeModelUploadURL.empty())
- {
- llinfos << "unable to upload, fee request failed" << llendl;
- }
- else
- {
- LLSD full_model_data;
- wholeModelToLLSD(full_model_data, true);
- LLSD body = full_model_data["asset_resources"];
- dumpLLSDToFile(body,"whole_model_body.xml");
- mCurlRequest->post(mWholeModelUploadURL, headers, body,
- new LLWholeModelUploadResponder(this, model_data));
- do
- {
- mCurlRequest->process();
- } while (mCurlRequest->getQueued() > 0);
- }
-
- delete mCurlRequest;
- mCurlRequest = NULL;
-
- // Currently a no-op.
- mFinished = true;
-}
-
-void LLMeshUploadThread::doIterativeUpload()
-{
- if(isDiscarded())
- {
- mFinished = true;
- return ;
- }
-
- mCurlRequest = new LLCurlRequest();
-
- std::set<LLViewerTexture* > textures;
-
- //populate upload queue with relevant models
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
- {
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
-
- LLModelInstance& instance = *(iter->second.begin());
-
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
-
- uploadModel(data);
-
- if (mUploadTextures)
- {
- for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin();
- material_iter != instance.mMaterial.end(); ++material_iter)
- {
-
- if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
- {
- textures.insert(material_iter->mDiffuseMap.get());
-
- LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
- uploadTexture(data);
- }
- }
- }
-
- //queue up models for hull generation
- DecompRequest* request = new DecompRequest(data.mModel[LLModel::LOD_HIGH], data.mBaseModel, this);
- gMeshRepo.mDecompThread->submitRequest(request);
- }
-
- while (!mPhysicsComplete)
- {
- apr_sleep(100);
- }
-
- //upload textures
- bool done = false;
- do
- {
- if (!mTextureQ.empty())
- {
- sendCostRequest(mTextureQ.front());
- mTextureQ.pop();
- }
-
- if (!mConfirmedTextureQ.empty())
- {
- doUploadTexture(mConfirmedTextureQ.front());
- mConfirmedTextureQ.pop();
- }
-
- mCurlRequest->process();
-
- done = mTextureQ.empty() && mConfirmedTextureQ.empty();
- }
- while (!done || mCurlRequest->getQueued() > 0);
-
- LLSD object_asset;
- object_asset["objects"] = LLSD::emptyArray();
-
- done = false;
- do
- {
- static S32 count = 0;
- static F32 last_hundred = gFrameTimeSeconds;
- if (gFrameTimeSeconds - last_hundred > 1.f)
- {
- last_hundred = gFrameTimeSeconds;
- count = 0;
- }
-
- //how many requests to push before calling process
- const S32 PUSH_PER_PROCESS = 32;
-
- S32 tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mUploadQ.empty() && count < tcount)
- { //send any pending upload requests
- mMutex->lock();
- LLMeshUploadData data = mUploadQ.front();
- mUploadQ.pop();
- mMutex->unlock();
- sendCostRequest(data);
- count++;
- }
-
- tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mConfirmedQ.empty() && count < tcount)
- { //process any meshes that have been confirmed for upload
- LLMeshUploadData& data = mConfirmedQ.front();
- doUploadModel(data);
- mConfirmedQ.pop();
- count++;
- }
-
- tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mInstanceQ.empty() && count < tcount && !isDiscarded())
- { //create any objects waiting for upload
- count++;
- object_asset["objects"].append(createObject(mInstanceQ.front()));
- mInstanceQ.pop();
- }
-
- mCurlRequest->process();
-
- done = isDiscarded() || (mInstanceQ.empty() && mConfirmedQ.empty() && mUploadQ.empty());
- }
- while (!done || mCurlRequest->getQueued() > 0);
-
- delete mCurlRequest;
- mCurlRequest = NULL;
-
- // now upload the object asset
- std::string url = mUploadObjectAssetCapability;
-
- if (object_asset["objects"][0].has("permissions"))
- { //copy permissions from first available object to be used for coalesced object
- object_asset["permissions"] = object_asset["objects"][0]["permissions"];
- }
-
- if(!isDiscarded())
- {
- mPendingUploads++;
- LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset));
- }
- else
- {
- mFinished = true;
- }
-}
-
-void LLMeshUploadThread::uploadModel(LLMeshUploadData& data)
-{ //called from arbitrary thread
- {
- LLMutexLock lock(mMutex);
- mUploadQ.push(data);
- }
-}
-
-void LLMeshUploadThread::uploadTexture(LLTextureUploadData& data)
-{ //called from mesh upload thread
- mTextureQ.push(data);
-}
-
-
-static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_LOADED("Notify Loaded");
-static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_UNAVAILABLE("Notify Unavailable");
-
-void LLMeshRepoThread::notifyLoadedMeshes()
-{
- while (!mLoadedQ.empty())
- {
- mMutex->lock();
- LoadedMesh mesh = mLoadedQ.front();
- mLoadedQ.pop();
- mMutex->unlock();
-
- if (mesh.mVolume && mesh.mVolume->getNumVolumeFaces() > 0)
- {
- gMeshRepo.notifyMeshLoaded(mesh.mMeshParams, mesh.mVolume);
- }
- else
- {
- gMeshRepo.notifyMeshUnavailable(mesh.mMeshParams,
- LLVolumeLODGroup::getVolumeDetailFromScale(mesh.mVolume->getDetail()));
- }
- }
-
- while (!mUnavailableQ.empty())
- {
- mMutex->lock();
- LODRequest req = mUnavailableQ.front();
- mUnavailableQ.pop();
- mMutex->unlock();
-
- gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD);
- }
-
- while (!mSkinInfoQ.empty())
- {
- gMeshRepo.notifySkinInfoReceived(mSkinInfoQ.front());
- mSkinInfoQ.pop();
- }
-
- while (!mDecompositionQ.empty())
- {
- gMeshRepo.notifyDecompositionReceived(mDecompositionQ.front());
- mDecompositionQ.pop();
- }
-}
-
-S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{ //only ever called from main thread
- LLMutexLock lock(mHeaderMutex);
- mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
-
- if (iter != mMeshHeader.end())
- {
- LLSD& header = iter->second;
-
- return LLMeshRepository::getActualMeshLOD(header, lod);
- }
-
- return lod;
-}
-
-//static
-S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
-{
- lod = llclamp(lod, 0, 3);
-
- if (header.has("404"))
- {
- return -1;
- }
-
- if (header[header_lod[lod]]["size"].asInteger() > 0)
- {
- return lod;
- }
-
- //search down to find the next available lower lod
- for (S32 i = lod-1; i >= 0; --i)
- {
- if (header[header_lod[i]]["size"].asInteger() > 0)
- {
- return i;
- }
- }
-
- //search up to find then ext available higher lod
- for (S32 i = lod+1; i < 4; ++i)
- {
- if (header[header_lod[i]]["size"].asInteger() > 0)
- {
- return i;
- }
- }
-
- //header exists and no good lod found, treat as 404
- header["404"] = 1;
- return -1;
-}
-
-U32 LLMeshRepoThread::getResourceCost(const LLUUID& mesh_id)
-{
- LLMutexLock lock(mHeaderMutex);
-
- std::map<LLUUID, U32>::iterator iter = mMeshResourceCost.find(mesh_id);
- if (iter != mMeshResourceCost.end())
- {
- return iter->second;
- }
-
- return 0;
-}
-
-void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
-{
- mThread->mMeshHeader[data.mUUID] = header;
-
- // we cache the mesh for default parameters
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
- volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH);
-
- for (U32 i = 0; i < 4; i++)
- {
- if (data.mModel[i].notNull())
- {
- LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
- volume->copyVolumeFaces(data.mModel[i]);
- }
- }
-
-}
-
-void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
-
- LLMeshRepoThread::sActiveLODRequests--;
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- if (status < 200 || status > 400)
- {
- llwarns << status << ": " << reason << llendl;
- }
-
- if (data_size < mRequestedBytes)
- {
- if (status == 499 || status == 503)
- { //timeout or service unavailable, try again
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->loadMeshLOD(mMeshParams, mLOD);
- }
- else
- {
- llwarns << "Unhandled status " << status << llendl;
- }
- return;
- }
-
- LLMeshRepository::sBytesReceived += mRequestedBytes;
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- if (gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))
- {
- //good fetch from sim, write to VFS for caching
- LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE);
-
- S32 offset = mOffset;
- S32 size = mRequestedBytes;
-
- if (file.getSize() >= offset+size)
- {
- file.seek(offset);
- file.write(data, size);
- LLMeshRepository::sCacheBytesWritten += size;
- }
- }
-
- delete [] data;
-}
-
-void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- if (status < 200 || status > 400)
- {
- llwarns << status << ": " << reason << llendl;
- }
-
- if (data_size < mRequestedBytes)
- {
- if (status == 499 || status == 503)
- { //timeout or service unavailable, try again
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
- }
- else
- {
- llwarns << "Unhandled status " << status << llendl;
- }
- return;
- }
-
- LLMeshRepository::sBytesReceived += mRequestedBytes;
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- if (gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
- {
- //good fetch from sim, write to VFS for caching
- LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
-
- S32 offset = mOffset;
- S32 size = mRequestedBytes;
-
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesWritten += size;
- file.seek(offset);
- file.write(data, size);
- }
- }
-
- delete [] data;
-}
-
-void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- if (status < 200 || status > 400)
- {
- llwarns << status << ": " << reason << llendl;
- }
-
- if (data_size < mRequestedBytes)
- {
- if (status == 499 || status == 503)
- { //timeout or service unavailable, try again
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
- }
- else
- {
- llwarns << "Unhandled status " << status << llendl;
- }
- return;
- }
-
- LLMeshRepository::sBytesReceived += mRequestedBytes;
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- if (gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size))
- {
- //good fetch from sim, write to VFS for caching
- LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
-
- S32 offset = mOffset;
- S32 size = mRequestedBytes;
-
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesWritten += size;
- file.seek(offset);
- file.write(data, size);
- }
- }
-
- delete [] data;
-}
-
-void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- if (status < 200 || status > 400)
- {
- llwarns << status << ": " << reason << llendl;
- }
-
- if (data_size < mRequestedBytes)
- {
- if (status == 499 || status == 503)
- { //timeout or service unavailable, try again
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
- }
- else
- {
- llwarns << "Unhandled status " << status << llendl;
- }
- return;
- }
-
- LLMeshRepository::sBytesReceived += mRequestedBytes;
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- if (gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))
- {
- //good fetch from sim, write to VFS for caching
- LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
-
- S32 offset = mOffset;
- S32 size = mRequestedBytes;
-
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesWritten += size;
- file.seek(offset);
- file.write(data, size);
- }
- }
-
- delete [] data;
-}
-
-void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
- LLMeshRepoThread::sActiveHeaderRequests--;
- if (status < 200 || status > 400)
- {
- //llwarns
- // << "Header responder failed with status: "
- // << status << ": " << reason << llendl;
-
- // 503 (service unavailable) or 499 (timeout)
- // can be due to server load and can be retried
-
- // TODO*: Add maximum retry logic, exponential backoff
- // and (somewhat more optional than the others) retries
- // again after some set period of time
- if (status == 503 || status == 499)
- { //retry
- LLMeshRepository::sHTTPRetryCount++;
- LLMeshRepoThread::HeaderRequest req(mMeshParams);
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
- gMeshRepo.mThread->mHeaderReqQ.push(req);
-
- return;
- }
- }
-
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- LLMeshRepository::sBytesReceived += llmin(data_size, 4096);
-
- if (!gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size))
- {
- llwarns
- << "Unable to parse mesh header: "
- << status << ": " << reason << llendl;
- }
- else if (data && data_size > 0)
- {
- //header was successfully retrieved from sim, cache in vfs
- LLUUID mesh_id = mMeshParams.getSculptID();
- LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id];
-
- std::stringstream str;
-
- S32 lod_bytes = 0;
-
- for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i)
- { //figure out how many bytes we'll need to reserve in the file
- std::string lod_name = header_lod[i];
- lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
- }
-
- //just in case skin info or decomposition is at the end of the file (which it shouldn't be)
- lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
- lod_bytes = llmax(lod_bytes, header["decomposition"]["offset"].asInteger() + header["decomposition"]["size"].asInteger());
-
- S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
- S32 bytes = lod_bytes + header_bytes;
-
-
- //it's possible for the remote asset to have more data than is needed for the local cache
- //only allocate as much space in the VFS as is needed for the local cache
- data_size = llmin(data_size, bytes);
-
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE);
- if (file.getMaxSize() >= bytes || file.setMaxSize(bytes))
- {
- LLMeshRepository::sCacheBytesWritten += data_size;
-
- file.write((const U8*) data, data_size);
-
- //zero out the rest of the file
- U8 block[4096];
- memset(block, 0, 4096);
-
- while (bytes-file.tell() > 4096)
- {
- file.write(block, 4096);
- }
-
- S32 remaining = bytes-file.tell();
-
- if (remaining < 0 || remaining > 4096)
- {
- llerrs << "Bad padding of mesh asset cache entry." << llendl;
- }
-
- if (remaining > 0)
- {
- file.write(block, remaining);
- }
- }
- }
-
- delete [] data;
-}
-
-
-LLMeshRepository::LLMeshRepository()
-: mMeshMutex(NULL),
- mMeshThreadCount(0),
- mThread(NULL)
-{
-
-}
-
-void LLMeshRepository::init()
-{
- mMeshMutex = new LLMutex(NULL);
-
- LLConvexDecomposition::getInstance()->initSystem();
-
- mDecompThread = new LLPhysicsDecomp();
- mDecompThread->start();
-
- while (!mDecompThread->mInited)
- { //wait for physics decomp thread to init
- apr_sleep(100);
- }
-
-
-
- mThread = new LLMeshRepoThread();
- mThread->start();
-}
-
-void LLMeshRepository::shutdown()
-{
- llinfos << "Shutting down mesh repository." << llendl;
-
- for (U32 i = 0; i < mUploads.size(); ++i)
- {
- llinfos << "Discard the pending mesh uploads " << llendl;
- mUploads[i]->discard() ; //discard the uploading requests.
- }
-
- mThread->mSignal->signal();
-
- while (!mThread->isStopped())
- {
- apr_sleep(10);
- }
- delete mThread;
- mThread = NULL;
-
- for (U32 i = 0; i < mUploads.size(); ++i)
- {
- llinfos << "Waiting for pending mesh upload " << i << "/" << mUploads.size() << llendl;
- while (!mUploads[i]->isStopped())
- {
- apr_sleep(10);
- }
- delete mUploads[i];
- }
-
- mUploads.clear();
-
- delete mMeshMutex;
- mMeshMutex = NULL;
-
- llinfos << "Shutting down decomposition system." << llendl;
-
- if (mDecompThread)
- {
- mDecompThread->shutdown();
- delete mDecompThread;
- mDecompThread = NULL;
- }
-
- LLConvexDecomposition::quitSystem();
-}
-
-//called in the main thread.
-S32 LLMeshRepository::update()
-{
- if(mUploadWaitList.empty())
- {
- return 0 ;
- }
-
- S32 size = mUploadWaitList.size() ;
- for (S32 i = 0; i < size; ++i)
- {
- mUploads.push_back(mUploadWaitList[i]);
- mUploadWaitList[i]->preStart() ;
- mUploadWaitList[i]->start() ;
- }
- mUploadWaitList.clear() ;
-
- return size ;
-}
-
-S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail, S32 last_lod)
-{
- if (detail < 0 || detail > 4)
- {
- return detail;
- }
-
- LLFastTimer t(FTM_LOAD_MESH);
-
- {
- LLMutexLock lock(mMeshMutex);
- //add volume to list of loading meshes
- mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_params);
- if (iter != mLoadingMeshes[detail].end())
- { //request pending for this mesh, append volume id to list
- iter->second.insert(vobj->getID());
- }
- else
- {
- //first request for this mesh
- mLoadingMeshes[detail][mesh_params].insert(vobj->getID());
- mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail));
- }
- }
-
- //do a quick search to see if we can't display something while we wait for this mesh to load
- LLVolume* volume = vobj->getVolume();
-
- if (volume)
- {
- if (volume->getNumVolumeFaces() == 0 && !volume->isTetrahedron())
- {
- volume->makeTetrahedron();
- }
-
- LLVolumeParams params = volume->getParams();
-
- LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params);
-
- if (group)
- {
- //first, see if last_lod is available (don't transition down to avoid funny popping a la SH-641)
- if (last_lod >= 0)
- {
- LLVolume* lod = group->refLOD(last_lod);
- if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
- {
- group->derefLOD(lod);
- return last_lod;
- }
- group->derefLOD(lod);
- }
-
- //next, see what the next lowest LOD available might be
- for (S32 i = detail-1; i >= 0; --i)
- {
- LLVolume* lod = group->refLOD(i);
- if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
- {
- group->derefLOD(lod);
- return i;
- }
-
- group->derefLOD(lod);
- }
-
- //no lower LOD is a available, is a higher lod available?
- for (S32 i = detail+1; i < 4; ++i)
- {
- LLVolume* lod = group->refLOD(i);
- if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
- {
- group->derefLOD(lod);
- return i;
- }
-
- group->derefLOD(lod);
- }
- }
- else
- {
- llerrs << "WTF?" << llendl;
- }
- }
-
- return detail;
-}
-
-static LLFastTimer::DeclareTimer FTM_START_MESH_THREAD("Start Thread");
-static LLFastTimer::DeclareTimer FTM_LOAD_MESH_LOD("Load LOD");
-static LLFastTimer::DeclareTimer FTM_MESH_LOCK1("Lock 1");
-static LLFastTimer::DeclareTimer FTM_MESH_LOCK2("Lock 2");
-
-void LLMeshRepository::notifyLoadedMeshes()
-{ //called from main thread
-
- LLMeshRepoThread::sMaxConcurrentRequests = gSavedSettings.getU32("MeshMaxConcurrentRequests");
-
- //clean up completed upload threads
- for (std::vector<LLMeshUploadThread*>::iterator iter = mUploads.begin(); iter != mUploads.end(); )
- {
- LLMeshUploadThread* thread = *iter;
-
- if (thread->isStopped() && thread->finished())
- {
- iter = mUploads.erase(iter);
- delete thread;
- }
- else
- {
- ++iter;
- }
- }
-
- //update inventory
- if (!mInventoryQ.empty())
- {
- LLMutexLock lock(mMeshMutex);
- while (!mInventoryQ.empty())
- {
- inventory_data& data = mInventoryQ.front();
-
- LLAssetType::EType asset_type = LLAssetType::lookup(data.mPostData["asset_type"].asString());
- LLInventoryType::EType inventory_type = LLInventoryType::lookup(data.mPostData["inventory_type"].asString());
-
- on_new_single_inventory_upload_complete(
- asset_type,
- inventory_type,
- data.mPostData["asset_type"].asString(),
- data.mPostData["folder_id"].asUUID(),
- data.mPostData["name"],
- data.mPostData["description"],
- data.mResponse,
- 0);
-
- mInventoryQ.pop();
- }
- }
-
- //call completed callbacks on finished decompositions
- mDecompThread->notifyCompleted();
-
- if (!mThread->mWaiting)
- { //curl thread is churning, wait for it to go idle
- return;
- }
-
- static std::string region_name("never name a region this");
-
- if (gAgent.getRegion())
- { //update capability url
- if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
- {
- region_name = gAgent.getRegion()->getName();
-
- mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh");
- }
- }
-
- LLFastTimer t(FTM_MESH_UPDATE);
-
- {
- LLFastTimer t(FTM_MESH_LOCK1);
- mMeshMutex->lock();
- }
-
- {
- LLFastTimer t(FTM_MESH_LOCK2);
- mThread->mMutex->lock();
- }
-
- //popup queued error messages from background threads
- while (!mUploadErrorQ.empty())
- {
- LLNotificationsUtil::add("MeshUploadError", mUploadErrorQ.front());
- mUploadErrorQ.pop();
- }
-
- S32 push_count = LLMeshRepoThread::sMaxConcurrentRequests-(LLMeshRepoThread::sActiveHeaderRequests+LLMeshRepoThread::sActiveLODRequests);
-
- if (push_count > 0)
- {
- //calculate "score" for pending requests
-
- //create score map
- std::map<LLUUID, F32> score_map;
-
- for (U32 i = 0; i < 4; ++i)
- {
- for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
- {
- F32 max_score = 0.f;
- for (std::set<LLUUID>::iterator obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
- {
- LLViewerObject* object = gObjectList.findObject(*obj_iter);
-
- if (object)
- {
- LLDrawable* drawable = object->mDrawable;
- if (drawable)
- {
- F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
- max_score = llmax(max_score, cur_score);
- }
- }
- }
-
- score_map[iter->first.getSculptID()] = max_score;
- }
- }
-
- //set "score" for pending requests
- for (std::vector<LLMeshRepoThread::LODRequest>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter)
- {
- iter->mScore = score_map[iter->mMeshParams.getSculptID()];
- }
-
- //sort by "score"
- std::sort(mPendingRequests.begin(), mPendingRequests.end(), LLMeshRepoThread::CompareScoreGreater());
-
- while (!mPendingRequests.empty() && push_count > 0)
- {
- LLFastTimer t(FTM_LOAD_MESH_LOD);
- LLMeshRepoThread::LODRequest& request = mPendingRequests.front();
- mThread->loadMeshLOD(request.mMeshParams, request.mLOD);
- mPendingRequests.erase(mPendingRequests.begin());
- push_count--;
- }
- }
-
- //send skin info requests
- while (!mPendingSkinRequests.empty())
- {
- mThread->loadMeshSkinInfo(mPendingSkinRequests.front());
- mPendingSkinRequests.pop();
- }
-
- //send decomposition requests
- while (!mPendingDecompositionRequests.empty())
- {
- mThread->loadMeshDecomposition(mPendingDecompositionRequests.front());
- mPendingDecompositionRequests.pop();
- }
-
- //send physics shapes decomposition requests
- while (!mPendingPhysicsShapeRequests.empty())
- {
- mThread->loadMeshPhysicsShape(mPendingPhysicsShapeRequests.front());
- mPendingPhysicsShapeRequests.pop();
- }
-
- mThread->notifyLoadedMeshes();
-
- mThread->mMutex->unlock();
- mMeshMutex->unlock();
-
- mThread->mSignal->signal();
-}
-
-void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
-{
- mSkinMap[info.mMeshID] = info;
- mLoadingSkins.erase(info.mMeshID);
-}
-
-void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp)
-{
- decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID);
- if (iter == mDecompositionMap.end())
- { //just insert decomp into map
- mDecompositionMap[decomp->mMeshID] = decomp;
- }
- else
- { //merge decomp with existing entry
- iter->second->merge(decomp);
- delete decomp;
- }
-
- mLoadingDecompositions.erase(decomp->mMeshID);
-}
-
-void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume)
-{ //called from main thread
- S32 detail = LLVolumeLODGroup::getVolumeDetailFromScale(volume->getDetail());
-
- //get list of objects waiting to be notified this mesh is loaded
- mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh_params);
-
- if (volume && obj_iter != mLoadingMeshes[detail].end())
- {
- //make sure target volume is still valid
- if (volume->getNumVolumeFaces() <= 0)
- {
- llwarns << "Mesh loading returned empty volume." << llendl;
- volume->makeTetrahedron();
- }
-
- { //update system volume
- LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail);
- if (sys_volume)
- {
- sys_volume->copyVolumeFaces(volume);
- LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
- }
- else
- {
- llwarns << "Couldn't find system volume for given mesh." << llendl;
- }
- }
-
- //notify waiting LLVOVolume instances that their requested mesh is available
- for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
- {
- LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
- if (vobj)
- {
- vobj->notifyMeshLoaded();
- }
- }
-
- mLoadingMeshes[detail].erase(mesh_params);
- }
-}
-
-void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod)
-{ //called from main thread
- //get list of objects waiting to be notified this mesh is loaded
- mesh_load_map::iterator obj_iter = mLoadingMeshes[lod].find(mesh_params);
-
- F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod);
-
- if (obj_iter != mLoadingMeshes[lod].end())
- {
- for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
- {
- LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
- if (vobj)
- {
- LLVolume* obj_volume = vobj->getVolume();
-
- if (obj_volume &&
- obj_volume->getDetail() == detail &&
- obj_volume->getParams() == mesh_params)
- { //should force volume to find most appropriate LOD
- vobj->setVolume(obj_volume->getParams(), lod);
- }
- }
- }
-
- mLoadingMeshes[lod].erase(mesh_params);
- }
-}
-
-S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{
- return mThread->getActualMeshLOD(mesh_params, lod);
-}
-
-U32 LLMeshRepository::calcResourceCost(LLSD& header)
-{
- U32 bytes = 0;
-
- for (U32 i = 0; i < 4; i++)
- {
- bytes += header[header_lod[i]]["size"].asInteger();
- }
-
- bytes += header["skin"]["size"].asInteger();
-
- return bytes/4096 + 1;
-}
-
-U32 LLMeshRepository::getResourceCost(const LLUUID& mesh_id)
-{
- return mThread->getResourceCost(mesh_id);
-}
-
-const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id)
-{
- if (mesh_id.notNull())
- {
- skin_map::iterator iter = mSkinMap.find(mesh_id);
- if (iter != mSkinMap.end())
- {
- return &(iter->second);
- }
-
- //no skin info known about given mesh, try to fetch it
- {
- LLMutexLock lock(mMeshMutex);
- //add volume to list of loading meshes
- std::set<LLUUID>::iterator iter = mLoadingSkins.find(mesh_id);
- if (iter == mLoadingSkins.end())
- { //no request pending for this skin info
- mLoadingSkins.insert(mesh_id);
- mPendingSkinRequests.push(mesh_id);
- }
- }
- }
-
- return NULL;
-}
-
-void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
-{
- if (mesh_id.notNull())
- {
- LLModel::Decomposition* decomp = NULL;
- decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
- if (iter != mDecompositionMap.end())
- {
- decomp = iter->second;
- }
-
- //decomposition block hasn't been fetched yet
- if (!decomp || decomp->mPhysicsShapeMesh.empty())
- {
- LLMutexLock lock(mMeshMutex);
- //add volume to list of loading meshes
- std::set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id);
- if (iter == mLoadingPhysicsShapes.end())
- { //no request pending for this skin info
- mLoadingPhysicsShapes.insert(mesh_id);
- mPendingPhysicsShapeRequests.push(mesh_id);
- }
- }
- }
-
-}
-
-LLModel::Decomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh_id)
-{
- LLModel::Decomposition* ret = NULL;
-
- if (mesh_id.notNull())
- {
- decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
- if (iter != mDecompositionMap.end())
- {
- ret = iter->second;
- }
-
- //decomposition block hasn't been fetched yet
- if (!ret || ret->mBaseHullMesh.empty())
- {
- LLMutexLock lock(mMeshMutex);
- //add volume to list of loading meshes
- std::set<LLUUID>::iterator iter = mLoadingDecompositions.find(mesh_id);
- if (iter == mLoadingDecompositions.end())
- { //no request pending for this skin info
- mLoadingDecompositions.insert(mesh_id);
- mPendingDecompositionRequests.push(mesh_id);
- }
- }
- }
-
- return ret;
-}
-
-void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail)
-{
- LLVolume* volume = LLPrimitive::sVolumeManager->refVolume(params, detail);
-
- if (!volume->mHullPoints)
- {
- //all default params
- //execute first stage
- //set simplify mode to retain
- //set retain percentage to zero
- //run second stage
- }
-
- LLPrimitive::sVolumeManager->unrefVolume(volume);
-}
-
-bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)
-{
- LLSD mesh = mThread->getMeshHeader(mesh_id);
- return mesh.has("physics_shape") && mesh["physics_shape"].has("size") && (mesh["physics_shape"]["size"].asInteger() > 0);
-}
-
-LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
-{
- return mThread->getMeshHeader(mesh_id);
-}
-
-LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
-{
- static LLSD dummy_ret;
- if (mesh_id.notNull())
- {
- LLMutexLock lock(mHeaderMutex);
- mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
- if (iter != mMeshHeader.end())
- {
- return iter->second;
- }
- }
-
- return dummy_ret;
-}
-
-
-void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints)
-{
- LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints);
- mUploadWaitList.push_back(thread);
-}
-
-S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
-{
- if (mThread)
- {
- LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
- if (iter != mThread->mMeshHeader.end())
- {
- LLSD& header = iter->second;
-
- if (header.has("404"))
- {
- return -1;
- }
-
- S32 size = header[header_lod[lod]]["size"].asInteger();
- return size;
- }
-
- }
-
- return -1;
-
-}
-
-void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- //write model file to memory buffer
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- LLSD header = LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints,
- true);
-
- std::string desc = data.mBaseModel->mLabel;
-
- // Grab the total vertex count of the model
- // along with other information for the "asset_resources" map
- // to send to the server.
- LLSD asset_resources = LLSD::emptyMap();
-
-
- std::string url = mNewInventoryCapability;
-
- if (!url.empty())
- {
- LLSD body = generate_new_resource_upload_capability_body(
- LLAssetType::AT_MESH,
- desc,
- desc,
- LLFolderType::FT_MESH,
- LLInventoryType::IT_MESH,
- LLFloaterPerms::getNextOwnerPerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getEveryonePerms());
-
- body["asset_resources"] = asset_resources;
-
- mPendingConfirmations++;
- LLCurlRequest::headers_t headers;
-
- data.mPostData = body;
-
- mCurlRequest->post(url, headers, body, new LLMeshCostResponder(data, this));
- }
-}
-
-void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (data.mTexture && data.mTexture->getDiscardLevel() >= 0)
- {
- LLSD asset_resources = LLSD::emptyMap();
-
- std::string url = mNewInventoryCapability;
-
- if (!url.empty())
- {
- LLSD body = generate_new_resource_upload_capability_body(
- LLAssetType::AT_TEXTURE,
- data.mLabel,
- data.mLabel,
- LLFolderType::FT_TEXTURE,
- LLInventoryType::IT_TEXTURE,
- LLFloaterPerms::getNextOwnerPerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getEveryonePerms());
-
- body["asset_resources"] = asset_resources;
-
- mPendingConfirmations++;
- LLCurlRequest::headers_t headers;
-
- data.mPostData = body;
- mCurlRequest->post(url, headers, body, new LLTextureCostResponder(data, this));
- }
- }
-}
-
-
-void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (!data.mRSVP.empty())
- {
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- decomp.mBaseHull = mHullMap[data.mBaseModel];
-
- LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints);
-
- data.mAssetData = ostr.str();
-
- LLCurlRequest::headers_t headers;
- mPendingUploads++;
-
- mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLMeshUploadResponder(data, this));
- }
-}
-
-void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (!data.mRSVP.empty())
- {
- std::stringstream ostr;
-
- if (!data.mTexture->isRawImageValid())
- {
- data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
- }
-
- LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
-
- ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
-
- data.mAssetData = ostr.str();
-
- LLCurlRequest::headers_t headers;
- mPendingUploads++;
-
- mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLTextureUploadResponder(data, this));
- }
-}
-
-
-void LLMeshUploadThread::onModelUploaded(LLMeshUploadData& data)
-{
- createObjects(data);
-}
-
-void LLMeshUploadThread::onTextureUploaded(LLTextureUploadData& data)
-{
- mTextureMap[data.mTexture] = data;
-}
-
-
-void LLMeshUploadThread::createObjects(LLMeshUploadData& data)
-{
- instance_list& instances = mInstance[data.mBaseModel];
-
- for (instance_list::iterator iter = instances.begin(); iter != instances.end(); ++iter)
- { //create prims that reference given mesh
- LLModelInstance& instance = *iter;
- instance.mMeshID = data.mUUID;
- mInstanceQ.push(instance);
- }
-}
-
-void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
- LLVector3& result_pos,
- LLQuaternion& result_rot,
- LLVector3& result_scale)
-{
- // check for reflection
- BOOL reflected = (transformation.determinant() < 0);
-
- // compute position
- LLVector3 position = LLVector3(0, 0, 0) * transformation;
-
- // compute scale
- LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
- LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
- LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
- F32 x_length = x_transformed.normalize();
- F32 y_length = y_transformed.normalize();
- F32 z_length = z_transformed.normalize();
- LLVector3 scale = LLVector3(x_length, y_length, z_length);
-
- // adjust for "reflected" geometry
- LLVector3 x_transformed_reflected = x_transformed;
- if (reflected)
- {
- x_transformed_reflected *= -1.0;
- }
-
- // compute rotation
- LLMatrix3 rotation_matrix;
- rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
- LLQuaternion quat_rotation = rotation_matrix.quaternion();
- quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
- LLVector3 euler_rotation;
- quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
-
- result_pos = position + mOrigin;
- result_scale = scale;
- result_rot = quat_rotation;
-}
-
-
-LLSD LLMeshUploadThread::createObject(LLModelInstance& instance)
-{
- LLMatrix4 transformation = instance.mTransform;
-
- if (instance.mMeshID.isNull())
- {
- llerrs << "WTF?" << llendl;
- }
-
- // check for reflection
- BOOL reflected = (transformation.determinant() < 0);
-
- // compute position
- LLVector3 position = LLVector3(0, 0, 0) * transformation;
-
- // compute scale
- LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
- LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
- LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
- F32 x_length = x_transformed.normalize();
- F32 y_length = y_transformed.normalize();
- F32 z_length = z_transformed.normalize();
- LLVector3 scale = LLVector3(x_length, y_length, z_length);
-
- // adjust for "reflected" geometry
- LLVector3 x_transformed_reflected = x_transformed;
- if (reflected)
- {
- x_transformed_reflected *= -1.0;
- }
-
- // compute rotation
- LLMatrix3 rotation_matrix;
- rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
- LLQuaternion quat_rotation = rotation_matrix.quaternion();
- quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
- LLVector3 euler_rotation;
- quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
-
- //
- // build parameter block to construct this prim
- //
-
- LLSD object_params;
-
- // create prim
-
- // set volume params
- U8 sculpt_type = LL_SCULPT_TYPE_MESH;
- if (reflected)
- {
- sculpt_type |= LL_SCULPT_FLAG_MIRROR;
- }
- LLVolumeParams volume_params;
- volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
- volume_params.setBeginAndEndS( 0.f, 1.f );
- volume_params.setBeginAndEndT( 0.f, 1.f );
- volume_params.setRatio ( 1, 1 );
- volume_params.setShear ( 0, 0 );
- volume_params.setSculptID(instance.mMeshID, sculpt_type);
- object_params["shape"] = volume_params.asLLSD();
-
- object_params["material"] = LL_MCODE_WOOD;
-
- object_params["group-id"] = gAgent.getGroupID();
- object_params["pos"] = ll_sd_from_vector3(position + mOrigin);
- object_params["rotation"] = ll_sd_from_quaternion(quat_rotation);
- object_params["scale"] = ll_sd_from_vector3(scale);
- object_params["name"] = instance.mLabel;
-
- // load material from dae file
- object_params["facelist"] = LLSD::emptyArray();
- for (S32 i = 0; i < instance.mMaterial.size(); i++)
- {
- LLTextureEntry te;
- LLImportMaterial& mat = instance.mMaterial[i];
-
- te.setColor(mat.mDiffuseColor);
-
- LLUUID diffuse_id = mTextureMap[mat.mDiffuseMap].mUUID;
-
- if (diffuse_id.notNull())
- {
- te.setID(diffuse_id);
- }
- else
- {
- te.setID(LLUUID("5748decc-f629-461c-9a36-a35a221fe21f")); // blank texture
- }
-
- te.setFullbright(mat.mFullbright);
-
- object_params["facelist"][i] = te.asLLSD();
- }
-
- // set extra parameters
- LLSculptParams sculpt_params;
- sculpt_params.setSculptTexture(instance.mMeshID);
- sculpt_params.setSculptType(sculpt_type);
- U8 buffer[MAX_OBJECT_PARAMS_SIZE+1];
- LLDataPackerBinaryBuffer dp(buffer, MAX_OBJECT_PARAMS_SIZE);
- sculpt_params.pack(dp);
- std::vector<U8> v(dp.getCurrentSize());
- memcpy(&v[0], buffer, dp.getCurrentSize());
- LLSD extra_parameter;
- extra_parameter["extra_parameter"] = sculpt_params.mType;
- extra_parameter["param_data"] = v;
- object_params["extra_parameters"].append(extra_parameter);
-
- LLPermissions perm;
- perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
- perm.setCreator(gAgent.getID());
-
- perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
- PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
- LLFloaterPerms::getEveryonePerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getNextOwnerPerms());
-
- object_params["permissions"] = ll_create_sd_from_permissions(perm);
-
- object_params["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
-
- return object_params;
-}
-
-void LLMeshUploadThread::priceResult(LLMeshUploadData& data, const LLSD& content)
-{
- mPendingCost += content["upload_price"].asInteger();
- data.mRSVP = content["rsvp"].asString();
-
- mConfirmedQ.push(data);
-}
-
-void LLMeshUploadThread::priceResult(LLTextureUploadData& data, const LLSD& content)
-{
- mPendingCost += content["upload_price"].asInteger();
- data.mRSVP = content["rsvp"].asString();
-
- mConfirmedTextureQ.push(data);
-}
-
-
-bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
-{
- if (mDiffuseMap != rhs.mDiffuseMap)
- {
- return mDiffuseMap < rhs.mDiffuseMap;
- }
-
- if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
- {
- return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
- }
-
- if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
- {
- return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
- }
-
- if (mDiffuseColor != rhs.mDiffuseColor)
- {
- return mDiffuseColor < rhs.mDiffuseColor;
- }
-
- return mFullbright < rhs.mFullbright;
-}
-
-
-void LLMeshRepository::updateInventory(inventory_data data)
-{
- LLMutexLock lock(mMeshMutex);
- dumpLLSDToFile(data.mPostData,"update_inventory_post_data.xml");
- dumpLLSDToFile(data.mResponse,"update_inventory_response.xml");
- mInventoryQ.push(data);
-}
-
-void LLMeshRepository::uploadError(LLSD& args)
-{
- LLMutexLock lock(mMeshMutex);
- mUploadErrorQ.push(args);
-}
-
-//static
-F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod)
-{
- F32 dlowest = llmin(radius/0.03f, 256.f);
- F32 dlow = llmin(radius/0.06f, 256.f);
- F32 dmid = llmin(radius/0.24f, 256.f);
-
- F32 bytes_lowest = header["lowest_lod"]["size"].asReal()/1024.f;
- F32 bytes_low = header["low_lod"]["size"].asReal()/1024.f;
- F32 bytes_mid = header["medium_lod"]["size"].asReal()/1024.f;
- F32 bytes_high = header["high_lod"]["size"].asReal()/1024.f;
-
- if (bytes)
- {
- *bytes = 0;
- *bytes += header["lowest_lod"]["size"].asInteger();
- *bytes += header["low_lod"]["size"].asInteger();
- *bytes += header["medium_lod"]["size"].asInteger();
- *bytes += header["high_lod"]["size"].asInteger();
- }
-
-
- if (bytes_visible)
- {
- lod = LLMeshRepository::getActualMeshLOD(header, lod);
- if (lod >= 0 && lod <= 3)
- {
- *bytes_visible = header[header_lod[lod]]["size"].asInteger();
- }
- }
-
- if (bytes_high == 0.f)
- {
- return 0.f;
- }
-
- if (bytes_mid == 0.f)
- {
- bytes_mid = bytes_high;
- }
-
- if (bytes_low == 0.f)
- {
- bytes_low = bytes_mid;
- }
-
- if (bytes_lowest == 0.f)
- {
- bytes_lowest = bytes_low;
- }
-
- F32 max_area = 65536.f;
- F32 min_area = 1.f;
-
- F32 high_area = llmin(F_PI*dmid*dmid, max_area);
- F32 mid_area = llmin(F_PI*dlow*dlow, max_area);
- F32 low_area = llmin(F_PI*dlowest*dlowest, max_area);
- F32 lowest_area = max_area;
-
- lowest_area -= low_area;
- low_area -= mid_area;
- mid_area -= high_area;
-
- high_area = llclamp(high_area, min_area, max_area);
- mid_area = llclamp(mid_area, min_area, max_area);
- low_area = llclamp(low_area, min_area, max_area);
- lowest_area = llclamp(lowest_area, min_area, max_area);
-
- F32 total_area = high_area + mid_area + low_area + lowest_area;
- high_area /= total_area;
- mid_area /= total_area;
- low_area /= total_area;
- lowest_area /= total_area;
-
- F32 weighted_avg = bytes_high*high_area +
- bytes_mid*mid_area +
- bytes_low*low_area +
- bytes_lowest*lowest_area;
-
- return weighted_avg * gSavedSettings.getF32("MeshStreamingCostScaler");
-}
-
-
-LLPhysicsDecomp::LLPhysicsDecomp()
-: LLThread("Physics Decomp")
-{
- mInited = false;
- mQuitting = false;
- mDone = false;
-
- mSignal = new LLCondition(NULL);
- mMutex = new LLMutex(NULL);
-}
-
-LLPhysicsDecomp::~LLPhysicsDecomp()
-{
- shutdown();
-
- delete mSignal;
- mSignal = NULL;
- delete mMutex;
- mMutex = NULL;
-}
-
-void LLPhysicsDecomp::shutdown()
-{
- if (mSignal)
- {
- mQuitting = true;
- mSignal->signal();
-
- while (!isStopped())
- {
- apr_sleep(10);
- }
- }
-}
-
-void LLPhysicsDecomp::submitRequest(LLPhysicsDecomp::Request* request)
-{
- LLMutexLock lock(mMutex);
- mRequestQ.push(request);
- mSignal->signal();
-}
-
-//static
-S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2)
-{
- if (gMeshRepo.mDecompThread && gMeshRepo.mDecompThread->mCurRequest.notNull())
- {
- return gMeshRepo.mDecompThread->mCurRequest->statusCallback(status, p1, p2);
- }
-
- return 1;
-}
-
-void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh)
-{
- mesh.mVertexBase = mCurRequest->mPositions[0].mV;
- mesh.mVertexStrideBytes = 12;
- mesh.mNumVertices = mCurRequest->mPositions.size();
-
- mesh.mIndexType = LLCDMeshData::INT_16;
- mesh.mIndexBase = &(mCurRequest->mIndices[0]);
- mesh.mIndexStrideBytes = 6;
-
- mesh.mNumTriangles = mCurRequest->mIndices.size()/3;
-
- LLCDResult ret = LLCD_OK;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh);
- }
-
- if (ret)
- {
- llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl;
- }
-}
-
-void LLPhysicsDecomp::doDecomposition()
-{
- LLCDMeshData mesh;
- S32 stage = mStageID[mCurRequest->mStage];
-
- //load data intoLLCD
- if (stage == 0)
- {
- setMeshData(mesh);
- }
-
- //build parameter map
- std::map<std::string, const LLCDParam*> param_map;
-
- static const LLCDParam* params = NULL;
- static S32 param_count = 0;
- if (!params)
- {
- param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
- }
-
- for (S32 i = 0; i < param_count; ++i)
- {
- param_map[params[i].mName] = params+i;
- }
-
- //set parameter values
- for (decomp_params::iterator iter = mCurRequest->mParams.begin(); iter != mCurRequest->mParams.end(); ++iter)
- {
- const std::string& name = iter->first;
- const LLSD& value = iter->second;
-
- const LLCDParam* param = param_map[name];
-
- if (param == NULL)
- { //couldn't find valid parameter
- continue;
- }
-
- U32 ret = LLCD_OK;
-
- if (param->mType == LLCDParam::LLCD_FLOAT)
- {
- ret = LLConvexDecomposition::getInstance()->setParam(param->mName, (F32) value.asReal());
- }
- else if (param->mType == LLCDParam::LLCD_INTEGER ||
- param->mType == LLCDParam::LLCD_ENUM)
- {
- ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asInteger());
- }
- else if (param->mType == LLCDParam::LLCD_BOOLEAN)
- {
- ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asBoolean());
- }
-
- if (ret)
- {
- llerrs << "WTF?" << llendl;
- }
- }
-
- mCurRequest->setStatusMessage("Executing.");
-
- LLCDResult ret = LLCD_OK;
-
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- ret = LLConvexDecomposition::getInstance()->executeStage(stage);
- }
-
- if (ret)
- {
- llwarns << "Convex Decomposition thread valid but could not execute stage " << stage << llendl;
- LLMutexLock lock(mMutex);
-
- mCurRequest->mHull.clear();
- mCurRequest->mHullMesh.clear();
-
- mCurRequest->setStatusMessage("FAIL");
-
- completeCurrent();
- }
- else
- {
- mCurRequest->setStatusMessage("Reading results");
-
- S32 num_hulls =0;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(stage);
- }
-
- mMutex->lock();
- mCurRequest->mHull.clear();
- mCurRequest->mHull.resize(num_hulls);
-
- mCurRequest->mHullMesh.clear();
- mCurRequest->mHullMesh.resize(num_hulls);
- mMutex->unlock();
-
- for (S32 i = 0; i < num_hulls; ++i)
- {
- std::vector<LLVector3> p;
- LLCDHull hull;
- // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
- LLConvexDecomposition::getInstance()->getHullFromStage(stage, i, &hull);
-
- const F32* v = hull.mVertexBase;
-
- for (S32 j = 0; j < hull.mNumVertices; ++j)
- {
- LLVector3 vert(v[0], v[1], v[2]);
- p.push_back(vert);
- v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
- }
-
- LLCDMeshData mesh;
- // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
- LLConvexDecomposition::getInstance()->getMeshFromStage(stage, i, &mesh);
-
- get_vertex_buffer_from_mesh(mesh, mCurRequest->mHullMesh[i]);
-
- mMutex->lock();
- mCurRequest->mHull[i] = p;
- mMutex->unlock();
- }
-
- {
- LLMutexLock lock(mMutex);
-
- mCurRequest->setStatusMessage("FAIL");
- completeCurrent();
- }
- }
-}
-
-void LLPhysicsDecomp::completeCurrent()
-{
- LLMutexLock lock(mMutex);
- mCompletedQ.push(mCurRequest);
- mCurRequest = NULL;
-}
-
-void LLPhysicsDecomp::notifyCompleted()
-{
- if (!mCompletedQ.empty())
- {
- LLMutexLock lock(mMutex);
- while (!mCompletedQ.empty())
- {
- Request* req = mCompletedQ.front();
- req->completed();
- mCompletedQ.pop();
- }
- }
-}
-
-
-void make_box(LLPhysicsDecomp::Request * request)
-{
- LLVector3 min,max;
- min = request->mPositions[0];
- max = min;
-
- for (U32 i = 0; i < request->mPositions.size(); ++i)
- {
- update_min_max(min, max, request->mPositions[i]);
- }
-
- request->mHull.clear();
-
- LLModel::hull box;
- box.push_back(LLVector3(min[0],min[1],min[2]));
- box.push_back(LLVector3(max[0],min[1],min[2]));
- box.push_back(LLVector3(min[0],max[1],min[2]));
- box.push_back(LLVector3(max[0],max[1],min[2]));
- box.push_back(LLVector3(min[0],min[1],max[2]));
- box.push_back(LLVector3(max[0],min[1],max[2]));
- box.push_back(LLVector3(min[0],max[1],max[2]));
- box.push_back(LLVector3(max[0],max[1],max[2]));
-
- request->mHull.push_back(box);
-}
-
-
-void LLPhysicsDecomp::doDecompositionSingleHull()
-{
- LLCDMeshData mesh;
-
- setMeshData(mesh);
-
-
- //set all parameters to default
- std::map<std::string, const LLCDParam*> param_map;
-
- static const LLCDParam* params = NULL;
- static S32 param_count = 0;
-
- if (!params)
- {
- param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
- }
-
- LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
-
- for (S32 i = 0; i < param_count; ++i)
- {
- decomp->setParam(params[i].mName, params[i].mDefault.mIntOrEnumValue);
- }
-
- const S32 STAGE_DECOMPOSE = mStageID["Decompose"];
- const S32 STAGE_SIMPLIFY = mStageID["Simplify"];
- const S32 DECOMP_PREVIEW = 0;
- const S32 SIMPLIFY_RETAIN = 0;
-
- decomp->setParam("Decompose Quality", DECOMP_PREVIEW);
- decomp->setParam("Simplify Method", SIMPLIFY_RETAIN);
- decomp->setParam("Retain%", 0.f);
-
- LLCDResult ret = LLCD_OK;
- ret = decomp->executeStage(STAGE_DECOMPOSE);
-
- if (ret)
- {
- llwarns << "Could not execute decomposition stage when attempting to create single hull." << llendl;
- make_box(mCurRequest);
- }
- else
- {
- ret = decomp->executeStage(STAGE_SIMPLIFY);
-
- if (ret)
- {
- llwarns << "Could not execute simiplification stage when attempting to create single hull." << llendl;
- make_box(mCurRequest);
- }
- else
- {
- S32 num_hulls =0;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(STAGE_SIMPLIFY);
- }
-
- mMutex->lock();
- mCurRequest->mHull.clear();
- mCurRequest->mHull.resize(num_hulls);
- mCurRequest->mHullMesh.clear();
- mMutex->unlock();
-
- for (S32 i = 0; i < num_hulls; ++i)
- {
- std::vector<LLVector3> p;
- LLCDHull hull;
- // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
- LLConvexDecomposition::getInstance()->getHullFromStage(STAGE_SIMPLIFY, i, &hull);
-
- const F32* v = hull.mVertexBase;
-
- for (S32 j = 0; j < hull.mNumVertices; ++j)
- {
- LLVector3 vert(v[0], v[1], v[2]);
- p.push_back(vert);
- v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
- }
-
- mMutex->lock();
- mCurRequest->mHull[i] = p;
- mMutex->unlock();
- }
- }
- }
-
-
- {
- completeCurrent();
-
- }
-}
-
-
-void LLPhysicsDecomp::run()
-{
- LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
- decomp->initThread();
- mInited = true;
-
- static const LLCDStageData* stages = NULL;
- static S32 num_stages = 0;
-
- if (!stages)
- {
- num_stages = decomp->getStages(&stages);
- }
-
- for (S32 i = 0; i < num_stages; i++)
- {
- mStageID[stages[i].mName] = i;
- }
-
- while (!mQuitting)
- {
- mSignal->wait();
- while (!mQuitting && !mRequestQ.empty())
- {
- {
- LLMutexLock lock(mMutex);
- mCurRequest = mRequestQ.front();
- mRequestQ.pop();
- }
-
- S32& id = *(mCurRequest->mDecompID);
- if (id == -1)
- {
- decomp->genDecomposition(id);
- }
- decomp->bindDecomposition(id);
-
- if (mCurRequest->mStage == "single_hull")
- {
- doDecompositionSingleHull();
- }
- else
- {
- doDecomposition();
- }
- }
- }
-
- decomp->quitThread();
-
- if (mSignal->isLocked())
- { //let go of mSignal's associated mutex
- mSignal->unlock();
- }
-
- mDone = true;
-}
-
-void LLPhysicsDecomp::Request::updateTriangleAreaThreshold()
-{
- F32 range = mBBox[1].mV[0] - mBBox[0].mV[0] ;
- range = llmin(range, mBBox[1].mV[1] - mBBox[0].mV[1]) ;
- range = llmin(range, mBBox[1].mV[2] - mBBox[0].mV[2]) ;
-
- mTriangleAreaThreshold = llmin(0.0002f, range * 0.000002f) ;
-}
-
-//check if the triangle area is large enough to qualify for a valid triangle
-bool LLPhysicsDecomp::Request::isValidTriangle(U16 idx1, U16 idx2, U16 idx3)
-{
- LLVector3 a = mPositions[idx2] - mPositions[idx1] ;
- LLVector3 b = mPositions[idx3] - mPositions[idx1] ;
- F32 c = a * b ;
-
- return ((a*a) * (b*b) - c * c) > mTriangleAreaThreshold ;
-}
-
-void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
-{
- mStatusMessage = msg;
-}
-
-LLModelInstance::LLModelInstance(LLSD& data)
-{
- mLocalMeshID = data["mesh_id"].asInteger();
- mLabel = data["label"].asString();
- mTransform.setValue(data["transform"]);
-
- for (U32 i = 0; i < data["material"].size(); ++i)
- {
- mMaterial.push_back(LLImportMaterial(data["material"][i]));
- }
-}
-
-
-LLSD LLModelInstance::asLLSD()
-{
- LLSD ret;
-
- ret["mesh_id"] = mModel->mLocalID;
- ret["label"] = mLabel;
- ret["transform"] = mTransform.getValue();
-
- for (U32 i = 0; i < mMaterial.size(); ++i)
- {
- ret["material"][i] = mMaterial[i].asLLSD();
- }
-
- return ret;
-}
-
-LLImportMaterial::LLImportMaterial(LLSD& data)
-{
- mDiffuseMapFilename = data["diffuse"]["filename"].asString();
- mDiffuseMapLabel = data["diffuse"]["label"].asString();
- mDiffuseColor.setValue(data["diffuse"]["color"]);
- mFullbright = data["fullbright"].asBoolean();
-}
-
-
-LLSD LLImportMaterial::asLLSD()
-{
- LLSD ret;
-
- ret["diffuse"]["filename"] = mDiffuseMapFilename;
- ret["diffuse"]["label"] = mDiffuseMapLabel;
- ret["diffuse"]["color"] = mDiffuseColor.getValue();
- ret["fullbright"] = mFullbright;
-
- return ret;
-}
-
-void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
-{
- decomp.mMesh.resize(decomp.mHull.size());
-
- for (U32 i = 0; i < decomp.mHull.size(); ++i)
- {
- LLCDHull hull;
- hull.mNumVertices = decomp.mHull[i].size();
- hull.mVertexBase = decomp.mHull[i][0].mV;
- hull.mVertexStrideBytes = 12;
-
- LLCDMeshData mesh;
- LLCDResult res = LLCD_OK;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
- }
- if (res == LLCD_OK)
- {
- get_vertex_buffer_from_mesh(mesh, decomp.mMesh[i]);
- }
- }
-
- if (!decomp.mBaseHull.empty() && decomp.mBaseHullMesh.empty())
- { //get mesh for base hull
- LLCDHull hull;
- hull.mNumVertices = decomp.mBaseHull.size();
- hull.mVertexBase = decomp.mBaseHull[0].mV;
- hull.mVertexStrideBytes = 12;
-
- LLCDMeshData mesh;
- LLCDResult res = LLCD_OK;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
- }
- if (res == LLCD_OK)
- {
- get_vertex_buffer_from_mesh(mesh, decomp.mBaseHullMesh);
- }
- }
-}
+/**
+ * @file llmeshrepository.cpp
+ * @brief Mesh repository implementation.
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+#include "llhttpstatuscodes.h"
+#include "llmeshrepository.h"
+
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llbufferstream.h"
+#include "llcurl.h"
+#include "lldatapacker.h"
+#include "llfasttimer.h"
+#include "llfloatermodelpreview.h"
+#include "llfloaterperms.h"
+#include "lleconomy.h"
+#include "llimagej2c.h"
+#include "llhost.h"
+#include "llnotificationsutil.h"
+#include "llsd.h"
+#include "llsdutil_math.h"
+#include "llsdserialize.h"
+#include "llthread.h"
+#include "llvfile.h"
+#include "llviewercontrol.h"
+#include "llviewermenufile.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewertexturelist.h"
+#include "llvolume.h"
+#include "llvolumemgr.h"
+#include "llvovolume.h"
+#include "llworld.h"
+#include "material_codes.h"
+#include "pipeline.h"
+#include "llinventorymodel.h"
+#include "llfoldertype.h"
+
+#ifndef LL_WINDOWS
+#include "netdb.h"
+#endif
+
+#include <queue>
+
+LLFastTimer::DeclareTimer FTM_MESH_UPDATE("Mesh Update");
+LLFastTimer::DeclareTimer FTM_LOAD_MESH("Load Mesh");
+
+LLMeshRepository gMeshRepo;
+
+const U32 MAX_MESH_REQUESTS_PER_SECOND = 100;
+
+U32 LLMeshRepository::sBytesReceived = 0;
+U32 LLMeshRepository::sHTTPRequestCount = 0;
+U32 LLMeshRepository::sHTTPRetryCount = 0;
+U32 LLMeshRepository::sCacheBytesRead = 0;
+U32 LLMeshRepository::sCacheBytesWritten = 0;
+U32 LLMeshRepository::sPeakKbps = 0;
+
+
+const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
+
+void dumpLLSDToFile(const LLSD& content, std::string filename);
+
+std::string header_lod[] =
+{
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod"
+};
+
+
+//get the number of bytes resident in memory for given volume
+U32 get_volume_memory_size(const LLVolume* volume)
+{
+ U32 indices = 0;
+ U32 vertices = 0;
+
+ for (U32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ indices += face.mNumIndices;
+ vertices += face.mNumVertices;
+ }
+
+
+ return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces();
+}
+
+void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res, F32 scale = 1.f)
+{
+ res.mPositions.clear();
+ res.mNormals.clear();
+
+ const F32* v = mesh.mVertexBase;
+
+ if (mesh.mIndexType == LLCDMeshData::INT_16)
+ {
+ U16* idx = (U16*) mesh.mIndexBase;
+ for (S32 j = 0; j < mesh.mNumTriangles; ++j)
+ {
+ F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
+ F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
+ F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
+
+ idx = (U16*) (((U8*)idx)+mesh.mIndexStrideBytes);
+
+ LLVector3 v0(mp0);
+ LLVector3 v1(mp1);
+ LLVector3 v2(mp2);
+
+ LLVector3 n = (v1-v0)%(v2-v0);
+ n.normalize();
+
+ res.mPositions.push_back(v0*scale);
+ res.mPositions.push_back(v1*scale);
+ res.mPositions.push_back(v2*scale);
+
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ }
+ }
+ else
+ {
+ U32* idx = (U32*) mesh.mIndexBase;
+ for (S32 j = 0; j < mesh.mNumTriangles; ++j)
+ {
+ F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
+ F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
+ F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
+
+ idx = (U32*) (((U8*)idx)+mesh.mIndexStrideBytes);
+
+ LLVector3 v0(mp0);
+ LLVector3 v1(mp1);
+ LLVector3 v2(mp2);
+
+ LLVector3 n = (v1-v0)%(v2-v0);
+ n.normalize();
+
+ res.mPositions.push_back(v0*scale);
+ res.mPositions.push_back(v1*scale);
+ res.mPositions.push_back(v2*scale);
+
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ }
+ }
+}
+
+S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
+S32 LLMeshRepoThread::sActiveLODRequests = 0;
+U32 LLMeshRepoThread::sMaxConcurrentRequests = 1;
+
+
+class LLTextureCostResponder : public LLCurl::Responder
+{
+public:
+ LLTextureUploadData mData;
+ LLMeshUploadThread* mThread;
+
+ LLTextureCostResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
+ : mData(data), mThread(thread)
+ {
+
+ }
+
+ virtual void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ mThread->mPendingConfirmations--;
+ if (isGoodStatus(status))
+ {
+ mThread->priceResult(mData, content);
+ }
+ else
+ {
+ llwarns << status << ": " << reason << llendl;
+
+ if (mData.mRetries < MAX_TEXTURE_UPLOAD_RETRIES)
+ {
+ llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+
+ if (status == 499 || status == 500)
+ {
+ mThread->uploadTexture(mData);
+ }
+ else
+ {
+ llerrs << "Unhandled status " << status << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "Giving up after " << mData.mRetries << " retries." << llendl;
+ }
+ }
+ }
+};
+
+class LLTextureUploadResponder : public LLCurl::Responder
+{
+public:
+ LLTextureUploadData mData;
+ LLMeshUploadThread* mThread;
+
+ LLTextureUploadResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
+ : mData(data), mThread(thread)
+ {
+ }
+
+ virtual void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ mThread->mPendingUploads--;
+ if (isGoodStatus(status))
+ {
+ mData.mUUID = content["new_asset"].asUUID();
+ gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
+ mThread->onTextureUploaded(mData);
+ }
+ else
+ {
+ llwarns << status << ": " << reason << llendl;
+ llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+
+ if (status == 404)
+ {
+ mThread->uploadTexture(mData);
+ }
+ else if (status == 499)
+ {
+ mThread->mConfirmedTextureQ.push(mData);
+ }
+ else
+ {
+ llerrs << "Unhandled status " << status << llendl;
+ }
+ }
+ }
+};
+
+class LLMeshCostResponder : public LLCurl::Responder
+{
+public:
+ LLMeshUploadData mData;
+ LLMeshUploadThread* mThread;
+
+ LLMeshCostResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
+ : mData(data), mThread(thread)
+ {
+
+ }
+
+ virtual void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ mThread->mPendingConfirmations--;
+
+ if (isGoodStatus(status))
+ {
+ mThread->priceResult(mData, content);
+ }
+ else
+ {
+ llwarns << status << ": " << reason << llendl;
+
+ if (status == HTTP_INTERNAL_ERROR)
+ {
+ llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+ mThread->uploadModel(mData);
+ }
+ else if (status == HTTP_BAD_REQUEST)
+ {
+ llwarns << "Status 400 received from server, giving up." << llendl;
+ }
+ else if (status == HTTP_NOT_FOUND)
+ {
+ llwarns <<"Status 404 received, server is disconnected, giving up." << llendl ;
+ }
+ else
+ {
+ llerrs << "Unhandled status " << status << llendl;
+ }
+ }
+ }
+};
+
+class LLMeshUploadResponder : public LLCurl::Responder
+{
+public:
+ LLMeshUploadData mData;
+ LLMeshUploadThread* mThread;
+
+ LLMeshUploadResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
+ : mData(data), mThread(thread)
+ {
+ }
+
+ virtual void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ mThread->mPendingUploads--;
+ if (isGoodStatus(status))
+ {
+ mData.mUUID = content["new_asset"].asUUID();
+ if (mData.mUUID.isNull())
+ {
+ LLSD args;
+ std::string message = content["error"]["message"];
+ std::string identifier = content["error"]["identifier"];
+ std::string invalidity_identifier = content["error"]["invalidity_identifier"];
+
+ args["MESSAGE"] = message;
+ args["IDENTIFIER"] = identifier;
+ args["INVALIDITY_IDENTIFIER"] = invalidity_identifier;
+ args["LABEL"] = mData.mBaseModel->mLabel;
+
+ gMeshRepo.uploadError(args);
+ }
+ else
+ {
+ gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
+ mThread->onModelUploaded(mData);
+ }
+ }
+ else
+ {
+ llwarns << status << ": " << reason << llendl;
+ llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+
+ if (status == 404)
+ {
+ mThread->uploadModel(mData);
+ }
+ else if (status == 499)
+ {
+ mThread->mConfirmedQ.push(mData);
+ }
+ else if (status != 500)
+ { //drop internal server errors on the floor, otherwise grab
+ llerrs << "Unhandled status " << status << llendl;
+ }
+ }
+ }
+};
+
+
+class LLMeshHeaderResponder : public LLCurl::Responder
+{
+public:
+ LLVolumeParams mMeshParams;
+
+ LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
+ : mMeshParams(mesh_params)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshLODResponder : public LLCurl::Responder
+{
+public:
+ LLVolumeParams mMeshParams;
+ S32 mLOD;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
+ : mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshSkinInfoResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshSkinInfoResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshDecompositionResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshDecompositionResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshPhysicsShapeResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshPhysicsShapeResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLModelObjectUploadResponder: public LLCurl::Responder
+{
+ LLSD mObjectAsset;
+ LLMeshUploadThread* mThread;
+
+public:
+ LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset):
+ mThread(thread),
+ mObjectAsset(object_asset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ assert_main_thread();
+
+ llinfos << "completed" << llendl;
+ mThread->mPendingUploads--;
+ mThread->mFinished = true;
+ }
+};
+
+class LLWholeModelFeeResponder: public LLCurl::Responder
+{
+ LLMeshUploadThread* mThread;
+public:
+ LLWholeModelFeeResponder(LLMeshUploadThread* thread):
+ mThread(thread)
+ {
+ }
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ //assert_main_thread();
+ llinfos << "completed" << llendl;
+ mThread->mPendingUploads--;
+ dumpLLSDToFile(content,"whole_model_fee_response.xml");
+ if (isGoodStatus(status))
+ {
+ mThread->mWholeModelUploadURL = content["uploader"].asString();
+ }
+ else
+ {
+ llinfos << "upload failed" << llendl;
+ mThread->mWholeModelUploadURL = "";
+ }
+
+ }
+};
+
+class LLWholeModelUploadResponder: public LLCurl::Responder
+{
+ LLMeshUploadThread* mThread;
+ LLSD mPostData;
+
+public:
+ LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& post_data):
+ mThread(thread),
+ mPostData(post_data)
+ {
+ }
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ //assert_main_thread();
+ llinfos << "upload completed" << llendl;
+ mThread->mPendingUploads--;
+ dumpLLSDToFile(content,"whole_model_upload_response.xml");
+ // requested "mesh" asset type isn't actually the type
+ // of the resultant object, fix it up here.
+ mPostData["asset_type"] = "object";
+ gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mPostData,content));
+ }
+};
+
+LLMeshRepoThread::LLMeshRepoThread()
+: LLThread("mesh repo", NULL)
+{
+ mWaiting = false;
+ mMutex = new LLMutex(NULL);
+ mHeaderMutex = new LLMutex(NULL);
+ mSignal = new LLCondition(NULL);
+}
+
+LLMeshRepoThread::~LLMeshRepoThread()
+{
+ delete mMutex;
+ mMutex = NULL;
+ delete mHeaderMutex;
+ mHeaderMutex = NULL;
+ delete mSignal;
+ mSignal = NULL;
+}
+
+void LLMeshRepoThread::run()
+{
+ mCurlRequest = new LLCurlRequest();
+ LLCDResult res = LLConvexDecomposition::initThread();
+ if (res != LLCD_OK)
+ {
+ llwarns << "convex decomposition unable to be loaded" << llendl;
+ }
+
+ while (!LLApp::isQuitting())
+ {
+ mWaiting = true;
+ mSignal->wait();
+ mWaiting = false;
+
+ if (!LLApp::isQuitting())
+ {
+ static U32 count = 0;
+
+ static F32 last_hundred = gFrameTimeSeconds;
+
+ if (gFrameTimeSeconds - last_hundred > 1.f)
+ { //a second has gone by, clear count
+ last_hundred = gFrameTimeSeconds;
+ count = 0;
+ }
+
+ // NOTE: throttling intentionally favors LOD requests over header requests
+
+ while (!mLODReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveLODRequests < sMaxConcurrentRequests)
+ {
+ {
+ mMutex->lock();
+ LODRequest req = mLODReqQ.front();
+ mLODReqQ.pop();
+ mMutex->unlock();
+ if (fetchMeshLOD(req.mMeshParams, req.mLOD))
+ {
+ count++;
+ }
+ }
+ }
+
+ while (!mHeaderReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveHeaderRequests < sMaxConcurrentRequests)
+ {
+ {
+ mMutex->lock();
+ HeaderRequest req = mHeaderReqQ.front();
+ mHeaderReqQ.pop();
+ mMutex->unlock();
+ if (fetchMeshHeader(req.mMeshParams))
+ {
+ count++;
+ }
+ }
+ }
+
+ { //mSkinRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mSkinRequests.begin(); iter != mSkinRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshSkinInfo(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mSkinRequests = incomplete;
+ }
+
+ { //mDecompositionRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mDecompositionRequests.begin(); iter != mDecompositionRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshDecomposition(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mDecompositionRequests = incomplete;
+ }
+
+ { //mPhysicsShapeRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mPhysicsShapeRequests.begin(); iter != mPhysicsShapeRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshPhysicsShape(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mPhysicsShapeRequests = incomplete;
+ }
+
+ mCurlRequest->process();
+ }
+ }
+
+ if (mSignal->isLocked())
+ { //make sure to let go of the mutex associated with the given signal before shutting down
+ mSignal->unlock();
+ }
+
+ res = LLConvexDecomposition::quitThread();
+ if (res != LLCD_OK)
+ {
+ llwarns << "convex decomposition unable to be quit" << llendl;
+ }
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+}
+
+void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mSkinRequests.insert(mesh_id);
+}
+
+void LLMeshRepoThread::loadMeshDecomposition(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mDecompositionRequests.insert(mesh_id);
+}
+
+void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mPhysicsShapeRequests.insert(mesh_id);
+}
+
+
+void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //protected by mSignal, no locking needed here
+
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
+ if (iter != mMeshHeader.end())
+ { //if we have the header, request LOD byte range
+ LODRequest req(mesh_params, lod);
+ {
+ LLMutexLock lock(mMutex);
+ mLODReqQ.push(req);
+ }
+ }
+ else
+ {
+ HeaderRequest req(mesh_params);
+
+ pending_lod_map::iterator pending = mPendingLOD.find(mesh_params);
+
+ if (pending != mPendingLOD.end())
+ { //append this lod request to existing header request
+ pending->second.push_back(lod);
+ llassert(pending->second.size() <= LLModel::NUM_LODS)
+ }
+ else
+ { //if no header request is pending, fetch header
+ LLMutexLock lock(mMutex);
+ mHeaderReqQ.push(req);
+ mPendingLOD[mesh_params].push_back(lod);
+ }
+ }
+}
+
+//static
+std::string LLMeshRepoThread::constructUrl(LLUUID mesh_id)
+{
+ std::string http_url;
+
+ if (gAgent.getRegion())
+ {
+ http_url = gMeshRepo.mGetMeshCapability;
+ }
+
+ if (!http_url.empty())
+ {
+ http_url += "/?mesh_id=";
+ http_url += mesh_id.asString().c_str();
+ }
+ else
+ {
+ llwarns << "Current region does not have GetMesh capability! Cannot load " << mesh_id << ".mesh" << llendl;
+ }
+
+ return http_url;
+}
+
+bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id]["skin"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["skin"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (offset >= 0 && size > 0)
+ {
+ //check VFS for mesh skin info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (skinInfoReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ new LLMeshSkinInfoResponder(mesh_id, offset, size));
+ }
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id]["decomposition"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["decomposition"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (offset >= 0 && size > 0)
+ {
+ //check VFS for mesh skin info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (decompositionReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshDecompositionResponder(mesh_id, offset, size));
+ }
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id]["physics_shape"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["physics_shape"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (offset >= 0 && size > 0)
+ {
+ //check VFS for mesh physics shape info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (physicsShapeReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
+ }
+ }
+ else
+ { //no physics shape whatsoever, report back NULL
+ physicsShapeReceived(mesh_id, NULL, 0);
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
+{
+ bool retval = false;
+
+ {
+ //look for mesh in asset in vfs
+ LLVFile file(gVFS, mesh_params.getSculptID(), LLAssetType::AT_MESH);
+
+ S32 size = file.getSize();
+
+ if (size > 0)
+ {
+ U8 buffer[1024];
+ S32 bytes = llmin(size, 1024);
+ LLMeshRepository::sCacheBytesRead += bytes;
+ file.read(buffer, bytes);
+ if (headerReceived(mesh_params, buffer, bytes))
+ { //did not do an HTTP request, return false
+ return false;
+ }
+ }
+ }
+
+ //either cache entry doesn't exist or is corrupt, request header from simulator
+
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_params.getSculptID());
+ if (!http_url.empty())
+ {
+ ++sActiveHeaderRequests;
+ retval = true;
+ //grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
+ //within the first 4KB
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
+ }
+
+ return retval;
+}
+
+bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ bool retval = false;
+
+ LLUUID mesh_id = mesh_params.getSculptID();
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id][header_lod[lod]]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id][header_lod[lod]]["size"].asInteger();
+ mHeaderMutex->unlock();
+ if (offset >= 0 && size > 0)
+ {
+
+ //check VFS for mesh asset
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (lodReceived(mesh_params, lod, buffer, size))
+ {
+ delete[] buffer;
+ return false;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ retval = true;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ new LLMeshLODResponder(mesh_params, lod, offset, size));
+ }
+ else
+ {
+ mUnavailableQ.push(LODRequest(mesh_params, lod));
+ }
+ }
+ else
+ {
+ mUnavailableQ.push(LODRequest(mesh_params, lod));
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ return retval;
+}
+
+bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
+{
+ LLSD header;
+
+ U32 header_size = 0;
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::string deprecated_header("<? LLSD/Binary ?>");
+
+ if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
+ {
+ res_str = res_str.substr(deprecated_header.size()+1, data_size);
+ header_size = deprecated_header.size()+1;
+ }
+ data_size = res_str.size();
+
+ std::istringstream stream(res_str);
+
+ if (!LLSDSerialize::fromBinary(header, stream, data_size))
+ {
+ llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+
+ header_size += stream.tellg();
+ }
+ else
+ {
+ llinfos
+ << "Marking header as non-existent, will not retry." << llendl;
+ header["404"] = 1;
+ }
+
+ {
+ U32 cost = gMeshRepo.calcResourceCost(header);
+
+ LLUUID mesh_id = mesh_params.getSculptID();
+
+ mHeaderMutex->lock();
+ mMeshHeaderSize[mesh_id] = header_size;
+ mMeshHeader[mesh_id] = header;
+ mMeshResourceCost[mesh_id] = cost;
+ mHeaderMutex->unlock();
+
+ //check for pending requests
+ pending_lod_map::iterator iter = mPendingLOD.find(mesh_params);
+ if (iter != mPendingLOD.end())
+ {
+ LLMutexLock lock(mMutex);
+ for (U32 i = 0; i < iter->second.size(); ++i)
+ {
+ LODRequest req(mesh_params, iter->second[i]);
+ mLODReqQ.push(req);
+ }
+ }
+ mPendingLOD.erase(iter);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
+{
+ LLVolume* volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
+ std::string mesh_string((char*) data, data_size);
+ std::istringstream stream(mesh_string);
+
+ if (volume->unpackVolumeFaces(stream, data_size))
+ {
+ LoadedMesh mesh(volume, mesh_params, lod);
+ if (volume->getNumFaces() > 0)
+ {
+ LLMutexLock lock(mMutex);
+ mLoadedQ.push(mesh);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD skin;
+
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::istringstream stream(res_str);
+
+ if (!unzip_llsd(skin, stream, data_size))
+ {
+ llwarns << "Mesh skin info parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ {
+ LLMeshSkinInfo info(skin);
+ info.mMeshID = mesh_id;
+
+ //llinfos<<"info pelvis offset"<<info.mPelvisOffset<<llendl;
+ mSkinInfoQ.push(info);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD decomp;
+
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::istringstream stream(res_str);
+
+ if (!unzip_llsd(decomp, stream, data_size))
+ {
+ llwarns << "Mesh decomposition parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ {
+ LLModel::Decomposition* d = new LLModel::Decomposition(decomp);
+ d->mMeshID = mesh_id;
+ mDecompositionQ.push(d);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD physics_shape;
+
+ LLModel::Decomposition* d = new LLModel::Decomposition();
+ d->mMeshID = mesh_id;
+
+ if (data == NULL)
+ { //no data, no physics shape exists
+ d->mPhysicsShapeMesh.clear();
+ }
+ else
+ {
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH);
+ LLPointer<LLVolume> volume = new LLVolume(volume_params,0);
+ std::string mesh_string((char*) data, data_size);
+ std::istringstream stream(mesh_string);
+
+ if (volume->unpackVolumeFaces(stream, data_size))
+ {
+ //load volume faces into decomposition buffer
+ S32 vertex_count = 0;
+ S32 index_count = 0;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ vertex_count += face.mNumVertices;
+ index_count += face.mNumIndices;
+ }
+
+ d->mPhysicsShapeMesh.clear();
+
+ std::vector<LLVector3>& pos = d->mPhysicsShapeMesh.mPositions;
+ std::vector<LLVector3>& norm = d->mPhysicsShapeMesh.mNormals;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+
+ for (S32 i = 0; i < face.mNumIndices; ++i)
+ {
+ U16 idx = face.mIndices[i];
+
+ pos.push_back(LLVector3(face.mPositions[idx].getF32ptr()));
+ norm.push_back(LLVector3(face.mNormals[idx].getF32ptr()));
+ }
+ }
+ }
+ }
+
+ mDecompositionQ.push(d);
+ return true;
+}
+
+LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints)
+: LLThread("mesh upload"),
+ mDiscarded(FALSE)
+{
+ mInstanceList = data;
+ mUploadTextures = upload_textures;
+ mUploadSkin = upload_skin;
+ mUploadJoints = upload_joints;
+ mMutex = new LLMutex(NULL);
+ mCurlRequest = NULL;
+ mPendingConfirmations = 0;
+ mPendingUploads = 0;
+ mPendingCost = 0;
+ mFinished = false;
+ mOrigin = gAgent.getPositionAgent();
+ mHost = gAgent.getRegionHost();
+
+ mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset");
+ mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice");
+ mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+
+ mOrigin += gAgent.getAtAxis() * scale.magVec();
+}
+
+LLMeshUploadThread::~LLMeshUploadThread()
+{
+
+}
+
+LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread)
+{
+ mStage = "single_hull";
+ mModel = mdl;
+ mDecompID = &mdl->mDecompID;
+ mBaseModel = base_model;
+ mThread = thread;
+
+ //copy out positions and indices
+ if (mdl)
+ {
+ U16 index_offset = 0;
+
+ mPositions.clear();
+ mIndices.clear();
+
+ //queue up vertex positions and indices
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = mdl->getVolumeFace(i);
+ if (mPositions.size() + face.mNumVertices > 65535)
+ {
+ continue;
+ }
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
+ }
+
+ for (U32 j = 0; j < face.mNumIndices; ++j)
+ {
+ mIndices.push_back(face.mIndices[j]+index_offset);
+ }
+
+ index_offset += face.mNumVertices;
+ }
+ }
+
+ mThread->mFinalDecomp = this;
+ mThread->mPhysicsComplete = false;
+}
+
+void LLMeshUploadThread::DecompRequest::completed()
+{
+ if (mThread->mFinalDecomp == this)
+ {
+ mThread->mPhysicsComplete = true;
+ }
+
+ llassert(mHull.size() == 1);
+
+ mThread->mHullMap[mBaseModel] = mHull[0];
+}
+
+//called in the main thread.
+void LLMeshUploadThread::preStart()
+{
+ //build map of LLModel refs to instances for callbacks
+ for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
+ {
+ mInstance[iter->mModel].push_back(*iter);
+ }
+}
+
+void LLMeshUploadThread::discard()
+{
+ LLMutexLock lock(mMutex) ;
+ mDiscarded = TRUE ;
+}
+
+BOOL LLMeshUploadThread::isDiscarded()
+{
+ LLMutexLock lock(mMutex) ;
+ return mDiscarded ;
+}
+
+void LLMeshUploadThread::run()
+{
+ if (gSavedSettings.getBOOL("MeshUseWholeModelUpload"))
+ {
+ doWholeModelUpload();
+ }
+ else
+ {
+ doIterativeUpload();
+ }
+}
+
+void dumpLLSDToFile(const LLSD& content, std::string filename)
+{
+#if 1
+ std::ofstream of(filename.c_str());
+ LLSDSerialize::toPrettyXML(content,of);
+#endif
+}
+
+void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
+{
+ LLSD result;
+
+ LLSD res;
+ result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
+ result["asset_type"] = "mesh";
+ result["inventory_type"] = "object";
+ result["name"] = "mesh model";
+ result["description"] = "your description here";
+
+ res["mesh_list"] = LLSD::emptyArray();
+ res["texture_list"] = LLSD::emptyArray();
+ res["instance_list"] = LLSD::emptyArray();
+ S32 mesh_num = 0;
+ S32 texture_num = 0;
+
+ std::set<LLViewerTexture* > textures;
+ std::map<LLViewerTexture*,S32> texture_index;
+
+ std::map<LLModel*,S32> mesh_index;
+
+ S32 instance_num = 0;
+
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+ LLModelInstance& instance = *(iter->second.begin());
+ LLModel* model = instance.mModel;
+ if (mesh_index.find(model) == mesh_index.end())
+ {
+ // Have not seen this model before - create a new mesh_list entry for it.
+ std::string model_name = data.mBaseModel->getName();
+ if (!model_name.empty())
+ {
+ result["name"] = model_name;
+ }
+
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
+
+ LLSD mesh_header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints);
+
+ data.mAssetData = ostr.str();
+ std::string str = ostr.str();
+
+ res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
+ mesh_index[model] = mesh_num;
+ mesh_num++;
+ }
+
+ LLSD instance_entry;
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ LLVector3 pos, scale;
+ LLQuaternion rot;
+ LLMatrix4 transformation = instance.mTransform;
+ decomposeMeshMatrix(transformation,pos,rot,scale);
+ instance_entry["position"] = ll_sd_from_vector3(pos);
+ instance_entry["rotation"] = ll_sd_from_quaternion(rot);
+ instance_entry["scale"] = ll_sd_from_vector3(scale);
+
+ instance_entry["material"] = LL_MCODE_WOOD;
+ LLPermissions perm;
+ perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
+ perm.setCreator(gAgent.getID());
+
+ perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
+ PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
+ LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getNextOwnerPerms());
+ instance_entry["permissions"] = ll_create_sd_from_permissions(perm);
+ instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ instance_entry["mesh"] = mesh_index[model];
+
+ if (mUploadTextures)
+ {
+ instance_entry["face_list"] = LLSD::emptyArray();
+
+ for (S32 face_num = 0; face_num < model->getNumVolumeFaces(); face_num++)
+ {
+ LLImportMaterial& material = instance.mMaterial[face_num];
+ LLSD face_entry = LLSD::emptyMap();
+ LLViewerFetchedTexture *texture = material.mDiffuseMap.get();
+
+ if (texture != NULL)
+ {
+ if (textures.find(texture) == textures.end())
+ {
+ textures.insert(texture);
+ }
+
+ std::stringstream ostr;
+ if (include_textures) // otherwise data is blank.
+ {
+ LLTextureUploadData data(texture, material.mDiffuseMapLabel);
+ if (!data.mTexture->isRawImageValid())
+ {
+ data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
+ }
+
+ LLPointer<LLImageJ2C> upload_file =
+ LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
+ ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
+ }
+
+ if (texture_index.find(texture) == texture_index.end())
+ {
+ texture_index[texture] = texture_num;
+ std::string str = ostr.str();
+ res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
+ texture_num++;
+ }
+ }
+
+ // Subset of TextureEntry fields.
+ if (texture)
+ {
+ face_entry["image"] = texture_index[texture];
+ }
+ face_entry["scales"] = 1.0;
+ face_entry["scalet"] = 1.0;
+ face_entry["offsets"] = 0.0;
+ face_entry["offsett"] = 0.0;
+ face_entry["imagerot"] = 0.0;
+ face_entry["colors"] = ll_sd_from_color4(material.mDiffuseColor);
+ face_entry["fullbright"] = material.mFullbright;
+ instance_entry["face_list"][face_num] = face_entry;
+ }
+ }
+
+ res["instance_list"][instance_num] = instance_entry;
+ instance_num++;
+ }
+
+ result["asset_resources"] = res;
+ dumpLLSDToFile(result,"whole_model.xml");
+
+ dest = result;
+}
+
+void LLMeshUploadThread::doWholeModelUpload()
+{
+ mCurlRequest = new LLCurlRequest();
+
+ // Queue up models for hull generation (viewer-side)
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+
+ LLModelInstance& instance = *(iter->second.begin());
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ //queue up models for hull generation
+ LLModel* physics = NULL;
+
+ if (data.mModel[LLModel::LOD_PHYSICS].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_PHYSICS];
+ }
+ else if (data.mModel[LLModel::LOD_MEDIUM].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_MEDIUM];
+ }
+ else
+ {
+ physics = data.mModel[LLModel::LOD_HIGH];
+ }
+
+ llassert(physics != NULL);
+
+ DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+
+ while (!mPhysicsComplete)
+ {
+ apr_sleep(100);
+ }
+
+ LLSD model_data;
+ wholeModelToLLSD(model_data,false);
+ dumpLLSDToFile(model_data,"whole_model_fee_request.xml");
+
+ mPendingUploads++;
+ LLCurlRequest::headers_t headers;
+ mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
+ new LLWholeModelFeeResponder(this));
+
+ do
+ {
+ mCurlRequest->process();
+ } while (mCurlRequest->getQueued() > 0);
+
+
+ if (mWholeModelUploadURL.empty())
+ {
+ llinfos << "unable to upload, fee request failed" << llendl;
+ }
+ else
+ {
+ LLSD full_model_data;
+ wholeModelToLLSD(full_model_data, true);
+ LLSD body = full_model_data["asset_resources"];
+ dumpLLSDToFile(body,"whole_model_body.xml");
+ mCurlRequest->post(mWholeModelUploadURL, headers, body,
+ new LLWholeModelUploadResponder(this, model_data));
+ do
+ {
+ mCurlRequest->process();
+ } while (mCurlRequest->getQueued() > 0);
+ }
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+
+ // Currently a no-op.
+ mFinished = true;
+}
+
+void LLMeshUploadThread::doIterativeUpload()
+{
+ if(isDiscarded())
+ {
+ mFinished = true;
+ return ;
+ }
+
+ mCurlRequest = new LLCurlRequest();
+
+ std::set<LLViewerTexture* > textures;
+
+ //populate upload queue with relevant models
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+
+ LLModelInstance& instance = *(iter->second.begin());
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ uploadModel(data);
+
+ if (mUploadTextures)
+ {
+ for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin();
+ material_iter != instance.mMaterial.end(); ++material_iter)
+ {
+
+ if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
+ {
+ textures.insert(material_iter->mDiffuseMap.get());
+
+ LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
+ uploadTexture(data);
+ }
+ }
+ }
+
+ //queue up models for hull generation
+ LLModel* physics = data.mModel[LLModel::LOD_PHYSICS];
+ if (physics == NULL)
+ { //no physics model available, use high lod
+ physics = data.mModel[LLModel::LOD_HIGH];
+ }
+
+ DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+
+ while (!mPhysicsComplete)
+ {
+ apr_sleep(100);
+ }
+
+ //upload textures
+ bool done = false;
+ do
+ {
+ if (!mTextureQ.empty())
+ {
+ sendCostRequest(mTextureQ.front());
+ mTextureQ.pop();
+ }
+
+ if (!mConfirmedTextureQ.empty())
+ {
+ doUploadTexture(mConfirmedTextureQ.front());
+ mConfirmedTextureQ.pop();
+ }
+
+ mCurlRequest->process();
+
+ done = mTextureQ.empty() && mConfirmedTextureQ.empty();
+ }
+ while (!done || mCurlRequest->getQueued() > 0);
+
+ LLSD object_asset;
+ object_asset["objects"] = LLSD::emptyArray();
+
+ done = false;
+ do
+ {
+ static S32 count = 0;
+ static F32 last_hundred = gFrameTimeSeconds;
+ if (gFrameTimeSeconds - last_hundred > 1.f)
+ {
+ last_hundred = gFrameTimeSeconds;
+ count = 0;
+ }
+
+ //how many requests to push before calling process
+ const S32 PUSH_PER_PROCESS = 32;
+
+ S32 tcount = llmin(count+PUSH_PER_PROCESS, 100);
+
+ while (!mUploadQ.empty() && count < tcount)
+ { //send any pending upload requests
+ mMutex->lock();
+ LLMeshUploadData data = mUploadQ.front();
+ mUploadQ.pop();
+ mMutex->unlock();
+ sendCostRequest(data);
+ count++;
+ }
+
+ tcount = llmin(count+PUSH_PER_PROCESS, 100);
+
+ while (!mConfirmedQ.empty() && count < tcount)
+ { //process any meshes that have been confirmed for upload
+ LLMeshUploadData& data = mConfirmedQ.front();
+ doUploadModel(data);
+ mConfirmedQ.pop();
+ count++;
+ }
+
+ tcount = llmin(count+PUSH_PER_PROCESS, 100);
+
+ while (!mInstanceQ.empty() && count < tcount && !isDiscarded())
+ { //create any objects waiting for upload
+ count++;
+ object_asset["objects"].append(createObject(mInstanceQ.front()));
+ mInstanceQ.pop();
+ }
+
+ mCurlRequest->process();
+
+ done = isDiscarded() || (mInstanceQ.empty() && mConfirmedQ.empty() && mUploadQ.empty());
+ }
+ while (!done || mCurlRequest->getQueued() > 0);
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+
+ // now upload the object asset
+ std::string url = mUploadObjectAssetCapability;
+
+ if (object_asset["objects"][0].has("permissions"))
+ { //copy permissions from first available object to be used for coalesced object
+ object_asset["permissions"] = object_asset["objects"][0]["permissions"];
+ }
+
+ if(!isDiscarded())
+ {
+ mPendingUploads++;
+ LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset));
+ }
+ else
+ {
+ mFinished = true;
+ }
+}
+
+void LLMeshUploadThread::uploadModel(LLMeshUploadData& data)
+{ //called from arbitrary thread
+ {
+ LLMutexLock lock(mMutex);
+ mUploadQ.push(data);
+ }
+}
+
+void LLMeshUploadThread::uploadTexture(LLTextureUploadData& data)
+{ //called from mesh upload thread
+ mTextureQ.push(data);
+}
+
+
+static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_LOADED("Notify Loaded");
+static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_UNAVAILABLE("Notify Unavailable");
+
+void LLMeshRepoThread::notifyLoadedMeshes()
+{
+ while (!mLoadedQ.empty())
+ {
+ mMutex->lock();
+ LoadedMesh mesh = mLoadedQ.front();
+ mLoadedQ.pop();
+ mMutex->unlock();
+
+ if (mesh.mVolume && mesh.mVolume->getNumVolumeFaces() > 0)
+ {
+ gMeshRepo.notifyMeshLoaded(mesh.mMeshParams, mesh.mVolume);
+ }
+ else
+ {
+ gMeshRepo.notifyMeshUnavailable(mesh.mMeshParams,
+ LLVolumeLODGroup::getVolumeDetailFromScale(mesh.mVolume->getDetail()));
+ }
+ }
+
+ while (!mUnavailableQ.empty())
+ {
+ mMutex->lock();
+ LODRequest req = mUnavailableQ.front();
+ mUnavailableQ.pop();
+ mMutex->unlock();
+
+ gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD);
+ }
+
+ while (!mSkinInfoQ.empty())
+ {
+ gMeshRepo.notifySkinInfoReceived(mSkinInfoQ.front());
+ mSkinInfoQ.pop();
+ }
+
+ while (!mDecompositionQ.empty())
+ {
+ gMeshRepo.notifyDecompositionReceived(mDecompositionQ.front());
+ mDecompositionQ.pop();
+ }
+}
+
+S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //only ever called from main thread
+ LLMutexLock lock(mHeaderMutex);
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
+
+ if (iter != mMeshHeader.end())
+ {
+ LLSD& header = iter->second;
+
+ return LLMeshRepository::getActualMeshLOD(header, lod);
+ }
+
+ return lod;
+}
+
+//static
+S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
+{
+ lod = llclamp(lod, 0, 3);
+
+ if (header.has("404"))
+ {
+ return -1;
+ }
+
+ if (header[header_lod[lod]]["size"].asInteger() > 0)
+ {
+ return lod;
+ }
+
+ //search down to find the next available lower lod
+ for (S32 i = lod-1; i >= 0; --i)
+ {
+ if (header[header_lod[i]]["size"].asInteger() > 0)
+ {
+ return i;
+ }
+ }
+
+ //search up to find then ext available higher lod
+ for (S32 i = lod+1; i < 4; ++i)
+ {
+ if (header[header_lod[i]]["size"].asInteger() > 0)
+ {
+ return i;
+ }
+ }
+
+ //header exists and no good lod found, treat as 404
+ header["404"] = 1;
+ return -1;
+}
+
+U32 LLMeshRepoThread::getResourceCost(const LLUUID& mesh_id)
+{
+ LLMutexLock lock(mHeaderMutex);
+
+ std::map<LLUUID, U32>::iterator iter = mMeshResourceCost.find(mesh_id);
+ if (iter != mMeshResourceCost.end())
+ {
+ return iter->second;
+ }
+
+ return 0;
+}
+
+void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
+{
+ mThread->mMeshHeader[data.mUUID] = header;
+
+ // we cache the mesh for default parameters
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH);
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ if (data.mModel[i].notNull())
+ {
+ LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
+ volume->copyVolumeFaces(data.mModel[i]);
+ }
+ }
+
+}
+
+void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+
+ LLMeshRepoThread::sActiveLODRequests--;
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshLOD(mMeshParams, mLOD);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ file.seek(offset);
+ file.write(data, size);
+ LLMeshRepository::sCacheBytesWritten += size;
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ LLMeshRepoThread::sActiveHeaderRequests--;
+ if (status < 200 || status > 400)
+ {
+ //llwarns
+ // << "Header responder failed with status: "
+ // << status << ": " << reason << llendl;
+
+ // 503 (service unavailable) or 499 (timeout)
+ // can be due to server load and can be retried
+
+ // TODO*: Add maximum retry logic, exponential backoff
+ // and (somewhat more optional than the others) retries
+ // again after some set period of time
+ if (status == 503 || status == 499)
+ { //retry
+ LLMeshRepository::sHTTPRetryCount++;
+ LLMeshRepoThread::HeaderRequest req(mMeshParams);
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ gMeshRepo.mThread->mHeaderReqQ.push(req);
+
+ return;
+ }
+ }
+
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ LLMeshRepository::sBytesReceived += llmin(data_size, 4096);
+
+ if (!gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size))
+ {
+ llwarns
+ << "Unable to parse mesh header: "
+ << status << ": " << reason << llendl;
+ }
+ else if (data && data_size > 0)
+ {
+ //header was successfully retrieved from sim, cache in vfs
+ LLUUID mesh_id = mMeshParams.getSculptID();
+ LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id];
+
+ std::stringstream str;
+
+ S32 lod_bytes = 0;
+
+ for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i)
+ { //figure out how many bytes we'll need to reserve in the file
+ std::string lod_name = header_lod[i];
+ lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
+ }
+
+ //just in case skin info or decomposition is at the end of the file (which it shouldn't be)
+ lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
+ lod_bytes = llmax(lod_bytes, header["decomposition"]["offset"].asInteger() + header["decomposition"]["size"].asInteger());
+
+ S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
+ S32 bytes = lod_bytes + header_bytes;
+
+
+ //it's possible for the remote asset to have more data than is needed for the local cache
+ //only allocate as much space in the VFS as is needed for the local cache
+ data_size = llmin(data_size, bytes);
+
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE);
+ if (file.getMaxSize() >= bytes || file.setMaxSize(bytes))
+ {
+ LLMeshRepository::sCacheBytesWritten += data_size;
+
+ file.write((const U8*) data, data_size);
+
+ //zero out the rest of the file
+ U8 block[4096];
+ memset(block, 0, 4096);
+
+ while (bytes-file.tell() > 4096)
+ {
+ file.write(block, 4096);
+ }
+
+ S32 remaining = bytes-file.tell();
+
+ if (remaining < 0 || remaining > 4096)
+ {
+ llerrs << "Bad padding of mesh asset cache entry." << llendl;
+ }
+
+ if (remaining > 0)
+ {
+ file.write(block, remaining);
+ }
+ }
+ }
+
+ delete [] data;
+}
+
+
+LLMeshRepository::LLMeshRepository()
+: mMeshMutex(NULL),
+ mMeshThreadCount(0),
+ mThread(NULL)
+{
+
+}
+
+void LLMeshRepository::init()
+{
+ mMeshMutex = new LLMutex(NULL);
+
+ LLConvexDecomposition::getInstance()->initSystem();
+
+ mDecompThread = new LLPhysicsDecomp();
+ mDecompThread->start();
+
+ while (!mDecompThread->mInited)
+ { //wait for physics decomp thread to init
+ apr_sleep(100);
+ }
+
+
+
+ mThread = new LLMeshRepoThread();
+ mThread->start();
+}
+
+void LLMeshRepository::shutdown()
+{
+ llinfos << "Shutting down mesh repository." << llendl;
+
+ for (U32 i = 0; i < mUploads.size(); ++i)
+ {
+ llinfos << "Discard the pending mesh uploads " << llendl;
+ mUploads[i]->discard() ; //discard the uploading requests.
+ }
+
+ mThread->mSignal->signal();
+
+ while (!mThread->isStopped())
+ {
+ apr_sleep(10);
+ }
+ delete mThread;
+ mThread = NULL;
+
+ for (U32 i = 0; i < mUploads.size(); ++i)
+ {
+ llinfos << "Waiting for pending mesh upload " << i << "/" << mUploads.size() << llendl;
+ while (!mUploads[i]->isStopped())
+ {
+ apr_sleep(10);
+ }
+ delete mUploads[i];
+ }
+
+ mUploads.clear();
+
+ delete mMeshMutex;
+ mMeshMutex = NULL;
+
+ llinfos << "Shutting down decomposition system." << llendl;
+
+ if (mDecompThread)
+ {
+ mDecompThread->shutdown();
+ delete mDecompThread;
+ mDecompThread = NULL;
+ }
+
+ LLConvexDecomposition::quitSystem();
+}
+
+//called in the main thread.
+S32 LLMeshRepository::update()
+{
+ if(mUploadWaitList.empty())
+ {
+ return 0 ;
+ }
+
+ S32 size = mUploadWaitList.size() ;
+ for (S32 i = 0; i < size; ++i)
+ {
+ mUploads.push_back(mUploadWaitList[i]);
+ mUploadWaitList[i]->preStart() ;
+ mUploadWaitList[i]->start() ;
+ }
+ mUploadWaitList.clear() ;
+
+ return size ;
+}
+
+S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail, S32 last_lod)
+{
+ if (detail < 0 || detail > 4)
+ {
+ return detail;
+ }
+
+ LLFastTimer t(FTM_LOAD_MESH);
+
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_params);
+ if (iter != mLoadingMeshes[detail].end())
+ { //request pending for this mesh, append volume id to list
+ iter->second.insert(vobj->getID());
+ }
+ else
+ {
+ //first request for this mesh
+ mLoadingMeshes[detail][mesh_params].insert(vobj->getID());
+ mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail));
+ }
+ }
+
+ //do a quick search to see if we can't display something while we wait for this mesh to load
+ LLVolume* volume = vobj->getVolume();
+
+ if (volume)
+ {
+ if (volume->getNumVolumeFaces() == 0 && !volume->isTetrahedron())
+ {
+ volume->makeTetrahedron();
+ }
+
+ LLVolumeParams params = volume->getParams();
+
+ LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params);
+
+ if (group)
+ {
+ //first, see if last_lod is available (don't transition down to avoid funny popping a la SH-641)
+ if (last_lod >= 0)
+ {
+ LLVolume* lod = group->refLOD(last_lod);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return last_lod;
+ }
+ group->derefLOD(lod);
+ }
+
+ //next, see what the next lowest LOD available might be
+ for (S32 i = detail-1; i >= 0; --i)
+ {
+ LLVolume* lod = group->refLOD(i);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return i;
+ }
+
+ group->derefLOD(lod);
+ }
+
+ //no lower LOD is a available, is a higher lod available?
+ for (S32 i = detail+1; i < 4; ++i)
+ {
+ LLVolume* lod = group->refLOD(i);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return i;
+ }
+
+ group->derefLOD(lod);
+ }
+ }
+ }
+
+ return detail;
+}
+
+static LLFastTimer::DeclareTimer FTM_START_MESH_THREAD("Start Thread");
+static LLFastTimer::DeclareTimer FTM_LOAD_MESH_LOD("Load LOD");
+static LLFastTimer::DeclareTimer FTM_MESH_LOCK1("Lock 1");
+static LLFastTimer::DeclareTimer FTM_MESH_LOCK2("Lock 2");
+
+void LLMeshRepository::notifyLoadedMeshes()
+{ //called from main thread
+
+ LLMeshRepoThread::sMaxConcurrentRequests = gSavedSettings.getU32("MeshMaxConcurrentRequests");
+
+ //clean up completed upload threads
+ for (std::vector<LLMeshUploadThread*>::iterator iter = mUploads.begin(); iter != mUploads.end(); )
+ {
+ LLMeshUploadThread* thread = *iter;
+
+ if (thread->isStopped() && thread->finished())
+ {
+ iter = mUploads.erase(iter);
+ delete thread;
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+
+ //update inventory
+ if (!mInventoryQ.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ while (!mInventoryQ.empty())
+ {
+ inventory_data& data = mInventoryQ.front();
+
+ LLAssetType::EType asset_type = LLAssetType::lookup(data.mPostData["asset_type"].asString());
+ LLInventoryType::EType inventory_type = LLInventoryType::lookup(data.mPostData["inventory_type"].asString());
+
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ inventory_type,
+ data.mPostData["asset_type"].asString(),
+ data.mPostData["folder_id"].asUUID(),
+ data.mPostData["name"],
+ data.mPostData["description"],
+ data.mResponse,
+ 0);
+
+ mInventoryQ.pop();
+ }
+ }
+
+ //call completed callbacks on finished decompositions
+ mDecompThread->notifyCompleted();
+
+ if (!mThread->mWaiting)
+ { //curl thread is churning, wait for it to go idle
+ return;
+ }
+
+ static std::string region_name("never name a region this");
+
+ if (gAgent.getRegion())
+ { //update capability url
+ if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
+ {
+ region_name = gAgent.getRegion()->getName();
+
+ mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh");
+ }
+ }
+
+ LLFastTimer t(FTM_MESH_UPDATE);
+
+ {
+ LLFastTimer t(FTM_MESH_LOCK1);
+ mMeshMutex->lock();
+ }
+
+ {
+ LLFastTimer t(FTM_MESH_LOCK2);
+ mThread->mMutex->lock();
+ }
+
+ //popup queued error messages from background threads
+ while (!mUploadErrorQ.empty())
+ {
+ LLNotificationsUtil::add("MeshUploadError", mUploadErrorQ.front());
+ mUploadErrorQ.pop();
+ }
+
+ S32 push_count = LLMeshRepoThread::sMaxConcurrentRequests-(LLMeshRepoThread::sActiveHeaderRequests+LLMeshRepoThread::sActiveLODRequests);
+
+ if (push_count > 0)
+ {
+ //calculate "score" for pending requests
+
+ //create score map
+ std::map<LLUUID, F32> score_map;
+
+ for (U32 i = 0; i < 4; ++i)
+ {
+ for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
+ {
+ F32 max_score = 0.f;
+ for (std::set<LLUUID>::iterator obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
+ {
+ LLViewerObject* object = gObjectList.findObject(*obj_iter);
+
+ if (object)
+ {
+ LLDrawable* drawable = object->mDrawable;
+ if (drawable)
+ {
+ F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
+ max_score = llmax(max_score, cur_score);
+ }
+ }
+ }
+
+ score_map[iter->first.getSculptID()] = max_score;
+ }
+ }
+
+ //set "score" for pending requests
+ for (std::vector<LLMeshRepoThread::LODRequest>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter)
+ {
+ iter->mScore = score_map[iter->mMeshParams.getSculptID()];
+ }
+
+ //sort by "score"
+ std::sort(mPendingRequests.begin(), mPendingRequests.end(), LLMeshRepoThread::CompareScoreGreater());
+
+ while (!mPendingRequests.empty() && push_count > 0)
+ {
+ LLFastTimer t(FTM_LOAD_MESH_LOD);
+ LLMeshRepoThread::LODRequest& request = mPendingRequests.front();
+ mThread->loadMeshLOD(request.mMeshParams, request.mLOD);
+ mPendingRequests.erase(mPendingRequests.begin());
+ push_count--;
+ }
+ }
+
+ //send skin info requests
+ while (!mPendingSkinRequests.empty())
+ {
+ mThread->loadMeshSkinInfo(mPendingSkinRequests.front());
+ mPendingSkinRequests.pop();
+ }
+
+ //send decomposition requests
+ while (!mPendingDecompositionRequests.empty())
+ {
+ mThread->loadMeshDecomposition(mPendingDecompositionRequests.front());
+ mPendingDecompositionRequests.pop();
+ }
+
+ //send physics shapes decomposition requests
+ while (!mPendingPhysicsShapeRequests.empty())
+ {
+ mThread->loadMeshPhysicsShape(mPendingPhysicsShapeRequests.front());
+ mPendingPhysicsShapeRequests.pop();
+ }
+
+ mThread->notifyLoadedMeshes();
+
+ mThread->mMutex->unlock();
+ mMeshMutex->unlock();
+
+ mThread->mSignal->signal();
+}
+
+void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
+{
+ mSkinMap[info.mMeshID] = info;
+
+ skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID);
+ if (iter != mLoadingSkins.end())
+ {
+ for (std::set<LLUUID>::iterator obj_id = iter->second.begin(); obj_id != iter->second.end(); ++obj_id)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*obj_id);
+ if (vobj)
+ {
+ vobj->notifyMeshLoaded();
+ }
+ }
+ }
+
+ mLoadingSkins.erase(info.mMeshID);
+}
+
+void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp)
+{
+ decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID);
+ if (iter == mDecompositionMap.end())
+ { //just insert decomp into map
+ mDecompositionMap[decomp->mMeshID] = decomp;
+ }
+ else
+ { //merge decomp with existing entry
+ iter->second->merge(decomp);
+ delete decomp;
+ }
+
+ mLoadingDecompositions.erase(decomp->mMeshID);
+}
+
+void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume)
+{ //called from main thread
+ S32 detail = LLVolumeLODGroup::getVolumeDetailFromScale(volume->getDetail());
+
+ //get list of objects waiting to be notified this mesh is loaded
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh_params);
+
+ if (volume && obj_iter != mLoadingMeshes[detail].end())
+ {
+ //make sure target volume is still valid
+ if (volume->getNumVolumeFaces() <= 0)
+ {
+ llwarns << "Mesh loading returned empty volume." << llendl;
+ volume->makeTetrahedron();
+ }
+
+ { //update system volume
+ LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail);
+ if (sys_volume)
+ {
+ sys_volume->copyVolumeFaces(volume);
+ LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
+ }
+ else
+ {
+ llwarns << "Couldn't find system volume for given mesh." << llendl;
+ }
+ }
+
+ //notify waiting LLVOVolume instances that their requested mesh is available
+ for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
+ if (vobj)
+ {
+ vobj->notifyMeshLoaded();
+ }
+ }
+
+ mLoadingMeshes[detail].erase(mesh_params);
+ }
+}
+
+void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod)
+{ //called from main thread
+ //get list of objects waiting to be notified this mesh is loaded
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[lod].find(mesh_params);
+
+ F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod);
+
+ if (obj_iter != mLoadingMeshes[lod].end())
+ {
+ for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
+ if (vobj)
+ {
+ LLVolume* obj_volume = vobj->getVolume();
+
+ if (obj_volume &&
+ obj_volume->getDetail() == detail &&
+ obj_volume->getParams() == mesh_params)
+ { //should force volume to find most appropriate LOD
+ vobj->setVolume(obj_volume->getParams(), lod);
+ }
+ }
+ }
+
+ mLoadingMeshes[lod].erase(mesh_params);
+ }
+}
+
+S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{
+ return mThread->getActualMeshLOD(mesh_params, lod);
+}
+
+U32 LLMeshRepository::calcResourceCost(LLSD& header)
+{
+ U32 bytes = 0;
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ bytes += header[header_lod[i]]["size"].asInteger();
+ }
+
+ bytes += header["skin"]["size"].asInteger();
+
+ return bytes/4096 + 1;
+}
+
+U32 LLMeshRepository::getResourceCost(const LLUUID& mesh_id)
+{
+ return mThread->getResourceCost(mesh_id);
+}
+
+const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj)
+{
+ if (mesh_id.notNull())
+ {
+ skin_map::iterator iter = mSkinMap.find(mesh_id);
+ if (iter != mSkinMap.end())
+ {
+ return &(iter->second);
+ }
+
+ //no skin info known about given mesh, try to fetch it
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ skin_load_map::iterator iter = mLoadingSkins.find(mesh_id);
+ if (iter == mLoadingSkins.end())
+ { //no request pending for this skin info
+ mPendingSkinRequests.push(mesh_id);
+ }
+ mLoadingSkins[mesh_id].insert(requesting_obj->getID());
+ }
+ }
+
+ return NULL;
+}
+
+void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
+{
+ if (mesh_id.notNull())
+ {
+ LLModel::Decomposition* decomp = NULL;
+ decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
+ if (iter != mDecompositionMap.end())
+ {
+ decomp = iter->second;
+ }
+
+ //decomposition block hasn't been fetched yet
+ if (!decomp || decomp->mPhysicsShapeMesh.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id);
+ if (iter == mLoadingPhysicsShapes.end())
+ { //no request pending for this skin info
+ mLoadingPhysicsShapes.insert(mesh_id);
+ mPendingPhysicsShapeRequests.push(mesh_id);
+ }
+ }
+ }
+
+}
+
+LLModel::Decomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh_id)
+{
+ LLModel::Decomposition* ret = NULL;
+
+ if (mesh_id.notNull())
+ {
+ decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
+ if (iter != mDecompositionMap.end())
+ {
+ ret = iter->second;
+ }
+
+ //decomposition block hasn't been fetched yet
+ if (!ret || ret->mBaseHullMesh.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::iterator iter = mLoadingDecompositions.find(mesh_id);
+ if (iter == mLoadingDecompositions.end())
+ { //no request pending for this skin info
+ mLoadingDecompositions.insert(mesh_id);
+ mPendingDecompositionRequests.push(mesh_id);
+ }
+ }
+ }
+
+ return ret;
+}
+
+void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail)
+{
+ LLVolume* volume = LLPrimitive::sVolumeManager->refVolume(params, detail);
+
+ if (!volume->mHullPoints)
+ {
+ //all default params
+ //execute first stage
+ //set simplify mode to retain
+ //set retain percentage to zero
+ //run second stage
+ }
+
+ LLPrimitive::sVolumeManager->unrefVolume(volume);
+}
+
+bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)
+{
+ LLSD mesh = mThread->getMeshHeader(mesh_id);
+ return mesh.has("physics_shape") && mesh["physics_shape"].has("size") && (mesh["physics_shape"]["size"].asInteger() > 0);
+}
+
+LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
+{
+ return mThread->getMeshHeader(mesh_id);
+}
+
+LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
+{
+ static LLSD dummy_ret;
+ if (mesh_id.notNull())
+ {
+ LLMutexLock lock(mHeaderMutex);
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
+ if (iter != mMeshHeader.end())
+ {
+ return iter->second;
+ }
+ }
+
+ return dummy_ret;
+}
+
+
+void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints)
+{
+ LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints);
+ mUploadWaitList.push_back(thread);
+}
+
+S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
+{
+ if (mThread)
+ {
+ LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
+ if (iter != mThread->mMeshHeader.end())
+ {
+ LLSD& header = iter->second;
+
+ if (header.has("404"))
+ {
+ return -1;
+ }
+
+ S32 size = header[header_lod[lod]]["size"].asInteger();
+ return size;
+ }
+
+ }
+
+ return -1;
+
+}
+
+void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
+{
+ if(isDiscarded())
+ {
+ return ;
+ }
+
+ //write model file to memory buffer
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ LLSD header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints,
+ true);
+
+ std::string desc = data.mBaseModel->mLabel;
+
+ // Grab the total vertex count of the model
+ // along with other information for the "asset_resources" map
+ // to send to the server.
+ LLSD asset_resources = LLSD::emptyMap();
+
+
+ std::string url = mNewInventoryCapability;
+
+ if (!url.empty())
+ {
+ LLSD body = generate_new_resource_upload_capability_body(
+ LLAssetType::AT_MESH,
+ desc,
+ desc,
+ LLFolderType::FT_MESH,
+ LLInventoryType::IT_MESH,
+ LLFloaterPerms::getNextOwnerPerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getEveryonePerms());
+
+ body["asset_resources"] = asset_resources;
+
+ mPendingConfirmations++;
+ LLCurlRequest::headers_t headers;
+
+ data.mPostData = body;
+
+ mCurlRequest->post(url, headers, body, new LLMeshCostResponder(data, this));
+ }
+}
+
+void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data)
+{
+ if(isDiscarded())
+ {
+ return ;
+ }
+
+ if (data.mTexture && data.mTexture->getDiscardLevel() >= 0)
+ {
+ LLSD asset_resources = LLSD::emptyMap();
+
+ std::string url = mNewInventoryCapability;
+
+ if (!url.empty())
+ {
+ LLSD body = generate_new_resource_upload_capability_body(
+ LLAssetType::AT_TEXTURE,
+ data.mLabel,
+ data.mLabel,
+ LLFolderType::FT_TEXTURE,
+ LLInventoryType::IT_TEXTURE,
+ LLFloaterPerms::getNextOwnerPerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getEveryonePerms());
+
+ body["asset_resources"] = asset_resources;
+
+ mPendingConfirmations++;
+ LLCurlRequest::headers_t headers;
+
+ data.mPostData = body;
+ mCurlRequest->post(url, headers, body, new LLTextureCostResponder(data, this));
+ }
+ }
+}
+
+
+void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data)
+{
+ if(isDiscarded())
+ {
+ return ;
+ }
+
+ if (!data.mRSVP.empty())
+ {
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
+
+ LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints);
+
+ data.mAssetData = ostr.str();
+
+ LLCurlRequest::headers_t headers;
+ mPendingUploads++;
+
+ mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLMeshUploadResponder(data, this));
+ }
+}
+
+void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data)
+{
+ if(isDiscarded())
+ {
+ return ;
+ }
+
+ if (!data.mRSVP.empty())
+ {
+ std::stringstream ostr;
+
+ if (!data.mTexture->isRawImageValid())
+ {
+ data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
+ }
+
+ LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
+
+ ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
+
+ data.mAssetData = ostr.str();
+
+ LLCurlRequest::headers_t headers;
+ mPendingUploads++;
+
+ mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLTextureUploadResponder(data, this));
+ }
+}
+
+
+void LLMeshUploadThread::onModelUploaded(LLMeshUploadData& data)
+{
+ createObjects(data);
+}
+
+void LLMeshUploadThread::onTextureUploaded(LLTextureUploadData& data)
+{
+ mTextureMap[data.mTexture] = data;
+}
+
+
+void LLMeshUploadThread::createObjects(LLMeshUploadData& data)
+{
+ instance_list& instances = mInstance[data.mBaseModel];
+
+ for (instance_list::iterator iter = instances.begin(); iter != instances.end(); ++iter)
+ { //create prims that reference given mesh
+ LLModelInstance& instance = *iter;
+ instance.mMeshID = data.mUUID;
+ mInstanceQ.push(instance);
+ }
+}
+
+void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
+ LLVector3& result_pos,
+ LLQuaternion& result_rot,
+ LLVector3& result_scale)
+{
+ // check for reflection
+ BOOL reflected = (transformation.determinant() < 0);
+
+ // compute position
+ LLVector3 position = LLVector3(0, 0, 0) * transformation;
+
+ // compute scale
+ LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
+ LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
+ LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
+ F32 x_length = x_transformed.normalize();
+ F32 y_length = y_transformed.normalize();
+ F32 z_length = z_transformed.normalize();
+ LLVector3 scale = LLVector3(x_length, y_length, z_length);
+
+ // adjust for "reflected" geometry
+ LLVector3 x_transformed_reflected = x_transformed;
+ if (reflected)
+ {
+ x_transformed_reflected *= -1.0;
+ }
+
+ // compute rotation
+ LLMatrix3 rotation_matrix;
+ rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
+ LLQuaternion quat_rotation = rotation_matrix.quaternion();
+ quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
+ LLVector3 euler_rotation;
+ quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
+
+ result_pos = position + mOrigin;
+ result_scale = scale;
+ result_rot = quat_rotation;
+}
+
+
+LLSD LLMeshUploadThread::createObject(LLModelInstance& instance)
+{
+ LLMatrix4 transformation = instance.mTransform;
+
+ llassert(instance.mMeshID.notNull());
+
+ // check for reflection
+ BOOL reflected = (transformation.determinant() < 0);
+
+ // compute position
+ LLVector3 position = LLVector3(0, 0, 0) * transformation;
+
+ // compute scale
+ LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
+ LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
+ LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
+ F32 x_length = x_transformed.normalize();
+ F32 y_length = y_transformed.normalize();
+ F32 z_length = z_transformed.normalize();
+ LLVector3 scale = LLVector3(x_length, y_length, z_length);
+
+ // adjust for "reflected" geometry
+ LLVector3 x_transformed_reflected = x_transformed;
+ if (reflected)
+ {
+ x_transformed_reflected *= -1.0;
+ }
+
+ // compute rotation
+ LLMatrix3 rotation_matrix;
+ rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
+ LLQuaternion quat_rotation = rotation_matrix.quaternion();
+ quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
+ LLVector3 euler_rotation;
+ quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
+
+ //
+ // build parameter block to construct this prim
+ //
+
+ LLSD object_params;
+
+ // create prim
+
+ // set volume params
+ U8 sculpt_type = LL_SCULPT_TYPE_MESH;
+ if (reflected)
+ {
+ sculpt_type |= LL_SCULPT_FLAG_MIRROR;
+ }
+ LLVolumeParams volume_params;
+ volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
+ volume_params.setBeginAndEndS( 0.f, 1.f );
+ volume_params.setBeginAndEndT( 0.f, 1.f );
+ volume_params.setRatio ( 1, 1 );
+ volume_params.setShear ( 0, 0 );
+ volume_params.setSculptID(instance.mMeshID, sculpt_type);
+ object_params["shape"] = volume_params.asLLSD();
+
+ object_params["material"] = LL_MCODE_WOOD;
+
+ object_params["group-id"] = gAgent.getGroupID();
+ object_params["pos"] = ll_sd_from_vector3(position + mOrigin);
+ object_params["rotation"] = ll_sd_from_quaternion(quat_rotation);
+ object_params["scale"] = ll_sd_from_vector3(scale);
+ object_params["name"] = instance.mLabel;
+
+ // load material from dae file
+ object_params["facelist"] = LLSD::emptyArray();
+ for (S32 i = 0; i < instance.mMaterial.size(); i++)
+ {
+ LLTextureEntry te;
+ LLImportMaterial& mat = instance.mMaterial[i];
+
+ te.setColor(mat.mDiffuseColor);
+
+ LLUUID diffuse_id = mTextureMap[mat.mDiffuseMap].mUUID;
+
+ if (diffuse_id.notNull())
+ {
+ te.setID(diffuse_id);
+ }
+ else
+ {
+ te.setID(LLUUID("5748decc-f629-461c-9a36-a35a221fe21f")); // blank texture
+ }
+
+ te.setFullbright(mat.mFullbright);
+
+ object_params["facelist"][i] = te.asLLSD();
+ }
+
+ // set extra parameters
+ LLSculptParams sculpt_params;
+ sculpt_params.setSculptTexture(instance.mMeshID);
+ sculpt_params.setSculptType(sculpt_type);
+ U8 buffer[MAX_OBJECT_PARAMS_SIZE+1];
+ LLDataPackerBinaryBuffer dp(buffer, MAX_OBJECT_PARAMS_SIZE);
+ sculpt_params.pack(dp);
+ std::vector<U8> v(dp.getCurrentSize());
+ memcpy(&v[0], buffer, dp.getCurrentSize());
+ LLSD extra_parameter;
+ extra_parameter["extra_parameter"] = sculpt_params.mType;
+ extra_parameter["param_data"] = v;
+ object_params["extra_parameters"].append(extra_parameter);
+
+ LLPermissions perm;
+ perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
+ perm.setCreator(gAgent.getID());
+
+ perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
+ PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
+ LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getNextOwnerPerms());
+
+ object_params["permissions"] = ll_create_sd_from_permissions(perm);
+
+ object_params["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+
+ return object_params;
+}
+
+void LLMeshUploadThread::priceResult(LLMeshUploadData& data, const LLSD& content)
+{
+ mPendingCost += content["upload_price"].asInteger();
+ data.mRSVP = content["rsvp"].asString();
+
+ mConfirmedQ.push(data);
+}
+
+void LLMeshUploadThread::priceResult(LLTextureUploadData& data, const LLSD& content)
+{
+ mPendingCost += content["upload_price"].asInteger();
+ data.mRSVP = content["rsvp"].asString();
+
+ mConfirmedTextureQ.push(data);
+}
+
+
+bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
+{
+ if (mDiffuseMap != rhs.mDiffuseMap)
+ {
+ return mDiffuseMap < rhs.mDiffuseMap;
+ }
+
+ if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
+ {
+ return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
+ }
+
+ if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
+ {
+ return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
+ }
+
+ if (mDiffuseColor != rhs.mDiffuseColor)
+ {
+ return mDiffuseColor < rhs.mDiffuseColor;
+ }
+
+ return mFullbright < rhs.mFullbright;
+}
+
+
+void LLMeshRepository::updateInventory(inventory_data data)
+{
+ LLMutexLock lock(mMeshMutex);
+ dumpLLSDToFile(data.mPostData,"update_inventory_post_data.xml");
+ dumpLLSDToFile(data.mResponse,"update_inventory_response.xml");
+ mInventoryQ.push(data);
+}
+
+void LLMeshRepository::uploadError(LLSD& args)
+{
+ LLMutexLock lock(mMeshMutex);
+ mUploadErrorQ.push(args);
+}
+
+//static
+F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod)
+{
+ F32 dlowest = llmin(radius/0.03f, 256.f);
+ F32 dlow = llmin(radius/0.06f, 256.f);
+ F32 dmid = llmin(radius/0.24f, 256.f);
+
+ F32 bytes_lowest = header["lowest_lod"]["size"].asReal()/1024.f;
+ F32 bytes_low = header["low_lod"]["size"].asReal()/1024.f;
+ F32 bytes_mid = header["medium_lod"]["size"].asReal()/1024.f;
+ F32 bytes_high = header["high_lod"]["size"].asReal()/1024.f;
+
+ if (bytes)
+ {
+ *bytes = 0;
+ *bytes += header["lowest_lod"]["size"].asInteger();
+ *bytes += header["low_lod"]["size"].asInteger();
+ *bytes += header["medium_lod"]["size"].asInteger();
+ *bytes += header["high_lod"]["size"].asInteger();
+ }
+
+
+ if (bytes_visible)
+ {
+ lod = LLMeshRepository::getActualMeshLOD(header, lod);
+ if (lod >= 0 && lod <= 3)
+ {
+ *bytes_visible = header[header_lod[lod]]["size"].asInteger();
+ }
+ }
+
+ if (bytes_high == 0.f)
+ {
+ return 0.f;
+ }
+
+ if (bytes_mid == 0.f)
+ {
+ bytes_mid = bytes_high;
+ }
+
+ if (bytes_low == 0.f)
+ {
+ bytes_low = bytes_mid;
+ }
+
+ if (bytes_lowest == 0.f)
+ {
+ bytes_lowest = bytes_low;
+ }
+
+ F32 max_area = 65536.f;
+ F32 min_area = 1.f;
+
+ F32 high_area = llmin(F_PI*dmid*dmid, max_area);
+ F32 mid_area = llmin(F_PI*dlow*dlow, max_area);
+ F32 low_area = llmin(F_PI*dlowest*dlowest, max_area);
+ F32 lowest_area = max_area;
+
+ lowest_area -= low_area;
+ low_area -= mid_area;
+ mid_area -= high_area;
+
+ high_area = llclamp(high_area, min_area, max_area);
+ mid_area = llclamp(mid_area, min_area, max_area);
+ low_area = llclamp(low_area, min_area, max_area);
+ lowest_area = llclamp(lowest_area, min_area, max_area);
+
+ F32 total_area = high_area + mid_area + low_area + lowest_area;
+ high_area /= total_area;
+ mid_area /= total_area;
+ low_area /= total_area;
+ lowest_area /= total_area;
+
+ F32 weighted_avg = bytes_high*high_area +
+ bytes_mid*mid_area +
+ bytes_low*low_area +
+ bytes_lowest*lowest_area;
+
+ return weighted_avg * gSavedSettings.getF32("MeshStreamingCostScaler");
+}
+
+
+LLPhysicsDecomp::LLPhysicsDecomp()
+: LLThread("Physics Decomp")
+{
+ mInited = false;
+ mQuitting = false;
+ mDone = false;
+
+ mSignal = new LLCondition(NULL);
+ mMutex = new LLMutex(NULL);
+}
+
+LLPhysicsDecomp::~LLPhysicsDecomp()
+{
+ shutdown();
+
+ delete mSignal;
+ mSignal = NULL;
+ delete mMutex;
+ mMutex = NULL;
+}
+
+void LLPhysicsDecomp::shutdown()
+{
+ if (mSignal)
+ {
+ mQuitting = true;
+ mSignal->signal();
+
+ while (!isStopped())
+ {
+ apr_sleep(10);
+ }
+ }
+}
+
+void LLPhysicsDecomp::submitRequest(LLPhysicsDecomp::Request* request)
+{
+ LLMutexLock lock(mMutex);
+ mRequestQ.push(request);
+ mSignal->signal();
+}
+
+//static
+S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2)
+{
+ if (gMeshRepo.mDecompThread && gMeshRepo.mDecompThread->mCurRequest.notNull())
+ {
+ return gMeshRepo.mDecompThread->mCurRequest->statusCallback(status, p1, p2);
+ }
+
+ return 1;
+}
+
+void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh)
+{
+ mesh.mVertexBase = mCurRequest->mPositions[0].mV;
+ mesh.mVertexStrideBytes = 12;
+ mesh.mNumVertices = mCurRequest->mPositions.size();
+
+ mesh.mIndexType = LLCDMeshData::INT_16;
+ mesh.mIndexBase = &(mCurRequest->mIndices[0]);
+ mesh.mIndexStrideBytes = 6;
+
+ mesh.mNumTriangles = mCurRequest->mIndices.size()/3;
+
+ LLCDResult ret = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh);
+ }
+
+ if (ret)
+ {
+ llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl;
+ }
+}
+
+void LLPhysicsDecomp::doDecomposition()
+{
+ LLCDMeshData mesh;
+ S32 stage = mStageID[mCurRequest->mStage];
+
+ if (LLConvexDecomposition::getInstance() == NULL)
+ {
+ // stub library. do nothing.
+ return;
+ }
+
+ //load data intoLLCD
+ if (stage == 0)
+ {
+ setMeshData(mesh);
+ }
+
+ //build parameter map
+ std::map<std::string, const LLCDParam*> param_map;
+
+ static const LLCDParam* params = NULL;
+ static S32 param_count = 0;
+ if (!params)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
+ }
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ param_map[params[i].mName] = params+i;
+ }
+
+ //set parameter values
+ for (decomp_params::iterator iter = mCurRequest->mParams.begin(); iter != mCurRequest->mParams.end(); ++iter)
+ {
+ const std::string& name = iter->first;
+ const LLSD& value = iter->second;
+
+ const LLCDParam* param = param_map[name];
+
+ if (param == NULL)
+ { //couldn't find valid parameter
+ continue;
+ }
+
+ U32 ret = LLCD_OK;
+
+ if (param->mType == LLCDParam::LLCD_FLOAT)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, (F32) value.asReal());
+ }
+ else if (param->mType == LLCDParam::LLCD_INTEGER ||
+ param->mType == LLCDParam::LLCD_ENUM)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asInteger());
+ }
+ else if (param->mType == LLCDParam::LLCD_BOOLEAN)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asBoolean());
+ }
+ }
+
+ mCurRequest->setStatusMessage("Executing.");
+
+ LLCDResult ret = LLCD_OK;
+
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ ret = LLConvexDecomposition::getInstance()->executeStage(stage);
+ }
+
+ if (ret)
+ {
+ llwarns << "Convex Decomposition thread valid but could not execute stage " << stage << llendl;
+ LLMutexLock lock(mMutex);
+
+ mCurRequest->mHull.clear();
+ mCurRequest->mHullMesh.clear();
+
+ mCurRequest->setStatusMessage("FAIL");
+
+ completeCurrent();
+ }
+ else
+ {
+ mCurRequest->setStatusMessage("Reading results");
+
+ S32 num_hulls =0;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(stage);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(num_hulls);
+
+ mCurRequest->mHullMesh.clear();
+ mCurRequest->mHullMesh.resize(num_hulls);
+ mMutex->unlock();
+
+ for (S32 i = 0; i < num_hulls; ++i)
+ {
+ std::vector<LLVector3> p;
+ LLCDHull hull;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getHullFromStage(stage, i, &hull);
+
+ const F32* v = hull.mVertexBase;
+
+ for (S32 j = 0; j < hull.mNumVertices; ++j)
+ {
+ LLVector3 vert(v[0], v[1], v[2]);
+ p.push_back(vert);
+ v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
+ }
+
+ LLCDMeshData mesh;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getMeshFromStage(stage, i, &mesh);
+
+ get_vertex_buffer_from_mesh(mesh, mCurRequest->mHullMesh[i]);
+
+ mMutex->lock();
+ mCurRequest->mHull[i] = p;
+ mMutex->unlock();
+ }
+
+ {
+ LLMutexLock lock(mMutex);
+
+ mCurRequest->setStatusMessage("FAIL");
+ completeCurrent();
+ }
+ }
+}
+
+void LLPhysicsDecomp::completeCurrent()
+{
+ LLMutexLock lock(mMutex);
+ mCompletedQ.push(mCurRequest);
+ mCurRequest = NULL;
+}
+
+void LLPhysicsDecomp::notifyCompleted()
+{
+ if (!mCompletedQ.empty())
+ {
+ LLMutexLock lock(mMutex);
+ while (!mCompletedQ.empty())
+ {
+ Request* req = mCompletedQ.front();
+ req->completed();
+ mCompletedQ.pop();
+ }
+ }
+}
+
+
+void make_box(LLPhysicsDecomp::Request * request)
+{
+ LLVector3 min,max;
+ min = request->mPositions[0];
+ max = min;
+
+ for (U32 i = 0; i < request->mPositions.size(); ++i)
+ {
+ update_min_max(min, max, request->mPositions[i]);
+ }
+
+ request->mHull.clear();
+
+ LLModel::hull box;
+ box.push_back(LLVector3(min[0],min[1],min[2]));
+ box.push_back(LLVector3(max[0],min[1],min[2]));
+ box.push_back(LLVector3(min[0],max[1],min[2]));
+ box.push_back(LLVector3(max[0],max[1],min[2]));
+ box.push_back(LLVector3(min[0],min[1],max[2]));
+ box.push_back(LLVector3(max[0],min[1],max[2]));
+ box.push_back(LLVector3(min[0],max[1],max[2]));
+ box.push_back(LLVector3(max[0],max[1],max[2]));
+
+ request->mHull.push_back(box);
+}
+
+
+void LLPhysicsDecomp::doDecompositionSingleHull()
+{
+ LLCDMeshData mesh;
+
+ setMeshData(mesh);
+
+
+ //set all parameters to default
+ std::map<std::string, const LLCDParam*> param_map;
+
+ static const LLCDParam* params = NULL;
+ static S32 param_count = 0;
+
+ if (!params)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
+ }
+
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+
+ if (decomp == NULL)
+ {
+ //stub. do nothing.
+ return;
+ }
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ decomp->setParam(params[i].mName, params[i].mDefault.mIntOrEnumValue);
+ }
+
+ const S32 STAGE_DECOMPOSE = mStageID["Decompose"];
+ const S32 STAGE_SIMPLIFY = mStageID["Simplify"];
+ const S32 DECOMP_PREVIEW = 0;
+ const S32 SIMPLIFY_RETAIN = 0;
+
+ decomp->setParam("Decompose Quality", DECOMP_PREVIEW);
+ decomp->setParam("Simplify Method", SIMPLIFY_RETAIN);
+ decomp->setParam("Retain%", 0.f);
+
+ LLCDResult ret = LLCD_OK;
+ ret = decomp->executeStage(STAGE_DECOMPOSE);
+
+ if (ret)
+ {
+ llwarns << "Could not execute decomposition stage when attempting to create single hull." << llendl;
+ make_box(mCurRequest);
+ }
+ else
+ {
+ ret = decomp->executeStage(STAGE_SIMPLIFY);
+
+ if (ret)
+ {
+ llwarns << "Could not execute simiplification stage when attempting to create single hull." << llendl;
+ make_box(mCurRequest);
+ }
+ else
+ {
+ S32 num_hulls =0;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(STAGE_SIMPLIFY);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(num_hulls);
+ mCurRequest->mHullMesh.clear();
+ mMutex->unlock();
+
+ for (S32 i = 0; i < num_hulls; ++i)
+ {
+ std::vector<LLVector3> p;
+ LLCDHull hull;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getHullFromStage(STAGE_SIMPLIFY, i, &hull);
+
+ const F32* v = hull.mVertexBase;
+
+ for (S32 j = 0; j < hull.mNumVertices; ++j)
+ {
+ LLVector3 vert(v[0], v[1], v[2]);
+ p.push_back(vert);
+ v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull[i] = p;
+ mMutex->unlock();
+ }
+ }
+ }
+
+
+ {
+ completeCurrent();
+
+ }
+}
+
+
+void LLPhysicsDecomp::run()
+{
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+ if (decomp == NULL)
+ {
+ // stub library. Set init to true so the main thread
+ // doesn't wait for this to finish.
+ mInited = true;
+ return;
+ }
+
+ decomp->initThread();
+ mInited = true;
+
+ static const LLCDStageData* stages = NULL;
+ static S32 num_stages = 0;
+
+ if (!stages)
+ {
+ num_stages = decomp->getStages(&stages);
+ }
+
+ for (S32 i = 0; i < num_stages; i++)
+ {
+ mStageID[stages[i].mName] = i;
+ }
+
+ while (!mQuitting)
+ {
+ mSignal->wait();
+ while (!mQuitting && !mRequestQ.empty())
+ {
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest = mRequestQ.front();
+ mRequestQ.pop();
+ }
+
+ S32& id = *(mCurRequest->mDecompID);
+ if (id == -1)
+ {
+ decomp->genDecomposition(id);
+ }
+ decomp->bindDecomposition(id);
+
+ if (mCurRequest->mStage == "single_hull")
+ {
+ doDecompositionSingleHull();
+ }
+ else
+ {
+ doDecomposition();
+ }
+ }
+ }
+
+ decomp->quitThread();
+
+ if (mSignal->isLocked())
+ { //let go of mSignal's associated mutex
+ mSignal->unlock();
+ }
+
+ mDone = true;
+}
+
+void LLPhysicsDecomp::Request::updateTriangleAreaThreshold()
+{
+ F32 range = mBBox[1].mV[0] - mBBox[0].mV[0] ;
+ range = llmin(range, mBBox[1].mV[1] - mBBox[0].mV[1]) ;
+ range = llmin(range, mBBox[1].mV[2] - mBBox[0].mV[2]) ;
+
+ mTriangleAreaThreshold = llmin(0.0002f, range * 0.000002f) ;
+}
+
+//check if the triangle area is large enough to qualify for a valid triangle
+bool LLPhysicsDecomp::Request::isValidTriangle(U16 idx1, U16 idx2, U16 idx3)
+{
+ LLVector3 a = mPositions[idx2] - mPositions[idx1] ;
+ LLVector3 b = mPositions[idx3] - mPositions[idx1] ;
+ F32 c = a * b ;
+
+ return ((a*a) * (b*b) - c * c) > mTriangleAreaThreshold ;
+}
+
+void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
+{
+ mStatusMessage = msg;
+}
+
+LLModelInstance::LLModelInstance(LLSD& data)
+{
+ mLocalMeshID = data["mesh_id"].asInteger();
+ mLabel = data["label"].asString();
+ mTransform.setValue(data["transform"]);
+
+ for (U32 i = 0; i < data["material"].size(); ++i)
+ {
+ mMaterial.push_back(LLImportMaterial(data["material"][i]));
+ }
+}
+
+
+LLSD LLModelInstance::asLLSD()
+{
+ LLSD ret;
+
+ ret["mesh_id"] = mModel->mLocalID;
+ ret["label"] = mLabel;
+ ret["transform"] = mTransform.getValue();
+
+ for (U32 i = 0; i < mMaterial.size(); ++i)
+ {
+ ret["material"][i] = mMaterial[i].asLLSD();
+ }
+
+ return ret;
+}
+
+LLImportMaterial::LLImportMaterial(LLSD& data)
+{
+ mDiffuseMapFilename = data["diffuse"]["filename"].asString();
+ mDiffuseMapLabel = data["diffuse"]["label"].asString();
+ mDiffuseColor.setValue(data["diffuse"]["color"]);
+ mFullbright = data["fullbright"].asBoolean();
+}
+
+
+LLSD LLImportMaterial::asLLSD()
+{
+ LLSD ret;
+
+ ret["diffuse"]["filename"] = mDiffuseMapFilename;
+ ret["diffuse"]["label"] = mDiffuseMapLabel;
+ ret["diffuse"]["color"] = mDiffuseColor.getValue();
+ ret["fullbright"] = mFullbright;
+
+ return ret;
+}
+
+void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
+{
+ decomp.mMesh.resize(decomp.mHull.size());
+
+ for (U32 i = 0; i < decomp.mHull.size(); ++i)
+ {
+ LLCDHull hull;
+ hull.mNumVertices = decomp.mHull[i].size();
+ hull.mVertexBase = decomp.mHull[i][0].mV;
+ hull.mVertexStrideBytes = 12;
+
+ LLCDMeshData mesh;
+ LLCDResult res = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+ }
+ if (res == LLCD_OK)
+ {
+ get_vertex_buffer_from_mesh(mesh, decomp.mMesh[i]);
+ }
+ }
+
+ if (!decomp.mBaseHull.empty() && decomp.mBaseHullMesh.empty())
+ { //get mesh for base hull
+ LLCDHull hull;
+ hull.mNumVertices = decomp.mBaseHull.size();
+ hull.mVertexBase = decomp.mBaseHull[0].mV;
+ hull.mVertexStrideBytes = 12;
+
+ LLCDMeshData mesh;
+ LLCDResult res = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+ }
+ if (res == LLCD_OK)
+ {
+ get_vertex_buffer_from_mesh(mesh, decomp.mBaseHullMesh);
+ }
+ }
+}
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 0a6954bade..9b80fc02b3 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -475,7 +475,7 @@ public:
static S32 getActualMeshLOD(LLSD& header, S32 lod);
U32 calcResourceCost(LLSD& header);
U32 getResourceCost(const LLUUID& mesh_params);
- const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id);
+ const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj);
LLModel::Decomposition* getDecomposition(const LLUUID& mesh_id);
void fetchPhysicsShape(const LLUUID& mesh_id);
bool hasPhysicsShape(const LLUUID& mesh_id);
@@ -504,7 +504,8 @@ public:
std::vector<LLMeshRepoThread::LODRequest> mPendingRequests;
//list of mesh ids awaiting skin info
- std::set<LLUUID> mLoadingSkins;
+ typedef std::map<LLUUID, std::set<LLUUID> > skin_load_map;
+ skin_load_map mLoadingSkins;
//list of mesh ids that need to send skin info fetch requests
std::queue<LLUUID> mPendingSkinRequests;
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 34a92cd0ac..52917ff20b 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -1740,25 +1740,11 @@ void LLPanelObject::refresh()
mRootObject = NULL;
}
- bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
- gAgent.getRegion() &&
- !gAgent.getRegion()->getCapability("GetMesh").empty();
-
F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject));
getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale);
getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale);
getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale);
-
- BOOL found = mCtrlSculptType->itemExists("Mesh");
- if (enable_mesh && !found)
- {
- mCtrlSculptType->add("Mesh");
- }
- else if (!enable_mesh && found)
- {
- mCtrlSculptType->remove("Mesh");
- }
}
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index fa329eb0ae..7f91f9a952 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -69,6 +69,7 @@ U32 LLSpatialGroup::sNodeCount = 0;
std::set<GLuint> LLSpatialGroup::sPendingQueries;
+U32 gOctreeMaxCapacity;
BOOL LLSpatialGroup::sNoDelete = FALSE;
@@ -630,7 +631,7 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
if (mOctreeNode->isInside(drawablep->getPositionGroup()) &&
(mOctreeNode->contains(drawablep) ||
(drawablep->getBinRadius() > mOctreeNode->getSize()[0] &&
- parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY)))
+ parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{
unbound();
setState(OBJECT_DIRTY);
@@ -689,17 +690,8 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
{
- /*if (!gPipeline.hasRenderType(mDrawableType))
- {
- return;
- }*/
-
if (group->isDead() || !group->isState(LLSpatialGroup::GEOM_DIRTY))
{
- /*if (!group->isState(LLSpatialGroup::GEOM_DIRTY) && mRenderByGroup)
- {
- llerrs << "WTF?" << llendl;
- }*/
return;
}
@@ -961,21 +953,15 @@ void LLSpatialGroup::setState(U32 state)
{
mState |= state;
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
}
void LLSpatialGroup::setState(U32 state, S32 mode)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
-
+ llassert(state <= LLSpatialGroup::STATE_MASK);
+
if (mode > STATE_MODE_SINGLE)
{
if (mode == STATE_MODE_DIFF)
@@ -1021,20 +1007,14 @@ public:
void LLSpatialGroup::clearState(U32 state)
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
mState &= ~state;
}
void LLSpatialGroup::clearState(U32 state, S32 mode)
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -1059,10 +1039,7 @@ void LLSpatialGroup::clearState(U32 state, S32 mode)
BOOL LLSpatialGroup::isState(U32 state) const
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
return mState & state ? TRUE : FALSE;
}
@@ -1250,7 +1227,8 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
{
if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
- llerrs << "WTF?" << llendl;
+ llwarns << "Attempted to update distance for camera other than world camera!" << llendl;
+ return;
}
#if !LL_RELEASE_FOR_DOWNLOAD
@@ -2064,11 +2042,8 @@ public:
virtual void processGroup(LLSpatialGroup* group)
{
- if (group->isState(LLSpatialGroup::DIRTY) || group->getData().empty())
- {
- llerrs << "WTF?" << llendl;
- }
-
+ llassert(!group->isState(LLSpatialGroup::DIRTY) && !group->getData().empty())
+
if (mRes < 2)
{
if (mCamera->AABBInFrustum(group->mObjectBounds[0], group->mObjectBounds[1]) > 0)
@@ -2541,7 +2516,7 @@ void renderOctree(LLSpatialGroup* group)
//coded by buffer usage and activity
gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
LLVector4 col;
- if (group->mBuilt > 0.f)
+ /*if (group->mBuilt > 0.f)
{
group->mBuilt -= 2.f * gFrameIntervalSeconds;
if (group->mBufferUsage == GL_STATIC_DRAW_ARB)
@@ -2610,7 +2585,7 @@ void renderOctree(LLSpatialGroup* group)
gGL.color4f(1,1,1,1);
}
}
- else
+ else*/
{
if (group->mBufferUsage == GL_STATIC_DRAW_ARB && !group->getData().empty()
&& group->mSpatialPartition->mRenderByGroup)
@@ -2630,33 +2605,24 @@ void renderOctree(LLSpatialGroup* group)
size.mul(1.01f);
size.add(fudge);
- {
- LLGLDepthTest depth(GL_TRUE, GL_FALSE);
- drawBox(group->mObjectBounds[0], fudge);
- }
+ //{
+ // LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ // drawBox(group->mObjectBounds[0], fudge);
+ //}
gGL.setSceneBlendType(LLRender::BT_ALPHA);
- if (group->mBuilt <= 0.f)
+ //if (group->mBuilt <= 0.f)
{
//draw opaque outline
- gGL.color4f(col.mV[0], col.mV[1], col.mV[2], 1.f);
- drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
+ //gGL.color4f(col.mV[0], col.mV[1], col.mV[2], 1.f);
+ //drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
- if (group->mOctreeNode->isLeaf())
- {
- gGL.color4f(1,1,1,1);
- }
- else
- {
- gGL.color4f(0,1,1,1);
- }
-
+ gGL.color4f(0,1,1,1);
drawBoxOutline(group->mBounds[0],group->mBounds[1]);
-
-
+
//draw bounding box for draw info
- if (group->mSpatialPartition->mRenderByGroup)
+ /*if (group->mSpatialPartition->mRenderByGroup)
{
gGL.color4f(1.0f, 0.75f, 0.25f, 0.6f);
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
@@ -2673,7 +2639,7 @@ void renderOctree(LLSpatialGroup* group)
drawBoxOutline(center, size);
}
}
- }
+ }*/
}
// LLSpatialGroup::OctreeNode* node = group->mOctreeNode;
@@ -2716,7 +2682,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
gGL.color4f(0.f, 0.75f, 0.f, 0.5f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
- else if (camera && group->mOcclusionVerts.notNull())
+ /*else if (camera && group->mOcclusionVerts.notNull())
{
LLVertexBuffer::unbind();
group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
@@ -2728,7 +2694,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
glColor4f(1.0f, 1.f, 1.f, 1.0f);
group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- }
+ }*/
}
}
@@ -3473,6 +3439,8 @@ void renderTextureAnim(LLDrawInfo* params)
void renderBatchSize(LLDrawInfo* params)
{
+ LLGLEnable offset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.f, 1.f);
glColor3ubv((GLubyte*) &(params->mDebugColor));
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
@@ -3910,6 +3878,28 @@ public:
renderAgentTarget(avatar);
}
+ if (gDebugGL)
+ {
+ for (U32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* facep = drawable->getFace(i);
+ U8 index = facep->getTextureIndex();
+ if (facep->mDrawInfo)
+ {
+ if (index < 255)
+ {
+ if (facep->mDrawInfo->mTextureList.size() <= index)
+ {
+ llerrs << "Face texture index out of bounds." << llendl;
+ }
+ else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture())
+ {
+ llerrs << "Face texture index incorrect." << llendl;
+ }
+ }
+ }
+ }
+ }
}
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 0d9cad914a..db8a0c2992 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -91,6 +91,8 @@ public:
LLPointer<LLVertexBuffer> mVertexBuffer;
LLPointer<LLViewerTexture> mTexture;
+ std::vector<LLPointer<LLViewerTexture> > mTextureList;
+
LLColor4U mGlowColor;
S32 mDebugColor;
const LLMatrix4* mTextureMatrix;
@@ -207,7 +209,7 @@ public:
typedef std::vector<LLPointer<LLDrawInfo> > drawmap_elem_t;
typedef std::map<U32, drawmap_elem_t > draw_map_t;
typedef std::vector<LLPointer<LLVertexBuffer> > buffer_list_t;
- typedef std::map<LLPointer<LLViewerTexture>, buffer_list_t> buffer_texture_map_t;
+ typedef std::map<LLFace*, buffer_list_t> buffer_texture_map_t;
typedef std::map<U32, buffer_texture_map_t> buffer_map_t;
typedef LLOctreeListener<LLDrawable> BaseType;
@@ -399,7 +401,7 @@ protected:
public:
bridge_list_t mBridgeList;
- buffer_map_t mBufferMap; //used by volume buffers to store unique buffers per texture
+ buffer_map_t mBufferMap; //used by volume buffers to attempt to reuse vertex buffers
F32 mBuilt;
OctreeNode* mOctreeNode;
@@ -684,7 +686,7 @@ class LLVolumeGeometryManager: public LLGeometryManager
virtual void rebuildGeom(LLSpatialGroup* group);
virtual void rebuildMesh(LLSpatialGroup* group);
virtual void getGeometry(LLSpatialGroup* group);
- void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE);
+ void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE);
void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type);
};
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 379bbe614d..87ca80260f 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -57,6 +57,7 @@
#include "llworld.h"
#include "pipeline.h"
#include "llviewerjoystick.h"
+#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llparcel.h"
#include "llkeyboard.h"
@@ -183,6 +184,21 @@ static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
return true;
}
+static bool handleFSAASamplesChanged(const LLSD& newvalue)
+{
+ if (gPipeline.isInit())
+ {
+ gPipeline.releaseGLBuffers();
+ gPipeline.createGLBuffers();
+
+ if (LLPipeline::sRenderDeferred)
+ {
+ LLViewerShaderMgr::instance()->setShaders();
+ }
+ }
+ return true;
+}
+
static bool handleAnisotropicChanged(const LLSD& newvalue)
{
LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean();
@@ -357,6 +373,16 @@ static bool handleResetVertexBuffersChanged(const LLSD&)
return true;
}
+static bool handleRepartition(const LLSD&)
+{
+ if (gPipeline.isInit())
+ {
+ gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
+ gObjectList.repartitionObjects();
+ }
+ return true;
+}
+
static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
{
LLPipeline::sDynamicLOD = newvalue.asBoolean();
@@ -560,6 +586,12 @@ void settings_setup_listeners()
gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _2));
gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _2));
gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _2));
+ gSavedSettings.getControl("OctreeStaticObjectSizeFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeDistanceFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeMaxNodeCapacity")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeAlphaDistanceFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeAttachmentSizeFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("RenderMaxTextureIndex")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderUseTriStrips")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
@@ -568,7 +600,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderSpecularResX")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderSpecularResY")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderSpecularExponent")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
- gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
+ gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleFSAASamplesChanged, _2));
gSavedSettings.getControl("RenderAnisotropic")->getSignal()->connect(boost::bind(&handleAnisotropicChanged, _2));
gSavedSettings.getControl("RenderShadowResolutionScale")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index e41773d273..5dadd2c33b 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -582,6 +582,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLMemType mt_ug(LLMemType::MTYPE_DISPLAY_UPDATE_GEOM);
const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds; // 50 ms/second update time
gPipeline.createObjects(max_geom_update_time);
+ gPipeline.processPartitionQ();
gPipeline.updateGeom(max_geom_update_time);
stop_glerror();
}
@@ -836,7 +837,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.mDeferredScreen.bindTarget();
- glClearColor(0,0,0,0);
+ glClearColor(1,0,1,1);
gPipeline.mDeferredScreen.clear();
}
else
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 86b56df556..fdd1199b78 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5376,10 +5376,10 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
{
// notification was specified using the new mechanism, so we can just handle it here
std::string notificationID;
- msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
- if (!LLNotifications::getInstance()->templateExists(notificationID))
- {
- return false;
+ msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
+ if (!LLNotifications::getInstance()->templateExists(notificationID))
+ {
+ return false;
}
std::string llsdRaw;
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index e7878d8adf..72cdb4b355 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -1894,7 +1894,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
//
//
- // WTF? If we're going to skip this message, why are we
+ // If we're going to skip this message, why are we
// doing all the parenting, etc above?
U32 packet_id = mesgsys->getCurrentRecvPacketID();
if (packet_id < mLatestRecvPacketID &&
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 007b3416f1..45c6777ae8 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1418,12 +1418,12 @@ void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id)
mPendingObjectCost.erase(object_id);
}
-void LLViewerObjectList::updateQuotaCost( const LLUUID& objectId, const SelectionQuota& quota )
+void LLViewerObjectList::updateQuota( const LLUUID& objectId, const SelectionQuota& quota )
{
LLViewerObject* pVO = findObject( objectId );
if ( pVO )
{
- //pVO->updateQuota( quota );
+ pVO->updateQuota( quota );
}
}
@@ -1497,6 +1497,24 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
LLWorld::getInstance()->shiftRegions(offset);
}
+void LLViewerObjectList::repartitionObjects()
+{
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
+ {
+ LLViewerObject* objectp = *iter;
+ if (!objectp->isDead())
+ {
+ LLDrawable* drawable = objectp->mDrawable;
+ if (drawable && !drawable->isDead())
+ {
+ drawable->updateBinRadius();
+ drawable->updateSpatialExtents();
+ drawable->movePartition();
+ }
+ }
+ }
+}
+
//debug code
bool LLViewerObjectList::hasMapObjectInRegion(LLViewerRegion* regionp)
{
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 8e211eaf73..9d1b5cb56f 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -102,9 +102,10 @@ public:
F32 restitution,
F32 gravity_multiplier);
- void updateQuotaCost( const LLUUID& objectId, const SelectionQuota& costs );
+ void updateQuota( const LLUUID& objectId, const SelectionQuota& costs );
void shiftObjects(const LLVector3 &offset);
+ void repartitionObjects();
bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 5ae4e872f3..8db72da1ee 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -2202,9 +2202,9 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
= parcelOwner == (forGroup ? gAgent.getGroupID() : gAgent.getID());
bool isAuthorized
- = (authorizeBuyer.isNull()
- || (gAgent.getID() == authorizeBuyer)
- || (gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_DEED)
+ = (authorizeBuyer.isNull()
+ || (gAgent.getID() == authorizeBuyer)
+ || (gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_DEED)
&& gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_SET_SALE_INFO)));
return isForSale && !isOwner && isAuthorized && isEmpowered;
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 45c9b3e91f..faa86d43dd 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -118,8 +118,8 @@
// Library includes from llvfs
#include "lldir.h"
-
-// Library includes from llmessage project
+
+// Library includes from llmessage project
#include "llcachename.h"
#endif
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index fb608b3a4f..c4ca5d37ce 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1480,6 +1480,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
LLSD capabilityNames = LLSD::emptyArray();
+ capabilityNames.append("AccountingParcel");
+ capabilityNames.append("AccountingSelection");
capabilityNames.append("AttachmentResources");
capabilityNames.append("AvatarPickerSearch");
capabilityNames.append("ChatSessionRequest");
@@ -1546,9 +1548,6 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("ViewerMetrics");
capabilityNames.append("ViewerStartAuction");
capabilityNames.append("ViewerStats");
- //prep# Finalize these!!!!!!!!!
- capabilityNames.append("AccountingParcel");
- capabilityNames.append("AccountingSelection");
// Please add new capabilities alphabetically to reduce
// merge conflicts.
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 3e85802ba6..a1cb6d4ea6 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -66,12 +66,20 @@ LLGLSLShader gObjectSimpleProgram;
LLGLSLShader gObjectSimpleWaterProgram;
LLGLSLShader gObjectFullbrightProgram;
LLGLSLShader gObjectFullbrightWaterProgram;
-
LLGLSLShader gObjectFullbrightShinyProgram;
LLGLSLShader gObjectFullbrightShinyWaterProgram;
LLGLSLShader gObjectShinyProgram;
LLGLSLShader gObjectShinyWaterProgram;
+LLGLSLShader gObjectSimpleNonIndexedProgram;
+LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
+LLGLSLShader gObjectFullbrightNonIndexedProgram;
+LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
+LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
+LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
+LLGLSLShader gObjectShinyNonIndexedProgram;
+LLGLSLShader gObjectShinyNonIndexedWaterProgram;
+
//object hardware skinning shaders
LLGLSLShader gSkinnedObjectSimpleProgram;
LLGLSLShader gSkinnedObjectFullbrightProgram;
@@ -113,6 +121,7 @@ LLGLSLShader gDeferredImpostorProgram;
LLGLSLShader gDeferredEdgeProgram;
LLGLSLShader gDeferredWaterProgram;
LLGLSLShader gDeferredDiffuseProgram;
+LLGLSLShader gDeferredNonIndexedDiffuseProgram;
LLGLSLShader gDeferredSkinnedDiffuseProgram;
LLGLSLShader gDeferredSkinnedBumpProgram;
LLGLSLShader gDeferredSkinnedAlphaProgram;
@@ -132,13 +141,16 @@ LLGLSLShader gDeferredShadowProgram;
LLGLSLShader gDeferredAvatarShadowProgram;
LLGLSLShader gDeferredAttachmentShadowProgram;
LLGLSLShader gDeferredAlphaProgram;
+LLGLSLShader gDeferredAvatarEyesProgram;
LLGLSLShader gDeferredFullbrightProgram;
LLGLSLShader gDeferredGIProgram;
LLGLSLShader gDeferredGIFinalProgram;
LLGLSLShader gDeferredPostGIProgram;
LLGLSLShader gDeferredPostProgram;
LLGLSLShader gDeferredPostNoDoFProgram;
-
+LLGLSLShader gDeferredWLSkyProgram;
+LLGLSLShader gDeferredWLCloudProgram;
+LLGLSLShader gDeferredStarProgram;
LLGLSLShader gLuminanceGatherProgram;
@@ -160,6 +172,10 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gObjectFullbrightProgram);
mShaderList.push_back(&gObjectFullbrightShinyProgram);
mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);
mShaderList.push_back(&gSkinnedObjectSimpleProgram);
mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram);
@@ -183,6 +199,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gDeferredAlphaProgram);
mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
mShaderList.push_back(&gDeferredFullbrightProgram);
+ mShaderList.push_back(&gDeferredAvatarEyesProgram);
mShaderList.push_back(&gDeferredPostGIProgram);
mShaderList.push_back(&gDeferredEdgeProgram);
mShaderList.push_back(&gDeferredPostProgram);
@@ -190,6 +207,9 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gDeferredGIFinalProgram);
mShaderList.push_back(&gDeferredWaterProgram);
mShaderList.push_back(&gDeferredAvatarAlphaProgram);
+ mShaderList.push_back(&gDeferredWLSkyProgram);
+ mShaderList.push_back(&gDeferredWLCloudProgram);
+ mShaderList.push_back(&gDeferredStarProgram);
}
LLViewerShaderMgr::~LLViewerShaderMgr()
@@ -347,6 +367,10 @@ void LLViewerShaderMgr::setShaders()
return;
}
+ //setup preprocessor definitions
+ LLShaderMgr::instance()->mDefinitions["samples"] = llformat("%d", gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples")));
+ LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits);
+
reentrance = true;
// Make sure the compiled shader map is cleared before we recompile shaders.
@@ -577,6 +601,16 @@ void LLViewerShaderMgr::unloadShaders()
gObjectFullbrightShinyWaterProgram.unload();
gObjectShinyWaterProgram.unload();
+ gObjectSimpleNonIndexedProgram.unload();
+ gObjectSimpleNonIndexedWaterProgram.unload();
+ gObjectFullbrightNonIndexedProgram.unload();
+ gObjectFullbrightNonIndexedWaterProgram.unload();
+
+ gObjectShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedWaterProgram.unload();
+ gObjectShinyNonIndexedWaterProgram.unload();
+
gSkinnedObjectSimpleProgram.unload();
gSkinnedObjectFullbrightProgram.unload();
gSkinnedObjectFullbrightShinyProgram.unload();
@@ -607,6 +641,7 @@ void LLViewerShaderMgr::unloadShaders()
gPostNightVisionProgram.unload();
gDeferredDiffuseProgram.unload();
+ gDeferredNonIndexedDiffuseProgram.unload();
gDeferredSkinnedDiffuseProgram.unload();
gDeferredSkinnedBumpProgram.unload();
gDeferredSkinnedAlphaProgram.unload();
@@ -685,24 +720,35 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
shaders.clear();
shaders.reserve(13);
- shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) );
- shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) );
- shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ S32 ch = gGLManager.mNumTextureImageUnits-1;
+
+ std::vector<S32> index_channels;
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
for (U32 i = 0; i < shaders.size(); i++)
{
// Note usage of GL_FRAGMENT_SHADER_ARB
- if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB) == 0)
+ if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, index_channels[i]) == 0)
{
return FALSE;
}
@@ -833,6 +879,9 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
{
BOOL success = TRUE;
+ U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));
+ bool multisample = samples > 1 && LLPipeline::sRenderDeferred && gGLManager.mHasTextureMultisample;
+
if (mVertexShaderLevel[SHADER_EFFECT] == 0)
{
gGlowProgram.unload();
@@ -858,10 +907,21 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
if (success)
{
+ std::string fragment;
+
+ if (multisample)
+ {
+ fragment = "effects/glowExtractMSF.glsl";
+ }
+ else
+ {
+ fragment = "effects/glowExtractF.glsl";
+ }
+
gGlowExtractProgram.mName = "Glow Extract Shader (Post)";
gGlowExtractProgram.mShaderFiles.clear();
gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractV.glsl", GL_VERTEX_SHADER_ARB));
- gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gGlowExtractProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gGlowExtractProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
success = gGlowExtractProgram.createShader(NULL, &mGlowExtractUniforms);
if (!success)
@@ -925,6 +985,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
{
gDeferredTreeProgram.unload();
gDeferredDiffuseProgram.unload();
+ gDeferredNonIndexedDiffuseProgram.unload();
gDeferredSkinnedDiffuseProgram.unload();
gDeferredSkinnedBumpProgram.unload();
gDeferredSkinnedAlphaProgram.unload();
@@ -945,6 +1006,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.unload();
gDeferredAlphaProgram.unload();
gDeferredFullbrightProgram.unload();
+ gDeferredAvatarEyesProgram.unload();
gDeferredPostGIProgram.unload();
gDeferredEdgeProgram.unload();
gDeferredPostProgram.unload();
@@ -952,6 +1014,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredGIProgram.unload();
gDeferredGIFinalProgram.unload();
gDeferredWaterProgram.unload();
+ gDeferredWLSkyProgram.unload();
+ gDeferredWLCloudProgram.unload();
+ gDeferredStarProgram.unload();
return TRUE;
}
@@ -959,18 +1024,33 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
BOOL success = TRUE;
+ U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));
+ bool multisample = samples > 1 && gGLManager.mHasTextureMultisample;
+
if (success)
{
gDeferredDiffuseProgram.mName = "Deferred Diffuse Shader";
gDeferredDiffuseProgram.mShaderFiles.clear();
gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDiffuseProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
gDeferredDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredDiffuseProgram.createShader(NULL, NULL);
}
if (success)
{
+ gDeferredNonIndexedDiffuseProgram.mName = "Non Indexed Deferred Diffuse Shader";
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.clear();
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredNonIndexedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredNonIndexedDiffuseProgram.createShader(NULL, NULL);
+ }
+
+
+ if (success)
+ {
gDeferredSkinnedDiffuseProgram.mName = "Deferred Skinned Diffuse Shader";
gDeferredSkinnedDiffuseProgram.mFeatures.hasObjectSkinning = true;
gDeferredSkinnedDiffuseProgram.mShaderFiles.clear();
@@ -1000,9 +1080,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSkinnedAlphaProgram.mFeatures.hasGamma = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true;
gDeferredSkinnedAlphaProgram.mShaderFiles.clear();
gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);
}
@@ -1039,40 +1120,83 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ std::string fragment;
+
+ if (multisample)
+ {
+ fragment = "deferred/pointLightMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/pointLightF.glsl";
+ }
+
gDeferredLightProgram.mName = "Deferred Light Shader";
gDeferredLightProgram.mShaderFiles.clear();
gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredLightProgram.createShader(NULL, NULL);
}
if (success)
{
+ std::string fragment;
+ if (multisample)
+ {
+ fragment = "deferred/multiPointLightMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/multiPointLightF.glsl";
+ }
+
gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader";
gDeferredMultiLightProgram.mShaderFiles.clear();
gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredMultiLightProgram.createShader(NULL, NULL);
}
if (success)
{
+ std::string fragment;
+
+ if (multisample)
+ {
+ fragment = "deferred/spotLightMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/multiSpotLightF.glsl";
+ }
+
gDeferredSpotLightProgram.mName = "Deferred SpotLight Shader";
gDeferredSpotLightProgram.mShaderFiles.clear();
gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredSpotLightProgram.createShader(NULL, NULL);
}
if (success)
{
+ std::string fragment;
+
+ if (multisample)
+ {
+ fragment = "deferred/multiSpotLightMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/multiSpotLightF.glsl";
+ }
+
gDeferredMultiSpotLightProgram.mName = "Deferred MultiSpotLight Shader";
gDeferredMultiSpotLightProgram.mShaderFiles.clear();
gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredMultiSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL);
}
@@ -1083,11 +1207,25 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
{
- fragment = "deferred/sunLightSSAOF.glsl";
+ if (multisample)
+ {
+ fragment = "deferred/sunlightSSAOMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/sunLightSSAOF.glsl";
+ }
}
else
{
- fragment = "deferred/sunLightF.glsl";
+ if (multisample)
+ {
+ fragment = "deferred/sunlightMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/sunLightF.glsl";
+ }
}
gDeferredSunProgram.mName = "Deferred Sun Shader";
@@ -1100,10 +1238,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ std::string fragment;
+
+ if (multisample)
+ {
+ fragment = "deferred/blurLightMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/blurLightF.glsl";
+ }
+
gDeferredBlurLightProgram.mName = "Deferred Blur Light Shader";
gDeferredBlurLightProgram.mShaderFiles.clear();
gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair("deferred/blurLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair("deferred/blurLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredBlurLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredBlurLightProgram.createShader(NULL, NULL);
}
@@ -1116,6 +1265,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAlphaProgram.mFeatures.hasGamma = true;
gDeferredAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredAlphaProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
+ if (mVertexShaderLevel[SHADER_DEFERRED] < 1)
+ {
+ gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
+ }
+ else
+ { //shave off some texture units for shadow maps
+ gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits - 6;
+ }
+
gDeferredAlphaProgram.mShaderFiles.clear();
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1125,11 +1284,27 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredAvatarEyesProgram.mName = "Deferred Avatar Eyes Shader";
+ gDeferredAvatarEyesProgram.mFeatures.calculatesAtmospherics = true;
+ gDeferredAvatarEyesProgram.mFeatures.hasGamma = true;
+ gDeferredAvatarEyesProgram.mFeatures.hasTransport = true;
+ gDeferredAvatarEyesProgram.mFeatures.isFullbright = true;
+ gDeferredAvatarEyesProgram.mFeatures.disableTextureIndex = true;
+ gDeferredAvatarEyesProgram.mShaderFiles.clear();
+ gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/avatarEyesV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAvatarEyesProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredAvatarEyesProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDeferredFullbrightProgram.mName = "Deferred Fullbright Shader";
gDeferredFullbrightProgram.mFeatures.calculatesAtmospherics = true;
gDeferredFullbrightProgram.mFeatures.hasGamma = true;
gDeferredFullbrightProgram.mFeatures.hasTransport = true;
gDeferredFullbrightProgram.mFeatures.isFullbright = true;
+ gDeferredFullbrightProgram.mFeatures.mIndexedTextureChannels = 0;
gDeferredFullbrightProgram.mShaderFiles.clear();
gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1153,10 +1328,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ std::string fragment;
+
+ if (multisample)
+ {
+ fragment = "deferred/softenLightMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/softenLightF.glsl";
+ }
+
gDeferredSoftenProgram.mName = "Deferred Soften Shader";
gDeferredSoftenProgram.mShaderFiles.clear();
gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSoftenProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredSoftenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
@@ -1230,41 +1416,106 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.mFeatures.hasGamma = true;
gDeferredAvatarAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true;
gDeferredAvatarAlphaProgram.mShaderFiles.clear();
gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredAvatarAlphaProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
}
if (success)
{
+ std::string fragment;
+ if (multisample)
+ {
+ fragment = "deferred/postDeferredMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/postDeferredF.glsl";
+ }
+
gDeferredPostProgram.mName = "Deferred Post Shader";
gDeferredPostProgram.mShaderFiles.clear();
gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredPostProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredPostProgram.createShader(NULL, NULL);
}
if (success)
{
+ std::string fragment;
+ if (multisample)
+ {
+ fragment = "deferred/postDeferredNoDoFMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/postDeferredNoDoFF.glsl";
+ }
+
gDeferredPostNoDoFProgram.mName = "Deferred Post Shader";
gDeferredPostNoDoFProgram.mShaderFiles.clear();
gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);
}
+ if (success)
+ {
+ gDeferredWLSkyProgram.mName = "Deferred Windlight Sky Shader";
+ //gWLSkyProgram.mFeatures.hasGamma = true;
+ gDeferredWLSkyProgram.mShaderFiles.clear();
+ gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredWLSkyProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredWLSkyProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredWLSkyProgram.createShader(NULL, &mWLUniforms);
+ }
+
+ if (success)
+ {
+ gDeferredWLCloudProgram.mName = "Deferred Windlight Cloud Program";
+ gDeferredWLCloudProgram.mShaderFiles.clear();
+ gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredWLCloudProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredWLCloudProgram.createShader(NULL, &mWLUniforms);
+ }
+
+ if (success)
+ {
+ gDeferredStarProgram.mName = "Deferred Star Program";
+ gDeferredStarProgram.mShaderFiles.clear();
+ gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredStarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredStarProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredStarProgram.createShader(NULL, &mWLUniforms);
+ }
+
if (mVertexShaderLevel[SHADER_DEFERRED] > 1)
{
if (success)
{
+ std::string fragment;
+ if (multisample)
+ {
+ fragment = "deferred/edgeMSF.glsl";
+ }
+ else
+ {
+ fragment = "deferred/edgeF.glsl";
+ }
+
gDeferredEdgeProgram.mName = "Deferred Edge Shader";
gDeferredEdgeProgram.mShaderFiles.clear();
gDeferredEdgeProgram.mShaderFiles.push_back(make_pair("deferred/edgeV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredEdgeProgram.mShaderFiles.push_back(make_pair("deferred/edgeF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredEdgeProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredEdgeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredEdgeProgram.createShader(NULL, NULL);
}
@@ -1272,8 +1523,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (mVertexShaderLevel[SHADER_DEFERRED] > 2)
{
-
-
if (success)
{
gDeferredPostGIProgram.mName = "Deferred Post GI Shader";
@@ -1321,7 +1570,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
BOOL LLViewerShaderMgr::loadShadersObject()
{
BOOL success = TRUE;
-
+
if (mVertexShaderLevel[SHADER_OBJECT] == 0)
{
gObjectShinyProgram.unload();
@@ -1332,6 +1581,14 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectSimpleWaterProgram.unload();
gObjectFullbrightProgram.unload();
gObjectFullbrightWaterProgram.unload();
+ gObjectShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedWaterProgram.unload();
+ gObjectShinyNonIndexedWaterProgram.unload();
+ gObjectSimpleNonIndexedProgram.unload();
+ gObjectSimpleNonIndexedWaterProgram.unload();
+ gObjectFullbrightNonIndexedProgram.unload();
+ gObjectFullbrightNonIndexedWaterProgram.unload();
gSkinnedObjectSimpleProgram.unload();
gSkinnedObjectFullbrightProgram.unload();
gSkinnedObjectFullbrightShinyProgram.unload();
@@ -1346,12 +1603,144 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectSimpleNonIndexedProgram.mName = "Non indexed Shader";
+ gObjectSimpleNonIndexedProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectSimpleNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectSimpleNonIndexedWaterProgram.mName = "Non indexed Water Shader";
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectSimpleNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectSimpleNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNonIndexedProgram.mName = "Non Indexed Fullbright Shader";
+ gObjectFullbrightNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.clear();
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNonIndexedWaterProgram.mName = "Non Indexed Fullbright Water Shader";
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectShinyNonIndexedProgram.mName = "Non Indexed Shiny Shader";
+ gObjectShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectShinyNonIndexedProgram.mFeatures.calculatesLighting = true;
+ gObjectShinyNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectShinyNonIndexedProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyNonIndexedProgram.mFeatures.isShiny = true;
+ gObjectShinyNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectShinyNonIndexedProgram.mShaderFiles.clear();
+ gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectShinyNonIndexedWaterProgram.mName = "Non Indexed Shiny Water Shader";
+ gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.isShiny = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightShinyNonIndexedProgram.mName = "Non Indexed Fullbright Shiny Shader";
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.isShiny = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.clear();
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightShinyNonIndexedWaterProgram.mName = "Non Indexed Fullbright Shiny Water Shader";
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isShiny = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
gObjectSimpleProgram.mName = "Simple Shader";
gObjectSimpleProgram.mFeatures.calculatesLighting = true;
gObjectSimpleProgram.mFeatures.calculatesAtmospherics = true;
gObjectSimpleProgram.mFeatures.hasGamma = true;
gObjectSimpleProgram.mFeatures.hasAtmospherics = true;
gObjectSimpleProgram.mFeatures.hasLighting = true;
+ gObjectSimpleProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectSimpleProgram.mShaderFiles.clear();
gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1367,6 +1756,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
gObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
gObjectSimpleWaterProgram.mFeatures.hasLighting = true;
+ gObjectSimpleWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectSimpleWaterProgram.mShaderFiles.clear();
gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1382,6 +1772,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightProgram.mFeatures.hasGamma = true;
gObjectFullbrightProgram.mFeatures.hasTransport = true;
gObjectFullbrightProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightProgram.mShaderFiles.clear();
gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1396,6 +1787,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
gObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
gObjectFullbrightWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightWaterProgram.mShaderFiles.clear();
gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1412,6 +1804,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectShinyProgram.mFeatures.hasGamma = true;
gObjectShinyProgram.mFeatures.hasAtmospherics = true;
gObjectShinyProgram.mFeatures.isShiny = true;
+ gObjectShinyProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectShinyProgram.mShaderFiles.clear();
gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1427,6 +1820,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectShinyWaterProgram.mFeatures.isShiny = true;
gObjectShinyWaterProgram.mFeatures.hasWaterFog = true;
gObjectShinyWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectShinyWaterProgram.mShaderFiles.clear();
gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1443,6 +1837,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightShinyProgram.mFeatures.isShiny = true;
gObjectFullbrightShinyProgram.mFeatures.hasGamma = true;
gObjectFullbrightShinyProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightShinyProgram.mShaderFiles.clear();
gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1459,6 +1854,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
gObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
gObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1478,6 +1874,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectSimpleProgram.mFeatures.hasAtmospherics = true;
gSkinnedObjectSimpleProgram.mFeatures.hasLighting = true;
gSkinnedObjectSimpleProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectSimpleProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectSimpleProgram.mShaderFiles.clear();
gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1493,6 +1890,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true;
gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true;
gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectFullbrightProgram.mShaderFiles.clear();
gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1509,6 +1907,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectFullbrightShinyProgram.mFeatures.isShiny = true;
gSkinnedObjectFullbrightShinyProgram.mFeatures.isFullbright = true;
gSkinnedObjectFullbrightShinyProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.clear();
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1525,6 +1924,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectShinySimpleProgram.mFeatures.hasAtmospherics = true;
gSkinnedObjectShinySimpleProgram.mFeatures.hasObjectSkinning = true;
gSkinnedObjectShinySimpleProgram.mFeatures.isShiny = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectShinySimpleProgram.mShaderFiles.clear();
gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1540,9 +1940,11 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true;
gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear();
gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1559,6 +1961,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasObjectSkinning = true;
gSkinnedObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gSkinnedObjectFullbrightWaterProgram.mShaderFiles.clear();
gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1577,6 +1980,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasObjectSkinning = true;
gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1595,6 +1999,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasObjectSkinning = true;
gSkinnedObjectShinySimpleWaterProgram.mFeatures.isShiny = true;
gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.disableTextureIndex = true;
gSkinnedObjectShinySimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.clear();
gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1635,6 +2040,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarProgram.mFeatures.hasGamma = true;
gAvatarProgram.mFeatures.hasAtmospherics = true;
gAvatarProgram.mFeatures.hasLighting = true;
+ gAvatarProgram.mFeatures.disableTextureIndex = true;
gAvatarProgram.mShaderFiles.clear();
gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1650,6 +2056,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarWaterProgram.mFeatures.hasWaterFog = true;
gAvatarWaterProgram.mFeatures.hasAtmospherics = true;
gAvatarWaterProgram.mFeatures.hasLighting = true;
+ gAvatarWaterProgram.mFeatures.disableTextureIndex = true;
gAvatarWaterProgram.mShaderFiles.clear();
gAvatarWaterProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1670,6 +2077,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
{
gAvatarPickProgram.mName = "Avatar Pick Shader";
gAvatarPickProgram.mFeatures.hasSkinning = true;
+ gAvatarPickProgram.mFeatures.disableTextureIndex = true;
gAvatarPickProgram.mShaderFiles.clear();
gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1686,6 +2094,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarEyeballProgram.mFeatures.hasGamma = true;
gAvatarEyeballProgram.mFeatures.hasAtmospherics = true;
gAvatarEyeballProgram.mFeatures.hasLighting = true;
+ gAvatarEyeballProgram.mFeatures.disableTextureIndex = true;
gAvatarEyeballProgram.mShaderFiles.clear();
gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballF.glsl", GL_FRAGMENT_SHADER_ARB));
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 72ac5e02ee..6ecba65470 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -298,16 +298,25 @@ extern LLVector4 gShinyOrigin;
//object shaders
extern LLGLSLShader gObjectSimpleProgram;
extern LLGLSLShader gObjectSimpleWaterProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
extern LLGLSLShader gObjectFullbrightProgram;
extern LLGLSLShader gObjectFullbrightWaterProgram;
+extern LLGLSLShader gObjectFullbrightNonIndexedProgram;
+extern LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
extern LLGLSLShader gObjectSimpleLODProgram;
extern LLGLSLShader gObjectFullbrightLODProgram;
extern LLGLSLShader gObjectFullbrightShinyProgram;
extern LLGLSLShader gObjectFullbrightShinyWaterProgram;
+extern LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
+extern LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
+
extern LLGLSLShader gObjectShinyProgram;
extern LLGLSLShader gObjectShinyWaterProgram;
+extern LLGLSLShader gObjectShinyNonIndexedProgram;
+extern LLGLSLShader gObjectShinyNonIndexedWaterProgram;
extern LLGLSLShader gSkinnedObjectSimpleProgram;
extern LLGLSLShader gSkinnedObjectFullbrightProgram;
@@ -349,6 +358,7 @@ extern LLGLSLShader gDeferredImpostorProgram;
extern LLGLSLShader gDeferredEdgeProgram;
extern LLGLSLShader gDeferredWaterProgram;
extern LLGLSLShader gDeferredDiffuseProgram;
+extern LLGLSLShader gDeferredNonIndexedDiffuseProgram;
extern LLGLSLShader gDeferredSkinnedDiffuseProgram;
extern LLGLSLShader gDeferredSkinnedBumpProgram;
extern LLGLSLShader gDeferredSkinnedAlphaProgram;
@@ -373,8 +383,11 @@ extern LLGLSLShader gDeferredAvatarShadowProgram;
extern LLGLSLShader gDeferredAttachmentShadowProgram;
extern LLGLSLShader gDeferredAlphaProgram;
extern LLGLSLShader gDeferredFullbrightProgram;
+extern LLGLSLShader gDeferredAvatarEyesProgram;
extern LLGLSLShader gDeferredAvatarAlphaProgram;
-
+extern LLGLSLShader gDeferredWLSkyProgram;
+extern LLGLSLShader gDeferredWLCloudProgram;
+extern LLGLSLShader gDeferredStarProgram;
extern LLGLSLShader gLuminanceGatherProgram;
//current avatar shader parameter pointer
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index d9ff931575..cd6653b0c7 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -110,8 +110,8 @@ void LLViewerTextureList::doPreloadImages()
{
LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL;
- llassert_always(mInitialized) ;
- llassert_always(mImageList.empty()) ;
+ llassert_always(mInitialized) ;
+ llassert_always(mImageList.empty()) ;
llassert_always(mUUIDMap.empty()) ;
// Set the "missing asset" image
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index dc355362ce..77bbf994e9 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -6004,7 +6004,7 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )
LLVOVolume* pVObj = pVO->mDrawable->getVOVolume();
if ( pVObj )
{
- const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID() );
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID(), pVObj );
if ( pSkinData )
{
const int jointCnt = pSkinData->mJointNames.size();
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index b888a263d0..c605ddb1c8 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -76,6 +76,7 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
S32 size = -1;
BOOL success;
+ mDP.assignBuffer(mBuffer, 0);
success = check_read(apr_file, &mLocalID, sizeof(U32));
if(success)
{
@@ -136,10 +137,11 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
LLVOCacheEntry::~LLVOCacheEntry()
{
- if(mBuffer)
+ if(mBuffer != mDP.getBuffer())
{
- delete[] mBuffer;
+ delete[] mBuffer ; //just in case
}
+ mDP.freeBuffer();
}
diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp
index 78aa6e6ab8..478708cd78 100644
--- a/indra/newview/llvoclouds.cpp
+++ b/indra/newview/llvoclouds.cpp
@@ -244,9 +244,13 @@ void LLVOClouds::getGeometry(S32 te,
vtx[2] = puff_pos_agent + right + up;
vtx[3] = puff_pos_agent + right - up;
+ verticesp->mV[3] = 0.f;
*verticesp++ = vtx[0];
+ verticesp->mV[3] = 0.f;
*verticesp++ = vtx[1];
+ verticesp->mV[3] = 0.f;
*verticesp++ = vtx[2];
+ verticesp->mV[3] = 0.f;
*verticesp++ = vtx[3];
*texcoordsp++ = uvs[0];
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 6f354b78b1..a4b0910c92 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -324,10 +324,18 @@ void LLVOPartGroup::getGeometry(S32 idx,
LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();
-
+
+ //HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should)
+ // this works because there is actually a 4th float stored after the vertex position which is used as a texture index
+ // also, somebody please VECTORIZE THIS
+
+ verticesp->mV[3] = 0.f;
*verticesp++ = part_pos_agent + up - right;
+ verticesp->mV[3] = 0.f;
*verticesp++ = part_pos_agent - up - right;
+ verticesp->mV[3] = 0.f;
*verticesp++ = part_pos_agent + up + right;
+ verticesp->mV[3] = 0.f;
*verticesp++ = part_pos_agent - up + right;
*colorsp++ = part.mColor;
@@ -360,7 +368,7 @@ U32 LLVOPartGroup::getPartitionType() const
}
LLParticlePartition::LLParticlePartition()
-: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK, TRUE, GL_STREAM_DRAW_ARB)
+: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, GL_STREAM_DRAW_ARB)
{
mRenderPass = LLRenderPass::PASS_ALPHA;
mDrawableType = LLPipeline::RENDER_TYPE_PARTICLES;
@@ -418,6 +426,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
mFaceList.push_back(facep);
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
+ llassert(facep->getIndicesCount() < 65536);
}
obj->mDepth /= count;
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 6396bc042d..800af26b69 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -1483,6 +1483,8 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
facep->setVertexBuffer(buff);
}
+ llassert(facep->getVertexBuffer()->getNumIndices() == 6);
+
index_offset = facep->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
if (-1 == index_offset)
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index dbcd4f50ca..510525259f 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -375,6 +375,8 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
S32 num_vertices, num_indices;
U32 index;
+ llassert(mLastStride > 0);
+
render_stride = mLastStride;
patch_size = mPatchp->getSurface()->getGridsPerPatchEdge();
S32 vert_size = patch_size / render_stride;
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 8946d4e0b6..3c7fe708e6 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -980,11 +980,6 @@ void LLVOTree::appendMesh(LLStrider<LLVector3>& vertices,
for (S32 i = 0; i < index_count; i++)
{
U16 index = index_offset + i;
- if (idx[index] >= vert_start + vert_count ||
- idx[index] < vert_start)
- {
- llerrs << "WTF?" << llendl;
- }
*indices++ = idx[index]-vert_start+cur_idx;
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e9a8c9b80a..c917a5fd9d 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -73,6 +73,7 @@
#include "llagent.h"
#include "llviewermediafocus.h"
#include "lldatapacker.h"
+#include "llviewershadermgr.h"
#include "llvoavatar.h"
#include "llvocache.h"
@@ -1095,8 +1096,6 @@ void LLVOVolume::updateSculptTexture()
}
-
-
void LLVOVolume::notifyMeshLoaded()
{
mSculptChanged = TRUE;
@@ -1222,7 +1221,7 @@ BOOL LLVOVolume::calcLOD()
}
//hold onto unmodified distance for debugging
- F32 debug_distance = distance;
+ //F32 debug_distance = distance;
distance *= sDistanceFactor;
@@ -1245,7 +1244,9 @@ BOOL LLVOVolume::calcLOD()
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO))
{
- setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
+ //setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
+
+ setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex()));
}
if (cur_detail != mLOD)
@@ -1274,6 +1275,15 @@ BOOL LLVOVolume::updateLOD()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
mLODChanged = TRUE;
}
+ else
+ {
+ F32 new_radius = getBinRadius();
+ F32 old_radius = mDrawable->getBinRadius();
+ if (new_radius < old_radius * 0.9f || new_radius > old_radius*1.1f)
+ {
+ gPipeline.markPartitionMove(mDrawable);
+ }
+ }
lod_changed = lod_changed || LLViewerObject::updateLOD();
@@ -3187,6 +3197,10 @@ F32 LLVOVolume::getBinRadius()
F32 scale = 1.f;
+ S32 size_factor = llmax(gSavedSettings.getS32("OctreeStaticObjectSizeFactor"), 1);
+ S32 attachment_size_factor = llmax(gSavedSettings.getS32("OctreeAttachmentSizeFactor"), 1);
+ LLVector3 distance_factor = gSavedSettings.getVector3("OctreeDistanceFactor");
+ LLVector3 alpha_distance_factor = gSavedSettings.getVector3("OctreeAlphaDistanceFactor");
const LLVector4a* ext = mDrawable->getSpatialExtents();
BOOL shrink_wrap = mDrawable->isAnimating();
@@ -3216,6 +3230,8 @@ F32 LLVOVolume::getBinRadius()
radius = llmin(bounds.mV[1], bounds.mV[2]);
radius = llmin(radius, bounds.mV[0]);
radius *= 0.5f;
+ radius *= 1.f+mDrawable->mDistanceWRTCamera*alpha_distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera*alpha_distance_factor[0];
}
else if (shrink_wrap)
{
@@ -3226,24 +3242,19 @@ F32 LLVOVolume::getBinRadius()
}
else if (mDrawable->isStatic())
{
- /*if (mDrawable->getRadius() < 2.0f)
- {
- radius = 16.f;
- }
- else
- {
- radius = llmax(mDrawable->getRadius(), 32.f);
- }*/
-
- radius = (((S32) mDrawable->getRadius())/2+1)*8;
+ radius = llmax((S32) mDrawable->getRadius(), 1)*size_factor;
+ radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera * distance_factor[0];
}
else if (mDrawable->getVObj()->isAttachment())
{
- radius = (((S32) (mDrawable->getRadius()*4)+1))*2;
+ radius = llmax((S32) mDrawable->getRadius(),1)*attachment_size_factor;
}
else
{
- radius = 8.f;
+ radius = mDrawable->getRadius();
+ radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera * distance_factor[0];
}
return llclamp(radius*scale, 0.5f, 256.f);
@@ -3521,7 +3532,7 @@ void LLVOVolume::updateRiggedVolume()
LLVolume* volume = getVolume();
- const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID());
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID(), this);
if (!skin)
{
@@ -3712,6 +3723,21 @@ LLVolumeBridge::LLVolumeBridge(LLDrawable* drawablep)
mSlopRatio = 0.25f;
}
+bool can_batch_texture(LLFace* facep)
+{
+ if (facep->getTextureEntry()->getBumpmap())
+ { //bump maps aren't worked into texture batching yet
+ return false;
+ }
+
+ if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
+ { //texture animation breaks batches
+ return false;
+ }
+
+ return true;
+}
+
void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -3762,12 +3788,36 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
LLViewerTexture* tex = facep->getTexture();
+ U8 index = facep->getTextureIndex();
+
+ bool batchable = false;
+
+ if (index < 255 && idx >= 0)
+ {
+ if (index < draw_vec[idx]->mTextureList.size())
+ {
+ if (draw_vec[idx]->mTextureList[index].isNull())
+ {
+ batchable = true;
+ draw_vec[idx]->mTextureList[index] = tex;
+ }
+ else if (draw_vec[idx]->mTextureList[index] == tex)
+ { //this face's texture index can be used with this batch
+ batchable = true;
+ }
+ }
+ else
+ { //texture list can be expanded to fit this texture index
+ batchable = true;
+ }
+ }
+
U8 glow = (U8) (facep->getTextureEntry()->getGlow() * 255);
if (idx >= 0 &&
draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() &&
draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
- (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) &&
+ (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex || batchable) &&
#if LL_DARWIN
draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange &&
draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange &&
@@ -3781,6 +3831,12 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_vec[idx]->mCount += facep->getIndicesCount();
draw_vec[idx]->mEnd += facep->getGeomCount();
draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize());
+
+ if (index >= draw_vec[idx]->mTextureList.size())
+ {
+ draw_vec[idx]->mTextureList.resize(index+1);
+ draw_vec[idx]->mTextureList[index] = tex;
+ }
draw_vec[idx]->validate();
update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]);
update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]);
@@ -3811,6 +3867,11 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_info->mDrawMode = LLRender::TRIANGLE_STRIP;
}
+ if (index < 255)
+ { //initialize texture list for texture batching
+ draw_info->mTextureList.resize(index+1);
+ draw_info->mTextureList[index] = tex;
+ }
draw_info->validate();
}
}
@@ -3923,7 +3984,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
bool rigged = vobj->isAttachment() &&
vobj->isMesh() &&
- gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID());
+ gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID(), vobj);
bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic();
@@ -3965,7 +4026,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if ( pAvatarVO )
{
LLUUID currentId = vobj->getVolume()->getParams().getSculptID();
- const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId );
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId, vobj );
if ( pSkinData )
{
@@ -4233,15 +4294,24 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
U32 bump_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR;
U32 fullbright_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR;
- if (LLPipeline::sRenderDeferred)
+ bool batch_textures = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1;
+
+ if (batch_textures)
{
bump_mask |= LLVertexBuffer::MAP_BINORMAL;
+ genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, FALSE, TRUE);
+ genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, FALSE, TRUE);
+ genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, FALSE, TRUE);
+ genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, TRUE, TRUE);
+ }
+ else
+ {
+ genDrawInfo(group, simple_mask, simple_faces);
+ genDrawInfo(group, fullbright_mask, fullbright_faces);
+ genDrawInfo(group, bump_mask, bump_faces, FALSE, TRUE);
+ genDrawInfo(group, alpha_mask, alpha_faces, TRUE);
}
- genDrawInfo(group, simple_mask, simple_faces);
- genDrawInfo(group, bump_mask, bump_faces);
- genDrawInfo(group, fullbright_mask, fullbright_faces);
- genDrawInfo(group, alpha_mask, alpha_faces, TRUE);
if (!LLPipeline::sDelayVBUpdate)
{
@@ -4297,11 +4367,6 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
face->getGeometryVolume(*volume, face->getTEOffset(),
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
}
-
- if (!face)
- {
- llerrs << "WTF?" << llendl;
- }
}
drawablep->clearState(LLDrawable::REBUILD_ALL);
@@ -4356,13 +4421,37 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);
}
- if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO))
+ llassert(!group || !group->isState(LLSpatialGroup::NEW_DRAWINFO));
+}
+
+struct CompareBatchBreakerModified
+{
+ bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
{
- llerrs << "WTF?" << llendl;
+ const LLTextureEntry* lte = lhs->getTextureEntry();
+ const LLTextureEntry* rte = rhs->getTextureEntry();
+
+ if (lte->getBumpmap() != rte->getBumpmap())
+ {
+ return lte->getBumpmap() < rte->getBumpmap();
+ }
+ else if (lte->getFullbright() != rte->getFullbright())
+ {
+ return lte->getFullbright() < rte->getFullbright();
+ }
+ else if (lte->getGlow() != rte->getGlow())
+ {
+ return lte->getGlow() < rte->getGlow();
+ }
+ else
+ {
+ return lhs->getTexture() < rhs->getTexture();
+ }
+
}
-}
+};
-void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort)
+void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort, BOOL batch_textures)
{
//calculate maximum number of vertices to store in a single buffer
U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
@@ -4371,7 +4460,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
if (!distance_sort)
{
//sort faces by things that break batches
- std::sort(faces.begin(), faces.end(), LLFace::CompareBatchBreaker());
+ std::sort(faces.begin(), faces.end(), CompareBatchBreakerModified());
}
else
{
@@ -4391,6 +4480,16 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
buffer_index = -1;
}
+ S32 texture_index_channels = gGLManager.mNumTextureImageUnits-1; //always reserve one for shiny for now just for simplicity
+
+ if (LLPipeline::sRenderDeferred && distance_sort)
+ {
+ texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels;
+ }
+
+ texture_index_channels = llmin(texture_index_channels, (S32) gSavedSettings.getU32("RenderMaxTextureIndex"));
+
+
while (face_iter != faces.end())
{
//pull off next face
@@ -4421,24 +4520,101 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
std::vector<LLFace*>::iterator i = face_iter;
++i;
- while (i != faces.end() &&
- (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex)))
+ std::vector<LLViewerTexture*> texture_list;
+
+ if (batch_textures)
{
- facep = *i;
-
- if (geom_count + facep->getGeomCount() > max_vertices)
- { //cut batches on geom count too big
- break;
+ U8 cur_tex = 0;
+ facep->setTextureIndex(cur_tex);
+ texture_list.push_back(tex);
+
+ //if (can_batch_texture(facep))
+ {
+ while (i != faces.end())
+ {
+ facep = *i;
+ if (facep->getTexture() != tex)
+ {
+ if (distance_sort)
+ { //textures might be out of order, see if texture exists in current batch
+ bool found = false;
+ for (U32 tex_idx = 0; tex_idx < texture_list.size(); ++tex_idx)
+ {
+ if (facep->getTexture() == texture_list[tex_idx])
+ {
+ cur_tex = tex_idx;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ cur_tex = texture_list.size();
+ }
+ }
+ else
+ {
+ cur_tex++;
+ }
+
+ if (!can_batch_texture(facep))
+ { //face is bump mapped or has an animated texture matrix -- can't
+ //batch more than 1 texture at a time
+ break;
+ }
+
+ if (cur_tex >= texture_index_channels)
+ { //cut batches when index channels are depleted
+ break;
+ }
+
+ tex = facep->getTexture();
+
+ texture_list.push_back(tex);
+ }
+
+ if (geom_count + facep->getGeomCount() > max_vertices)
+ { //cut batches on geom count too big
+ break;
+ }
+
+ ++i;
+ index_count += facep->getIndicesCount();
+ geom_count += facep->getGeomCount();
+
+ facep->setTextureIndex(cur_tex);
+ }
}
- ++i;
- index_count += facep->getIndicesCount();
- geom_count += facep->getGeomCount();
+ tex = texture_list[0];
+ }
+ else
+ {
+ while (i != faces.end() &&
+ (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex)))
+ {
+ facep = *i;
+
+
+ //face has no texture index
+ facep->mDrawInfo = NULL;
+ facep->setTextureIndex(255);
+
+ if (geom_count + facep->getGeomCount() > max_vertices)
+ { //cut batches on geom count too big
+ break;
+ }
+
+ ++i;
+ index_count += facep->getIndicesCount();
+ geom_count += facep->getGeomCount();
+ }
}
//create/delete/resize vertex buffer if needed
LLVertexBuffer* buffer = NULL;
- LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(tex);
+ LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter);
if (found_iter != group->mBufferMap[mask].end())
{
@@ -4469,7 +4645,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
- buffer_map[mask][tex].push_back(buffer);
+ buffer_map[mask][*face_iter].push_back(buffer);
//add face geometry
@@ -4483,6 +4659,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
facep->setGeomIndex(index_offset);
facep->setVertexBuffer(buffer);
+ if (batch_textures && facep->getTextureIndex() == 255)
+ {
+ llerrs << "Invalid texture index." << llendl;
+ }
+
{
//for debugging, set last time face was updated vs moved
facep->updateRebuildFlags();
@@ -4495,12 +4676,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
U32 te_idx = facep->getTEOffset();
- if (facep->getGeometryVolume(*volume, te_idx,
- vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset))
- {
- buffer->markDirty(facep->getGeomIndex(), facep->getGeomCount(),
- facep->getIndicesStart(), facep->getIndicesCount());
- }
+ facep->getGeometryVolume(*volume, te_idx,
+ vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset);
}
}
@@ -4681,7 +4858,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
{
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
-
+ llassert(facep->getIndicesCount() < 65536);
//remember face (for sorting)
mFaceList.push_back(facep);
}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 845a87b8cf..1489c033e2 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -392,6 +392,7 @@ void LLPipeline::init()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_INIT);
+ gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
@@ -580,11 +581,6 @@ void LLPipeline::allocatePhysicsBuffer()
if (mPhysicsDisplay.getWidth() != resX || mPhysicsDisplay.getHeight() != resY)
{
mPhysicsDisplay.allocate(resX, resY, GL_RGBA, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
- if (mSampleBuffer.getWidth() == mPhysicsDisplay.getWidth() &&
- mSampleBuffer.getHeight() == mPhysicsDisplay.getHeight())
- {
- mPhysicsDisplay.setSampleBuffer(&mSampleBuffer);
- }
}
}
@@ -594,8 +590,9 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
mScreenWidth = resX;
mScreenHeight = resY;
- //never use more than 4 samples for render targets
- U32 samples = llmin(gSavedSettings.getU32("RenderFSAASamples"), (U32) 4);
+ //cap samples at 4 for render targets to avoid out of memory errors
+ U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));
+
if (gGLManager.mIsATI)
{ //disable multisampling of render targets where ATI is involved
samples = 0;
@@ -621,11 +618,11 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
bool gi = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED);
//allocate deferred rendering color buffers
- mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
- mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
+ mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
addDeferredAttachments(mDeferredScreen);
- mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);
#if LL_DARWIN
// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
@@ -636,7 +633,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (shadow_detail > 0 || ssao)
{ //only need mDeferredLight[0] for shadows OR ssao
- mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
}
else
{
@@ -645,7 +642,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (ssao)
{ //only need mDeferredLight[1] for ssao
- mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false);
}
else
{
@@ -654,7 +651,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
if (gi)
{ //only need mDeferredLight[2] and mGIMapPost for gi
- mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false);
for (U32 i = 0; i < 2; i++)
{
#if LL_DARWIN
@@ -744,35 +741,9 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
}
- if (LLRenderTarget::sUseFBO && samples > 1)
- {
- mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
- if (LLPipeline::sRenderDeferred)
- {
- addDeferredAttachments(mSampleBuffer);
- mDeferredScreen.setSampleBuffer(&mSampleBuffer);
- mEdgeMap.setSampleBuffer(&mSampleBuffer);
- }
-
- mScreen.setSampleBuffer(&mSampleBuffer);
-
- stop_glerror();
- }
- else
- {
- mSampleBuffer.release();
- }
-
if (LLPipeline::sRenderDeferred)
{ //share depth buffer between deferred targets
mDeferredScreen.shareDepthBuffer(mScreen);
- for (U32 i = 0; i < 3; i++)
- { //share stencil buffer with screen space lightmap to stencil out sky
- if (mDeferredLight[i].getTexture(0))
- {
- mDeferredScreen.shareDepthBuffer(mDeferredLight[i]);
- }
- }
}
gGL.getTexUnit(0)->disable();
@@ -841,7 +812,6 @@ void LLPipeline::releaseGLBuffers()
mScreen.release();
mPhysicsDisplay.release();
mUIScreen.release();
- mSampleBuffer.release();
mDeferredScreen.release();
mDeferredDepth.release();
for (U32 i = 0; i < 3; i++)
@@ -2550,6 +2520,32 @@ void LLPipeline::markGLRebuild(LLGLUpdate* glu)
}
}
+void LLPipeline::markPartitionMove(LLDrawable* drawable)
+{
+ if (!drawable->isState(LLDrawable::PARTITION_MOVE) &&
+ !drawable->getPositionGroup().equals3(LLVector4a::getZero()))
+ {
+ drawable->setState(LLDrawable::PARTITION_MOVE);
+ mPartitionQ.push_back(drawable);
+ }
+}
+
+void LLPipeline::processPartitionQ()
+{
+ for (LLDrawable::drawable_list_t::iterator iter = mPartitionQ.begin(); iter != mPartitionQ.end(); ++iter)
+ {
+ LLDrawable* drawable = *iter;
+ if (!drawable->isDead())
+ {
+ drawable->updateBinRadius();
+ drawable->movePartition();
+ }
+ drawable->clearState(LLDrawable::PARTITION_MOVE);
+ }
+
+ mPartitionQ.clear();
+}
+
void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -3610,7 +3606,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
if (gDebugGL)
{
check_stack_depth(stack_depth);
- std::string msg = llformat("%s pass %d", gPoolNames[cur_type].c_str(), i);
+ std::string msg = llformat("pass %d", i);
LLGLState::checkStates(msg);
LLGLState::checkTextureChannels(msg);
LLGLState::checkClientArrays(msg);
@@ -5919,7 +5915,6 @@ LLSpatialPartition* LLPipeline::getSpatialPartition(LLViewerObject* vobj)
return NULL;
}
-
void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
{
if (!drawable || drawable->isDead())
@@ -6195,11 +6190,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(0)->disable();
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
- gGL.getTexUnit(0)->bind(&mScreen);
-
+ mScreen.bindTexture(0, 0);
+
gGL.color4f(1,1,1,1);
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
gGL.begin(LLRender::TRIANGLE_STRIP);
@@ -6214,7 +6206,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.end();
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->unbind(mScreen.getUsage());
mGlow[2].flush();
}
@@ -6242,7 +6234,6 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
for (S32 i = 0; i < kernel; i++)
{
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
{
LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
mGlow[i%2].bindTarget();
@@ -6435,11 +6426,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
shader->uniform1f("magnification", magnification);
}
- S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
+ S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
if (channel > -1)
{
mScreen.bindTexture(0, channel);
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
}
//channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
//if (channel > -1)
@@ -6578,25 +6568,23 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
noise_map = mNoiseMap;
}
- LLGLState::checkTextureChannels();
-
shader.bind();
S32 channel = 0;
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(0,channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(1, channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(2, channel);
@@ -6719,22 +6707,16 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
shader.uniformMatrix4fv("gi_norm_mat", 1, FALSE, mGINormalMatrix.m);
}
}
-
- /*channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_POSITION, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mDeferredScreen.bindTexture(3, channel);
- }*/
+ stop_glerror();
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage());
if (channel > -1)
{
gGL.getTexUnit(channel)->bind(&mDeferredDepth, TRUE);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
stop_glerror();
- glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
- glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
+ //glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ //glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
stop_glerror();
@@ -6763,7 +6745,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
stop_glerror();
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, mDeferredLight[light_index].getUsage());
if (channel > -1)
{
mDeferredLight[light_index].bindTexture(0, channel);
@@ -6983,9 +6965,9 @@ void LLPipeline::renderDeferredLighting()
}
//ati doesn't seem to love actually using the stencil buffer on FBO's
- LLGLEnable stencil(GL_STENCIL_TEST);
- glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ LLGLDisable stencil(GL_STENCIL_TEST);
+ //glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
+ //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
gGL.setColorMask(true, true);
@@ -7787,33 +7769,41 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
LLViewerTexture* img = volume->getLightTexture();
+ if (img == NULL)
+ {
+ img = LLViewerFetchedTexture::sWhiteImagep;
+ }
+
S32 channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
- if (channel > -1 && img)
+ if (channel > -1)
{
- gGL.getTexUnit(channel)->bind(img);
+ if (img)
+ {
+ gGL.getTexUnit(channel)->bind(img);
- F32 lod_range = logf(img->getWidth())/logf(2.f);
+ F32 lod_range = logf(img->getWidth())/logf(2.f);
- shader.uniform1f("proj_focus", focus);
- shader.uniform1f("proj_lod", lod_range);
- shader.uniform1f("proj_ambient_lod", llclamp((proj_range-focus)/proj_range*lod_range, 0.f, 1.f));
+ shader.uniform1f("proj_focus", focus);
+ shader.uniform1f("proj_lod", lod_range);
+ shader.uniform1f("proj_ambient_lod", llclamp((proj_range-focus)/proj_range*lod_range, 0.f, 1.f));
+ }
}
+
}
void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
{
stop_glerror();
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_POSITION, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
+ shader.disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
+ shader.disableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
+ shader.disableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
+ shader.disableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, mDeferredScreen.getUsage());
+ shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, mDeferredLight[0].getUsage());
shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_EDGE, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
+ shader.disableTexture(LLViewerShaderMgr::DEFERRED_EDGE, mEdgeMap.getUsage());
+ shader.disableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, mDeferredLight[1].getUsage());
+ shader.disableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_LIGHT, mDeferredLight[2].getUsage());
shader.disableTexture(LLViewerShaderMgr::DEFERRED_LUMINANCE);
shader.disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_MIP);
@@ -7860,8 +7850,6 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->activate();
shader.unbind();
-
- LLGLState::checkTextureChannels();
}
inline float sgn(float a)
@@ -9409,6 +9397,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
mShadow[i+4].flush();
}
}
+ else
+ { //no spotlight shadows
+ mShadowSpotLight[0] = mShadowSpotLight[1] = NULL;
+ }
+
if (!gSavedSettings.getBOOL("CameraOffset"))
{
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index e9a250cd6d..e967b8c31e 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -157,7 +157,8 @@ public:
void markGLRebuild(LLGLUpdate* glu);
void markRebuild(LLSpatialGroup* group, BOOL priority = FALSE);
void markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE);
-
+ void markPartitionMove(LLDrawable* drawablep);
+
//get the object between start and end that's closest to start.
LLViewerObject* lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end,
BOOL pick_transparent,
@@ -211,6 +212,7 @@ public:
void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL); //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
void createObjects(F32 max_dtime);
void createObject(LLViewerObject* vobj);
+ void processPartitionQ();
void updateGeom(F32 max_dtime);
void updateGL();
void rebuildPriorityGroups();
@@ -524,7 +526,6 @@ public:
LLRenderTarget mEdgeMap;
LLRenderTarget mDeferredDepth;
LLRenderTarget mDeferredLight[3];
- LLMultisampleBuffer mSampleBuffer;
LLRenderTarget mGIMap;
LLRenderTarget mGIMapPost[2];
LLRenderTarget mLuminanceMap;
@@ -637,6 +638,9 @@ protected:
LLDrawable::drawable_list_t mBuildQ2; // non-priority
LLSpatialGroup::sg_vector_t mGroupQ1; //priority
LLSpatialGroup::sg_vector_t mGroupQ2; // non-priority
+
+ LLDrawable::drawable_list_t mPartitionQ; //drawables that need to update their spatial partition radius
+
bool mGroupQ2Locked;
bool mGroupQ1Locked;
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
index 278fe0eeea..1b64888271 100644
--- a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Sikkerhed" name="Media Settings Security">
<check_box initial_value="false" label="Tillad kun adgang til angivne URL mønstre" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Angivelser som hjemmesiden fejler imod er markeret:
+ Angivelser som hjemmesiden fejler imod er
+markeret:
</text>
<button label="Tilføj" name="whitelist_add"/>
<button label="Slet" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml
index 5369155cf9..ca4ee8981b 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -127,41 +127,41 @@ unterstützt [AMOUNT2] Objekte
<text name="region_name_label">
Region:
</text>
- <text left="680" left_delta="140" name="region_name_text">
+ <text name="region_name_text">
(unbekannt)
</text>
<text name="region_type_label">
Typ:
</text>
- <text left="680" left_delta="140" name="region_type_text">
+ <text name="region_type_text">
(unbekannt)
</text>
<text name="estate_name_label">
Grundbesitz:
</text>
- <text left="680" left_delta="140" name="estate_name_text">
+ <text name="estate_name_text">
(unbekannt)
</text>
- <text name="estate_owner_label" right="600" width="200">
+ <text name="estate_owner_label">
Grundbesitzer:
</text>
- <text left="680" left_delta="140" name="estate_owner_text">
+ <text name="estate_owner_text">
(unbekannt)
</text>
- <text left="410" name="resellable_changeable_label">
+ <text name="resellable_changeable_label">
Gekauftes Land in dieser Region:
</text>
- <text left="410" name="resellable_clause">
+ <text name="resellable_clause">
Wiederverkauf möglich oder nicht möglich.
</text>
- <text left="410" name="changeable_clause">
+ <text name="changeable_clause">
Darft oder darf nicht zusammengelegt/unterteilt werden.
</text>
- <text left="410" name="covenant_text">
+ <text name="covenant_text">
Sie müssen dem Grundbesitzvertrag zustimmen:
</text>
- <text left="470" name="covenant_timestamp_text"/>
- <text_editor left="470" name="covenant_editor">
+ <text name="covenant_timestamp_text"/>
+ <text_editor name="covenant_editor">
Wird geladen...
</text_editor>
<check_box label="Ich stimme dem obigen Vertrag zu." name="agree_covenant"/>
@@ -191,7 +191,7 @@ Objekte im Verkauf eingeschlossen
<text name="error_message">
Irgendetwas stimmt nicht.
</text>
- <button label="Gehe zu Website" name="error_web" top_delta="136"/>
+ <button label="Gehe zu Website" name="error_web" />
<text name="account_action">
Macht Sie zum Premium-Mitglied.
</text>
@@ -203,9 +203,8 @@ Objekte im Verkauf eingeschlossen
<combo_box.item label="7,50 US$/Monat, vierteljährliche Abrechnung" name="US$7.50/month,billedquarterly"/>
<combo_box.item label="6,00 US$/Monat, jährliche Abrechnung" name="US$6.00/month,billedannually"/>
</combo_box>
- <text height="36" name="land_use_action" top="270">
- Erhöhen Sie Ihre monatlichen Landnutzungsgebühren
-auf 40 US$/month.
+ <text name="land_use_action">
+ Erhöhen Sie Ihre monatlichen Landnutzungsgebühren auf 40 US$/month.
</text>
<text name="land_use_reason">
Sie besitzen 1309 m² Land.
diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml
index 91e0bb8133..49dcd4af51 100644
--- a/indra/newview/skins/default/xui/de/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/de/floater_postcard.xml
@@ -1,42 +1,36 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="FOTO EMAILEN">
- <text name="to_label">
- E-Mail des Empfängers:
- </text>
- <line_editor left_delta="145" name="to_form" width="125"/>
- <text name="from_label">
- Ihre E-Mail:
- </text>
- <line_editor left_delta="145" name="from_form" width="125"/>
- <text name="name_label">
- Ihr Name:
- </text>
- <line_editor left_delta="145" name="name_form" width="125"/>
- <text name="subject_label">
- Betreff:
- </text>
- <line_editor label="Betreff hier eingeben." left_delta="145" name="subject_form" width="125"/>
- <text name="msg_label">
- Nachricht:
- </text>
- <text_editor name="msg_form">
- Nachricht hier eingeben.
- </text_editor>
- <check_box label="Im Web veröffentlichen" name="allow_publish_check" tool_tip="Veröffentlicht diese Postkarte im Web."/>
- <check_box label="Ab-18-Inhalt" name="mature_check" tool_tip="Diese Postkarte enthält nicht jugendfreie Inhalte."/>
- <button label="?" name="publish_help_btn"/>
- <text name="fine_print" bottom_delta="21" height="140">
- Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
- </text>
- <button label="Abbrechen" name="cancel_btn"/>
- <button label="Senden" name="send_btn"/>
- <text name="default_subject">
- Postkarte aus [SECOND_LIFE].
- </text>
- <text name="default_message">
- Sehen Sie hier!
- </text>
- <string name="upload_message">
- Wird gesendet...
- </string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="FOTO EMAILEN">
+ <text name="to_label">
+ E-Mail des Empfängers:
+ </text>
+ <text name="from_label">
+ Ihre E-Mail:
+ </text>
+ <text name="name_label">
+ Ihr Name:
+ </text>
+ <text name="subject_label">
+ Betreff:
+ </text>
+ <line_editor label="Betreff hier eingeben." name="subject_form"/>
+ <text name="msg_label">
+ Nachricht:
+ </text>
+ <text_editor name="msg_form">
+ Nachricht hier eingeben.
+ </text_editor>
+ <text name="fine_print">
+ Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
+ </text>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Senden" name="send_btn"/>
+ <text name="default_subject">
+ Postkarte aus [SECOND_LIFE].
+ </text>
+ <text name="default_message">
+ Sehen Sie hier!
+ </text>
+ <string name="upload_message">
+ Wird gesendet...
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml
index 8f67fae464..646138eaad 100644
--- a/indra/newview/skins/default/xui/de/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml
@@ -5,16 +5,16 @@
<text name="info_parcel_label">
Parzelle:
</text>
- <text bottom_delta="-5" height="16" name="info_parcel" left="70">
+ <text name="info_parcel">
PARZELLENNAME
</text>
<text name="info_size_label">
Größe:
</text>
- <text bottom_delta="-21" height="32" name="info_size" left="70">
+ <text name="info_size">
[AREA] m².
</text>
- <text bottom_delta="-57" height="28" name="info_action">
+ <text name="info_action">
Zum Verkauf dieser Parzelle:
</text>
<text name="price_label">
@@ -32,13 +32,13 @@
<text name="price_per_m">
([PER_METER] L$ pro m²)
</text>
- <text bottom_delta="38" left="72" name="sell_to_label" right="-20">
+ <text name="sell_to_label">
2. Land verkaufen an:
</text>
- <text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10">
+ <text name="sell_to_text">
Offener Verkauf oder Verkauf an bestimmte Person?
</text>
- <combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140">
+ <combo_box name="sell_to">
<combo_box.item label="-- Auswählen --" name="--selectone--"/>
<combo_box.item label="An jeden" name="Anyone"/>
<combo_box.item label="An bestimmte Person:" name="Specificuser:"/>
@@ -50,15 +50,15 @@
<text name="sell_objects_text">
Die transferierbaren Landeigentümer-Objekte auf der Parzelle wechseln den Eigentümer.
</text>
- <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_group name="sell_objects">
<radio_item label="Nein, Objekte behalten" name="no"/>
<radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/>
</radio_group>
- <button label="Objekte anzeigen" name="show_objects" width="116"/>
+ <button label="Objekte anzeigen" name="show_objects"/>
<text name="nag_message_label">
ACHTUNG: Verkäufe sind endgültig.
</text>
- <button label="Zum Verkauf freigeben" name="sell_btn" width="180"/>
+ <button label="Zum Verkauf freigeben" name="sell_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/de/floater_top_objects.xml b/indra/newview/skins/default/xui/de/floater_top_objects.xml
index dad550227e..d2055a53db 100644
--- a/indra/newview/skins/default/xui/de/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/de/floater_top_objects.xml
@@ -39,21 +39,18 @@
<text name="id_text">
Objekt-ID:
</text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="false" follows="left|bottom|right" font="SansSerifSmall" height="20" left="80" name="id_editor" text_readonly_color="white" width="244"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Beacon anzeigen" name="show_beacon_btn" right="-10" width="110"/>
+ <button label="Beacon anzeigen" name="show_beacon_btn"/>
<text name="obj_name_text">
Objektname:
- </text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="false" follows="left|bottom|right" font="SansSerifSmall" height="20" left="80" name="object_name_editor" text_readonly_color="white" width="244"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Filter" name="filter_object_btn" right="-10" width="110"/>
+ </text>
+ <button label="Filter" name="filter_object_btn"/>
<text name="owner_name_text">
Eigentümer:
- </text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="true" follows="left|bottom|right" font="SansSerifSmall" height="20" left="106" name="owner_name_editor" text_readonly_color="white" width="218"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Filter" name="filter_owner_btn" right="-10" width="110"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Aktualisieren" name="refresh_btn" right="-10" width="110"/>
- <button bottom="35" follows="bottom|left" height="20" label="Auswahl zurückgeben" left="10" name="return_selected_btn" width="134"/>
- <button bottom="35" follows="bottom|left" height="20" label="Alle zurückgeben" left="150" name="return_all_btn" width="134"/>
- <button bottom="10" follows="bottom|left" height="20" label="Auswahl deaktivieren" left="10" name="disable_selected_btn" width="134"/>
- <button bottom="10" follows="bottom|left" height="20" label="Alle deaktivieren" left="150" name="disable_all_btn" width="134"/>
+ </text>
+ <button label="Filter" name="filter_owner_btn"/>
+ <button label="Aktualisieren" name="refresh_btn"/>
+ <button label="Auswahl zurückgeben" name="return_selected_btn" width="134"/>
+ <button label="Alle zurückgeben" left="150" name="return_all_btn" width="134"/>
+ <button label="Auswahl deaktivieren" name="disable_selected_btn" width="134"/>
+ <button label="Alle deaktivieren" left="150" name="disable_all_btn" width="134"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml
index 097a60a444..bb0dd9c75d 100644
--- a/indra/newview/skins/default/xui/de/floater_water.xml
+++ b/indra/newview/skins/default/xui/de/floater_water.xml
@@ -3,9 +3,10 @@
<floater.string name="WLDefaultWaterNames">
Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
</floater.string>
- <text name="KeyFramePresetsText" width="116">
+ <text name="KeyFramePresetsText" width="110">
Voreinstellungen:
</text>
+ <combo_box left_delta="110" name="WaterPresetsCombo"/>
<button label="Neu" label_selected="Neu" name="WaterNewPreset"/>
<button label="Speichern" label_selected="Speichern" name="WaterSavePreset"/>
<button label="Löschen" label_selected="Löschen" name="WaterDeletePreset"/>
diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml
index 8c1df04ed8..df423cc69a 100644
--- a/indra/newview/skins/default/xui/de/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml
@@ -49,7 +49,7 @@ Maximal 200 pro Gruppe täglich
Archivierte Mitteilung
</text>
<text name="lbl2">
- Um eine neue Mitteilung zu senden, klicken Sie die Schaltfläche +
+ Um eine neue Mitteilung zu senden, klicken Sie die + Neue Mitteilung
</text>
<text name="lbl3">
Betreff:
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index b56f150394..e21bed6bb5 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -11,7 +11,7 @@
<check_box label="Nur Freunde und Gruppen wissen, dass ich online bin" name="online_visibility"/>
<check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/>
<check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/>
- <check_box label="Meine Lieblingslandmarken bei Anmeldung anzeigen (im Dropdown-Menü „Hier anfangen“)" name="favorites_on_login_check"/>
+ <check_box label="Meine Lieblingslandmarken bei Anmeldung anzeigen (im Dropdown-Menü &#10;„Hier anfangen“)" name="favorites_on_login_check" top_pad="15"/>
<text name="Logs:">
Chatprotokolle:
</text>
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index 49deb9b025..9f6eac198b 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -299,7 +299,7 @@ Re-enter amount to see the latest exchange rate.
type="string"
font="SansSerifHuge"
left="165"
- width="170"
+ width="360"
height="25"
top="25"
name="info_cannot_buy">
diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml
index d5d4565ca1..ab81a86720 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml
@@ -204,7 +204,7 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="region_name_text"
top_delta="0"
use_ellipses="true"
@@ -237,7 +237,7 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="region_type_text"
top_delta="0"
width="175">
@@ -262,7 +262,7 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="estate_name_text"
top_delta="0"
width="175">
@@ -276,8 +276,8 @@ supports [AMOUNT2] objects
layout="topleft"
left="440"
name="estate_owner_label"
- right="550"
- width="100"
+ right="565"
+ width="120"
word_wrap="true">
Estate Owner:
</text>
@@ -287,7 +287,7 @@ supports [AMOUNT2] objects
follows="left|top"
height="20"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="estate_owner_text"
top_delta="0"
width="175">
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index dce55dae12..4677d014b8 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -83,6 +83,20 @@
</text>
</panel>
+ <check_box
+ height="16"
+ left_delta="0"
+ name="confirm_checkbox"
+ top_pad="15"
+ follows="bottom|left"
+ width="16" />
+
+ <text
+ height="30"
+ width="570"
+ word_wrap="true"
+ left_delta="25"
+ top_delta="0">I confirm that I have the appropriate rights to the material contained in this model. [secondlife:///app/floater/learn_more Learn more]</text>
<text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text>
diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml
index 619669d28a..38b305db7e 100644
--- a/indra/newview/skins/default/xui/en/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml
@@ -41,14 +41,14 @@
follows="top|left"
left="16"
name="info_parcel_label"
- width="48">
+ width="70">
Parcel:
</text>
<text
top_delta="0"
follows="top|left"
height="16"
- left="56"
+ left="78"
name="info_parcel"
right="-20">
PARCEL NAME
@@ -57,14 +57,14 @@
follows="top|left"
left="16"
name="info_size_label"
- width="48">
+ width="70">
Size:
</text>
<text
follows="top|left"
top_delta="0"
height="32"
- left="56"
+ left="78"
name="info_size"
right="-20">
[AREA] m²
@@ -164,14 +164,14 @@
left_delta="0"
name="sell_to_agent"
top_pad="4"
- width="170" />
+ width="150" />
<button
height="20"
label="Select"
left_pad="5"
name="sell_to_select_agent"
top_delta="0"
- width="60" />
+ width="90" />
<text
follows="top|left"
font="SansSerif"
@@ -199,20 +199,20 @@
<radio_item
bottom="40"
height="0"
- left="10"
+ left="2"
name="none"
visible="false" />
<radio_item
top_pad="10"
- height="16"
+ height="18"
label="No, keep ownership of objects"
- left="10"
+ left="2"
name="no" />
<radio_item
top_pad="10"
height="16"
label="Yes, sell objects with land"
- left="10"
+ left="2"
name="yes" />
</radio_group>
<button
@@ -221,7 +221,7 @@
name="show_objects"
left="70"
top_pad="10"
- width="110" />
+ width="140" />
<text
bottom_delta="30"
follows="top|left"
@@ -229,7 +229,7 @@
height="16"
left="16"
name="nag_message_label"
- right="-20">
+ right="-5">
REMEMBER: All sales are final.
</text>
<button
@@ -239,15 +239,15 @@
left_delta="0"
name="sell_btn"
top_pad="10"
- width="130" />
+ width="185" />
<button
follows="bottom|left"
height="20"
label="Cancel"
- left_pad="30"
+ left_pad="5"
name="cancel_btn"
top_delta="0"
- width="90" />
+ width="85" />
</panel>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index e413228ddc..ec190ab656 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -100,7 +100,7 @@
right="-5"
name="upload_btn"
top_delta="0"
- width="100" />
+ width="110" />
<flyout_button
follows="left|top"
height="23"
@@ -147,7 +147,7 @@
right="-5"
left_pad="5"
name="discard_btn"
- width="100" />
+ width="110" />
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 40bf7bfed7..f5f6b990d1 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2098,11 +2098,7 @@ even though the user gets a free copy.
label="Cylinder"
name="Cylinder"
value="Cylinder" />
- <combo_box.item
- label="Mesh"
- name="Mesh"
- value="Mesh" />
- </combo_box>
+ </combo_box>
</panel>
<panel
border="false"
diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml
index b06c6dc215..4dfdcd15c7 100644
--- a/indra/newview/skins/default/xui/en/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml
@@ -105,7 +105,7 @@
left_delta="0"
name="id_text"
top_pad="10"
- width="100">
+ width="107">
Object ID:
</text>
<line_editor
@@ -116,7 +116,7 @@
left_pad="3"
name="id_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
@@ -138,7 +138,7 @@
left="10"
top_pad="5"
name="obj_name_text"
- width="100">
+ width="107">
Object name:
</text>
<line_editor
@@ -148,7 +148,7 @@
left_pad="3"
name="object_name_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
@@ -170,7 +170,7 @@
left="10"
top_pad="5"
name="owner_name_text"
- width="100">
+ width="107">
Owner:
</text>
<line_editor
@@ -180,7 +180,7 @@
left_pad="3"
name="owner_name_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 600b0e3b71..607e1bb213 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -84,7 +84,7 @@ Maximum 200 per group daily
name="create_new_notice"
tool_tip="Create a new notice"
top_delta="0"
- width="93" />
+ width="127" />
<button
follows="top|left"
height="23"
@@ -128,7 +128,7 @@ Maximum 200 per group daily
layout="topleft"
name="lbl3"
top_pad="10"
- width="60">
+ width="62">
Subject:
</text>
<line_editor
@@ -141,7 +141,7 @@ Maximum 200 per group daily
max_length_bytes="63"
name="create_subject"
prevalidate_callback="ascii"
- width="220" />
+ width="218" />
<text
follows="left|top"
type="string"
@@ -151,7 +151,7 @@ Maximum 200 per group daily
left="10"
name="lbl4"
top_pad="5"
- width="60">
+ width="62">
Message:
</text>
<text_editor
@@ -162,7 +162,7 @@ Maximum 200 per group daily
max_length="511"
name="create_message"
top_delta="0"
- width="220"
+ width="218"
word_wrap="true" />
<text
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index 38e8b9844f..cdf14572fe 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -196,7 +196,7 @@
initial_val="256"
label=""
label_width="0"
- left_delta="40"
+ left_delta="68"
max_val="2048"
min_val="0"
mouse_opaque="true"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index cdc462109c..ea09286592 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -180,14 +180,14 @@
increment="1"
initial_value="23"
label="Nearby chat toasts life time:"
- label_width="190"
+ label_width="285"
layout="topleft"
left="45"
max_val="60"
min_val="1"
name="nearby_toasts_lifetime"
top_pad="10"
- width="230" />
+ width="325" />
<spinner
control_name="NearbyToastFadingTime"
decimal_digits="0"
@@ -196,14 +196,14 @@
increment="1"
initial_value="3"
label="Nearby chat toasts fading time:"
- label_width="190"
+ label_width="285"
layout="topleft"
left_delta="0"
max_val="60"
min_val="0"
name="nearby_toasts_fadingtime"
top_pad="3"
- width="230" />
+ width="325" />
<check_box
control_name="TranslateChat"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
index 8a37822413..7717872a6a 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -47,7 +47,7 @@
height="12"
name="font_colors"
top_pad="20"
- width="120"
+ width="170"
>
Chat font colors:
</text>
@@ -275,7 +275,7 @@
height="12"
name="bubble_chat"
top_pad="20"
- width="450"
+ width="495"
>
Name tag background color (also affects Bubble Chat):
</text>
@@ -320,7 +320,7 @@
height="12"
name="floater_opacity"
top_pad="15"
- width="120"
+ width="200"
>
Floater Opacity:
</text>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index f20ce52125..f7666bdc4c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -723,7 +723,7 @@
follows="left|top"
height="12"
layout="topleft"
- left="358"
+ left="407"
left_pad="-30"
name="TerrainDetailText"
top="250"
@@ -735,7 +735,7 @@
draw_border="false"
height="38"
layout="topleft"
- left_delta="0"
+ left_delta="5"
name="TerrainDetailRadio"
top_pad="5"
width="70">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
index 04412bdb9c..1a8aae7f91 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
@@ -195,7 +195,7 @@
left="0"
name="radio_teleport"
top_delta="20"
- width="100" />
+ width="110" />
<radio_item
height="16"
label="Auto-pilot"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index e374c89f21..91fe6f544c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -341,7 +341,7 @@
layout="topleft"
left="25"
name="voice_chat_settings"
- width="180"
+ width="200"
top_pad="7">
Voice Chat Settings
</text>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 2a6af23d3a..f8c90106b7 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -58,81 +58,81 @@
<string name="Quit">Quit</string>
<string name="create_account_url">http://join.secondlife.com/</string>
- <string name="LoginFailedViewerNotPermitted">
-The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
-http://secondlife.com/download
-
-For more information, see our FAQ below:
-http://secondlife.com/viewer-access-faq</string>
- <string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string>
- <string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string>
- <string name="LoginFailedAlreadyLoggedIn">This agent is already logged in.
-</string>
- <string name="LoginFailedAuthenticationFailed">Sorry! We couldn't log you in.
-Please check to make sure you entered the right
- * Username (like bobsmith12 or steller.sunshine)
- * Password
-Also, please make sure your Caps Lock key is off.</string>
- <string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
-Please go to your account page at http://secondlife.com/password
-and answer the security question to reset your password.
-We are very sorry for the inconvenience.</string>
- <string name="LoginFailedPasswordReset">We made some changes to our system and you will need to reset your password.
-Please go to your account page at http://secondlife.com/password
-and answer the security question to reset your password.
-We are very sorry for the inconvenience.</string>
- <string name="LoginFailedEmployeesOnly">Second Life is temporarily closed for maintenance.
-Logins are currently restricted to employees only.
-Check www.secondlife.com/status for updates.</string>
- <string name="LoginFailedPremiumOnly">Second Life logins are temporarily restricted in order to make sure that those in-world have the best possible experience.
-
-People with free accounts will not be able to access Second Life during this time, to make room for those who have paid for Second Life.</string>
- <string name="LoginFailedComputerProhibited">Second Life cannot be accessed from this computer.
-If you feel this is an error, please contact
-support@secondlife.com.</string>
- <string name="LoginFailedAcountSuspended">Your account is not accessible until
-[TIME] Pacific Time.</string>
- <string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
-Please contact Second Life support for assistance at http://secondlife.com/support.
-If you are unable to change your password, please call (866) 476-9763.</string>
- <string name="LoginFailedTransformError">Data inconsistency found during login.
-Please contact support@secondlife.com.</string>
- <string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
-Your account is not accessible until
-[TIME] Pacific Time.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LoginFailedPendingLogoutFault">Request for logout responded with a fault from simulator.</string>
- <string name="LoginFailedPendingLogout">The system is logging you out right now.
-Your Account will not be available until
-[TIME] Pacific Time.</string>
- <string name="LoginFailedUnableToCreateSession">Unable to create valid session.</string>
- <string name="LoginFailedUnableToConnectToSimulator">Unable to connect to a simulator.</string>
- <string name="LoginFailedRestrictedHours">Your account can only access Second Life
-between [START] and [END] Pacific Time.
-Please come back during those hours.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LoginFailedIncorrectParameters">Incorrect parameters.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LoginFailedFirstNameNotAlphanumeric">First name parameter must be alphanumeric.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LoginFailedLastNameNotAlphanumeric">Last name parameter must be alphanumeric.
-If you feel this is an error, please contact support@secondlife.com.</string>
- <string name="LogoutFailedRegionGoingOffline">Region is going offline.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedAgentNotInRegion">Agent not in region.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedPendingLogin">The region was logging in another session.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedLoggingOut">The region was logging out the previous session.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedStillLoggingOut">The region is still logging out the previous session.
-Please try logging in again in a minute.</string>
- <string name="LogoutSucceeded">Region has logged out last session.
-Please try logging in again in a minute.</string>
- <string name="LogoutFailedLogoutBegun">Region has begun the logout process.
-Please try logging in again in a minute.</string>
- <string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
-Please try logging in again in a minute.</string>
+ <string name="LoginFailedViewerNotPermitted">
+The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
+http://secondlife.com/download
+
+For more information, see our FAQ below:
+http://secondlife.com/viewer-access-faq</string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string>
+ <string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string>
+ <string name="LoginFailedAlreadyLoggedIn">This agent is already logged in.
+</string>
+ <string name="LoginFailedAuthenticationFailed">Sorry! We couldn't log you in.
+Please check to make sure you entered the right
+ * Username (like bobsmith12 or steller.sunshine)
+ * Password
+Also, please make sure your Caps Lock key is off.</string>
+ <string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+ <string name="LoginFailedPasswordReset">We made some changes to our system and you will need to reset your password.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+ <string name="LoginFailedEmployeesOnly">Second Life is temporarily closed for maintenance.
+Logins are currently restricted to employees only.
+Check www.secondlife.com/status for updates.</string>
+ <string name="LoginFailedPremiumOnly">Second Life logins are temporarily restricted in order to make sure that those in-world have the best possible experience.
+
+People with free accounts will not be able to access Second Life during this time, to make room for those who have paid for Second Life.</string>
+ <string name="LoginFailedComputerProhibited">Second Life cannot be accessed from this computer.
+If you feel this is an error, please contact
+support@secondlife.com.</string>
+ <string name="LoginFailedAcountSuspended">Your account is not accessible until
+[TIME] Pacific Time.</string>
+ <string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
+Please contact Second Life support for assistance at http://secondlife.com/support.
+If you are unable to change your password, please call (866) 476-9763.</string>
+ <string name="LoginFailedTransformError">Data inconsistency found during login.
+Please contact support@secondlife.com.</string>
+ <string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
+Your account is not accessible until
+[TIME] Pacific Time.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedPendingLogoutFault">Request for logout responded with a fault from simulator.</string>
+ <string name="LoginFailedPendingLogout">The system is logging you out right now.
+Your Account will not be available until
+[TIME] Pacific Time.</string>
+ <string name="LoginFailedUnableToCreateSession">Unable to create valid session.</string>
+ <string name="LoginFailedUnableToConnectToSimulator">Unable to connect to a simulator.</string>
+ <string name="LoginFailedRestrictedHours">Your account can only access Second Life
+between [START] and [END] Pacific Time.
+Please come back during those hours.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedIncorrectParameters">Incorrect parameters.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">First name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedLastNameNotAlphanumeric">Last name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LogoutFailedRegionGoingOffline">Region is going offline.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedAgentNotInRegion">Agent not in region.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedPendingLogin">The region was logging in another session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedLoggingOut">The region was logging out the previous session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedStillLoggingOut">The region is still logging out the previous session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutSucceeded">Region has logged out last session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedLogoutBegun">Region has begun the logout process.
+Please try logging in again in a minute.</string>
+ <string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
+Please try logging in again in a minute.</string>
<!-- Disconnection -->
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 9ec9fcc581..c3f4310103 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -1,484 +1,484 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="ACERCA DEL TERRENO">
- <floater.string name="maturity_icon_general">
- &quot;Parcel_PG_Dark&quot;
- </floater.string>
- <floater.string name="maturity_icon_moderate">
- &quot;Parcel_M_Dark&quot;
- </floater.string>
- <floater.string name="maturity_icon_adult">
- &quot;Parcel_R_Dark&quot;
- </floater.string>
- <floater.string name="Minutes">
- [MINUTES] minutos
- </floater.string>
- <floater.string name="Minute">
- minuto
- </floater.string>
- <floater.string name="Seconds">
- [SECONDS] segundos
- </floater.string>
- <floater.string name="Remaining">
- restantes
- </floater.string>
- <tab_container name="landtab">
- <panel label="GENERAL" name="land_general_panel">
- <panel.string name="new users only">
- Sólo nuevos Residentes
- </panel.string>
- <panel.string name="anyone">
- Cualquiera
- </panel.string>
- <panel.string name="area_text">
- Superficie
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- ID de la subasta: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Debe aprobar su compra para modificar este terreno.
- </panel.string>
- <panel.string name="group_owned_text">
- (Propiedad del grupo)
- </panel.string>
- <panel.string name="profile_text">
- Perfil...
- </panel.string>
- <panel.string name="info_text">
- Información...
- </panel.string>
- <panel.string name="public_text">
- (público)
- </panel.string>
- <panel.string name="none_text">
- (ninguno)
- </panel.string>
- <panel.string name="sale_pending_text">
- (Venta pendiente)
- </panel.string>
- <panel.string name="no_selection_text">
- No se ha seleccionado una parcela.
-Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver sus características.
- </panel.string>
- <panel.string name="time_stamp_template">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </panel.string>
- <text name="Name:">
- Nombre:
- </text>
- <text name="Description:">
- Descripción:
- </text>
- <text name="LandType">
- Tipo:
- </text>
- <text name="LandTypeText">
- Mainland / Homestead
- </text>
- <text name="ContentRating">
- Calificación:
- </text>
- <text name="ContentRatingText">
- Adulto
- </text>
- <text name="Owner:">
- Propietario:
- </text>
- <text name="Group:">
- Grupo:
- </text>
- <button label="Configurar" name="Set..."/>
- <check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/>
- <button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/>
- <check_box label="El propietario hace una contribución transfiriendo" name="check contrib" tool_tip="Cuando el terreno se transfiere al grupo, el antiguo propietario contribuye con una asignación suficiente de terreno."/>
- <text name="For Sale:">
- En venta:
- </text>
- <text name="Not for sale.">
- No está en venta.
- </text>
- <text name="For Sale: Price L$[PRICE].">
- Precio: [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
- </text>
- <button label="Vender el terreno" name="Sell Land..."/>
- <text name="For sale to">
- En venta a: [BUYER]
- </text>
- <text name="Sell with landowners objects in parcel." width="216">
- Los objetos se incluyen en la venta.
- </text>
- <text name="Selling with no objects in parcel." width="216">
- Los objetos no se incluyen en la venta.
- </text>
- <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/>
- <text name="Claimed:">
- Reclamada:
- </text>
- <text name="DateClaimText">
- Mar 15 Ago 15 13:47:25 2006
- </text>
- <text name="PriceLabel">
- Superficie:
- </text>
- <text name="PriceText">
- 4048 m²
- </text>
- <text name="Traffic:">
- Tráfico:
- </text>
- <text name="DwellText">
- 0
- </text>
- <button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
- <button label="Información del script" name="Scripts..."/>
- <button label="Comprar para el grupo" name="Buy For Group..."/>
- <button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
- <button label="Abandonar el terreno" name="Abandon Land..."/>
- <button label="Reclamar el terreno" name="Reclaim Land..."/>
- <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
- </panel>
- <panel label="CONTRATO" name="land_covenant_panel">
- <panel.string name="can_resell">
- El terreno comprado en esta región se podrá revender.
- </panel.string>
- <panel.string name="can_not_resell">
- El terreno comprado en esta región no se podrá revender.
- </panel.string>
- <panel.string name="can_change">
- El terreno comprado en esta región se podrá unir o dividir.
- </panel.string>
- <panel.string name="can_not_change">
- El terreno comprado en esta región no se podrá unir o dividir.
- </panel.string>
- <text name="estate_section_lbl">
- Estado:
- </text>
- <text name="estate_name_text">
- mainland
- </text>
- <text name="estate_owner_lbl">
- Propietario:
- </text>
- <text name="estate_owner_text">
- (nadie)
- </text>
- <text_editor name="covenant_editor">
- No se ha aportado un contrato para este estado.
- </text_editor>
- <text name="covenant_timestamp_text">
- Última modificación, Dic Miér 31 16:00:00 1969
- </text>
- <text name="region_section_lbl">
- Región:
- </text>
- <text name="region_name_text">
- leyla
- </text>
- <text name="region_landtype_lbl">
- Tipo:
- </text>
- <text name="region_landtype_text">
- Mainland / Homestead
- </text>
- <text name="region_maturity_lbl">
- Calificación:
- </text>
- <text name="region_maturity_text">
- Adulto
- </text>
- <text name="resellable_lbl">
- Revender:
- </text>
- <text name="resellable_clause">
- El terreno de esta región no se podrá revender.
- </text>
- <text name="changeable_lbl">
- Dividir:
- </text>
- <text name="changeable_clause">
- El terreno de esta región no se podrá unir/dividir.
- </text>
- </panel>
- <panel label="OBJETOS" name="land_objects_panel">
- <panel.string name="objects_available_text">
- [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] de un máx. de [MAX] ([DELETED] se borrarán)
- </panel.string>
- <text name="parcel_object_bonus">
- Plus de objetos en la región: [BONUS]
- </text>
- <text name="Simulator primitive usage:">
- Uso de primitivas:
- </text>
- <text name="objects_available">
- [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
- </text>
- <text name="Primitives parcel supports:">
- Prims que admite la parcela:
- </text>
- <text name="object_contrib_text">
- [COUNT]
- </text>
- <text name="Primitives on parcel:">
- Prims en la parcela:
- </text>
- <text name="total_objects_text">
- [COUNT]
- </text>
- <text name="Owned by parcel owner:">
- Del propietario de la parcela:
- </text>
- <text name="owner_objects_text">
- [COUNT]
- </text>
- <button label="Mostrar" label_selected="Mostrar" name="ShowOwner"/>
- <button label="Devolver" name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios."/>
- <text name="Set to group:">
- Del grupo:
- </text>
- <text name="group_objects_text">
- [COUNT]
- </text>
- <button label="Mostrar" label_selected="Mostrar" name="ShowGroup"/>
- <button label="Devolver" name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios."/>
- <text name="Owned by others:">
- Propiedad de otros:
- </text>
- <text name="other_objects_text">
- [COUNT]
- </text>
- <button label="Mostrar" label_selected="Mostrar" name="ShowOther"/>
- <button label="Devolver" name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios."/>
- <text name="Selected / sat upon:">
- Seleccionados / con gente sentada:
- </text>
- <text name="selected_objects_text">
- [COUNT]
- </text>
- <text name="Autoreturn">
- Devolución automát. de objetos de otros (en min., 0 la desactiva):
- </text>
- <line_editor name="clean other time"/>
- <text name="Object Owners:">
- Propietarios de los objetos:
- </text>
- <button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" tool_tip="Refresh Object List"/>
- <button label="Devolver los objetos" name="Return objects..."/>
- <name_list name="owner list">
- <name_list.columns label="Tipo" name="type"/>
- <name_list.columns label="Nombre" name="name"/>
- <name_list.columns label="Núm." name="count"/>
- <name_list.columns label="Más recientes" name="mostrecent"/>
- </name_list>
- </panel>
- <panel label="OPCIONES" name="land_options_panel">
- <panel.string name="search_enabled_tooltip">
- Permitir que aparezca esta parcela en los resultados de la búsqueda
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Esta opción está desactivada porque la parcela tiene 128 m² o menos.
-Sólo las parcelas más grandes pueden listarse en la búsqueda.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
- </panel.string>
- <panel.string name="mature_check_mature">
- Contenido Moderado
- </panel.string>
- <panel.string name="mature_check_adult">
- Contenido Adulto
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- La información o el contenido de su parcela se considera Moderado.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- La información o el contenido de su parcela se considera Adulto.
- </panel.string>
- <panel.string name="landing_point_none">
- (ninguno)
- </panel.string>
- <panel.string name="push_restrict_text">
- Sin &apos;empujones&apos;
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Sin &apos;empujones&apos; (prevalece lo marcado en la región)
- </panel.string>
- <text name="allow_label">
- Permitir a otros Residentes:
- </text>
- <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
- <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
- <text name="allow_label2">
- Crear objetos:
- </text>
- <check_box label="Todos los residentes" name="edit objects check"/>
- <check_box label="El grupo" name="edit group objects check"/>
- <text name="allow_label3">
- Dejar objetos:
- </text>
- <check_box label="Todos los residentes" name="all object entry check"/>
- <check_box label="El grupo" name="group object entry check"/>
- <text name="allow_label4">
- Ejecutar scripts:
- </text>
- <check_box label="Todos los residentes" name="check other scripts"/>
- <check_box label="El grupo" name="check group scripts"/>
- <text name="land_options_label">
- Opciones del terreno:
- </text>
- <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
- <check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
- <check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
- <combo_box name="land category with adult">
- <combo_box.item label="Cualquier categoría" name="item0"/>
- <combo_box.item label="Localización Linden" name="item1"/>
- <combo_box.item label="Adulto" name="item2"/>
- <combo_box.item label="Arte y Cultura" name="item3"/>
- <combo_box.item label="Negocios" name="item4"/>
- <combo_box.item label="Educativo" name="item5"/>
- <combo_box.item label="Juegos de azar" name="item6"/>
- <combo_box.item label="Entretenimiento" name="item7"/>
- <combo_box.item label="Para recién llegados" name="item8"/>
- <combo_box.item label="Parques y Naturaleza" name="item9"/>
- <combo_box.item label="Residencial" name="item10"/>
- <combo_box.item label="Compras" name="item11"/>
- <combo_box.item label="Terreno en alquiler" name="item13"/>
- <combo_box.item label="Otra" name="item12"/>
- </combo_box>
- <combo_box name="land category">
- <combo_box.item label="Cualquier categoría" name="item0"/>
- <combo_box.item label="Localización Linden" name="item1"/>
- <combo_box.item label="Arte y Cultura" name="item3"/>
- <combo_box.item label="Negocios" name="item4"/>
- <combo_box.item label="Educativo" name="item5"/>
- <combo_box.item label="Juegos de azar" name="item6"/>
- <combo_box.item label="Entretenimiento" name="item7"/>
- <combo_box.item label="Para recién llegados" name="item8"/>
- <combo_box.item label="Parques y Naturaleza" name="item9"/>
- <combo_box.item label="Residencial" name="item10"/>
- <combo_box.item label="Compras" name="item11"/>
- <combo_box.item label="Terreno en alquiler" name="item13"/>
- <combo_box.item label="Otra" name="item12"/>
- </combo_box>
- <check_box label="Contenido Moderado" name="MatureCheck" tool_tip=""/>
- <text name="Snapshot:">
- Foto:
- </text>
- <texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
- <text name="landing_point">
- Punto de llegada: [LANDING]
- </text>
- <button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/>
- <button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/>
- <text name="Teleport Routing: ">
- Punto de teleporte:
- </text>
- <combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes.">
- <combo_box.item label="Bloqueado" name="Blocked"/>
- <combo_box.item label="Punto de llegada" name="LandingPoint"/>
- <combo_box.item label="Cualquiera" name="Anywhere"/>
- </combo_box>
- </panel>
- <panel label="MEDIA" name="land_media_panel">
- <text name="with media:" width="85">
- Tipo de media:
- </text>
- <combo_box left="97" name="media type" tool_tip="Especifique si la URL es una película, una web, u otro media"/>
- <text name="at URL:" width="85">
- Página inicial:
- </text>
- <line_editor left="97" name="media_url"/>
- <button label="Definir" name="set_media_url"/>
- <text name="Description:">
- Descripción:
- </text>
- <line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/>
- <text name="Media texture:">
- Cambiar
-la textura:
- </text>
- <texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/>
- <text name="replace_texture_help" width="285">
- Cuando pulses la flecha &apos;play&apos;, los objetos que usen esta textura mostrarán la película o la página web. Selecciona la miniatura para elegir una textura distinta.
- </text>
- <check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
- <text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120">
- Tamaño del media:
- </text>
- <spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
- <spinner name="media_size_height" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
- <text name="pixels">
- píxeles
- </text>
- <text name="Options:">
- Opciones de
-los media:
- </text>
- <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
- </panel>
- <panel label="SONIDO" name="land_audio_panel">
- <text name="MusicURL:">
- URL de música:
- </text>
- <text name="Sound:">
- Sonido:
- </text>
- <check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/>
- <text name="Voice settings:">
- Voz:
- </text>
- <check_box label="Activar la voz" name="parcel_enable_voice_channel"/>
- <check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/>
- </panel>
- <panel label="ACCESO" name="land_access_panel">
- <panel.string name="access_estate_defined">
- (Definido por el Estado)
- </panel.string>
- <panel.string name="allow_public_access">
- Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán líneas de prohibición)
- </panel.string>
- <panel.string name="estate_override">
- Una o más de esta opciones está configurada a nivel del estado
- </panel.string>
- <text name="Limit access to this parcel to:">
- Acceso a esta parcela
- </text>
- <check_box label="Permitir el acceso público [MATURITY]" name="public_access"/>
- <text name="Only Allow">
- Restringir el acceso a residentes verificados con:
- </text>
- <check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
- <check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
- <check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
- <check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/>
- <combo_box name="pass_combo">
- <combo_box.item label="Cualquiera" name="Anyone"/>
- <combo_box.item label="Grupo" name="Group"/>
- </combo_box>
- <spinner label="Precio en L$:" name="PriceSpin"/>
- <spinner label="Horas de acceso:" name="HoursSpin"/>
- <panel name="Allowed_layout_panel">
- <text label="Always Allow" name="AllowedText">
- Residentes autorizados
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
- <button label="Añadir" name="add_allowed"/>
- <button label="Quitar" label_selected="Quitar" name="remove_allowed"/>
- </panel>
- <panel name="Banned_layout_panel">
- <text label="Ban" name="BanCheck">
- Residentes con el acceso prohibido
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
- <button label="Añadir" name="add_banned"/>
- <button label="Quitar" label_selected="Quitar" name="remove_banned"/>
- </panel>
- </panel>
- </tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="ACERCA DEL TERRENO">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] minutos
+ </floater.string>
+ <floater.string name="Minute">
+ minuto
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] segundos
+ </floater.string>
+ <floater.string name="Remaining">
+ restantes
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="GENERAL" name="land_general_panel">
+ <panel.string name="new users only">
+ Sólo nuevos Residentes
+ </panel.string>
+ <panel.string name="anyone">
+ Cualquiera
+ </panel.string>
+ <panel.string name="area_text">
+ Superficie
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ ID de la subasta: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Debe aprobar su compra para modificar este terreno.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Propiedad del grupo)
+ </panel.string>
+ <panel.string name="profile_text">
+ Perfil...
+ </panel.string>
+ <panel.string name="info_text">
+ Información...
+ </panel.string>
+ <panel.string name="public_text">
+ (público)
+ </panel.string>
+ <panel.string name="none_text">
+ (ninguno)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Venta pendiente)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ No se ha seleccionado una parcela.
+Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver sus características.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="Name:">
+ Nombre:
+ </text>
+ <text name="Description:">
+ Descripción:
+ </text>
+ <text name="LandType">
+ Tipo:
+ </text>
+ <text name="LandTypeText">
+ Mainland / Homestead
+ </text>
+ <text name="ContentRating">
+ Calificación:
+ </text>
+ <text name="ContentRatingText">
+ Adulto
+ </text>
+ <text name="Owner:">
+ Propietario:
+ </text>
+ <text name="Group:">
+ Grupo:
+ </text>
+ <button label="Configurar" name="Set..."/>
+ <check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/>
+ <button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/>
+ <check_box label="El propietario hace una contribución transfiriendo" name="check contrib" tool_tip="Cuando el terreno se transfiere al grupo, el antiguo propietario contribuye con una asignación suficiente de terreno."/>
+ <text name="For Sale:">
+ En venta:
+ </text>
+ <text name="Not for sale.">
+ No está en venta.
+ </text>
+ <text name="For Sale: Price L$[PRICE].">
+ Precio: [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
+ </text>
+ <button label="Vender el terreno" name="Sell Land..."/>
+ <text name="For sale to">
+ En venta a: [BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel." width="216">
+ Los objetos se incluyen en la venta.
+ </text>
+ <text name="Selling with no objects in parcel." width="216">
+ Los objetos no se incluyen en la venta.
+ </text>
+ <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ Reclamada:
+ </text>
+ <text name="DateClaimText">
+ Mar 15 Ago 15 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ Superficie:
+ </text>
+ <text name="PriceText">
+ 4048 m²
+ </text>
+ <text name="Traffic:">
+ Tráfico:
+ </text>
+ <text name="DwellText">
+ 0
+ </text>
+ <button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
+ <button label="Información del script" name="Scripts..."/>
+ <button label="Comprar para el grupo" name="Buy For Group..."/>
+ <button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
+ <button label="Abandonar el terreno" name="Abandon Land..."/>
+ <button label="Reclamar el terreno" name="Reclaim Land..."/>
+ <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
+ </panel>
+ <panel label="CONTRATO" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ El terreno comprado en esta región se podrá revender.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ El terreno comprado en esta región no se podrá revender.
+ </panel.string>
+ <panel.string name="can_change">
+ El terreno comprado en esta región se podrá unir o dividir.
+ </panel.string>
+ <panel.string name="can_not_change">
+ El terreno comprado en esta región no se podrá unir o dividir.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Estado:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ Propietario:
+ </text>
+ <text name="estate_owner_text">
+ (nadie)
+ </text>
+ <text_editor name="covenant_editor">
+ No se ha aportado un contrato para este estado.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ Última modificación, Dic Miér 31 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ Región:
+ </text>
+ <text name="region_name_text">
+ leyla
+ </text>
+ <text name="region_landtype_lbl">
+ Tipo:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ Calificación:
+ </text>
+ <text name="region_maturity_text">
+ Adulto
+ </text>
+ <text name="resellable_lbl">
+ Revender:
+ </text>
+ <text name="resellable_clause">
+ El terreno de esta región no se podrá revender.
+ </text>
+ <text name="changeable_lbl">
+ Dividir:
+ </text>
+ <text name="changeable_clause">
+ El terreno de esta región no se podrá unir/dividir.
+ </text>
+ </panel>
+ <panel label="OBJETOS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] de un máx. de [MAX] ([DELETED] se borrarán)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ Plus de objetos en la región: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ Uso de primitivas:
+ </text>
+ <text name="objects_available">
+ [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
+ </text>
+ <text name="Primitives parcel supports:">
+ Prims que admite la parcela:
+ </text>
+ <text name="object_contrib_text">
+ [COUNT]
+ </text>
+ <text name="Primitives on parcel:">
+ Prims en la parcela:
+ </text>
+ <text name="total_objects_text">
+ [COUNT]
+ </text>
+ <text name="Owned by parcel owner:">
+ Del propietario de la parcela:
+ </text>
+ <text name="owner_objects_text">
+ [COUNT]
+ </text>
+ <button label="Mostrar" label_selected="Mostrar" name="ShowOwner"/>
+ <button label="Devolver" name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios."/>
+ <text name="Set to group:">
+ Del grupo:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="Mostrar" label_selected="Mostrar" name="ShowGroup"/>
+ <button label="Devolver" name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios."/>
+ <text name="Owned by others:">
+ Propiedad de otros:
+ </text>
+ <text name="other_objects_text">
+ [COUNT]
+ </text>
+ <button label="Mostrar" label_selected="Mostrar" name="ShowOther"/>
+ <button label="Devolver" name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios."/>
+ <text name="Selected / sat upon:">
+ Seleccionados / con gente sentada:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ Devolución automát. de objetos de otros (en min., 0 la desactiva):
+ </text>
+ <line_editor name="clean other time"/>
+ <text name="Object Owners:">
+ Propietarios de los objetos:
+ </text>
+ <button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" tool_tip="Refresh Object List"/>
+ <button label="Devolver los objetos" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Tipo" name="type"/>
+ <name_list.columns label="Nombre" name="name"/>
+ <name_list.columns label="Núm." name="count"/>
+ <name_list.columns label="Más recientes" name="mostrecent"/>
+ </name_list>
+ </panel>
+ <panel label="OPCIONES" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Permitir que aparezca esta parcela en los resultados de la búsqueda
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Esta opción está desactivada porque la parcela tiene 128 m² o menos.
+Sólo las parcelas más grandes pueden listarse en la búsqueda.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Contenido Moderado
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Contenido Adulto
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ La información o el contenido de su parcela se considera Moderado.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ La información o el contenido de su parcela se considera Adulto.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (ninguno)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Sin &apos;empujones&apos;
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Sin &apos;empujones&apos; (prevalece lo marcado en la región)
+ </panel.string>
+ <text name="allow_label">
+ Permitir a otros Residentes:
+ </text>
+ <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
+ <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
+ <text name="allow_label2">
+ Crear objetos:
+ </text>
+ <check_box label="Todos los residentes" name="edit objects check"/>
+ <check_box label="El grupo" name="edit group objects check"/>
+ <text name="allow_label3">
+ Dejar objetos:
+ </text>
+ <check_box label="Todos los residentes" name="all object entry check"/>
+ <check_box label="El grupo" name="group object entry check"/>
+ <text name="allow_label4">
+ Ejecutar scripts:
+ </text>
+ <check_box label="Todos los residentes" name="check other scripts"/>
+ <check_box label="El grupo" name="check group scripts"/>
+ <text name="land_options_label">
+ Opciones del terreno:
+ </text>
+ <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
+ <check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
+ <check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
+ <combo_box name="land category with adult">
+ <combo_box.item label="Cualquier categoría" name="item0"/>
+ <combo_box.item label="Localización Linden" name="item1"/>
+ <combo_box.item label="Adulto" name="item2"/>
+ <combo_box.item label="Arte y Cultura" name="item3"/>
+ <combo_box.item label="Negocios" name="item4"/>
+ <combo_box.item label="Educativo" name="item5"/>
+ <combo_box.item label="Juegos de azar" name="item6"/>
+ <combo_box.item label="Entretenimiento" name="item7"/>
+ <combo_box.item label="Para recién llegados" name="item8"/>
+ <combo_box.item label="Parques y Naturaleza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Terreno en alquiler" name="item13"/>
+ <combo_box.item label="Otra" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="Cualquier categoría" name="item0"/>
+ <combo_box.item label="Localización Linden" name="item1"/>
+ <combo_box.item label="Arte y Cultura" name="item3"/>
+ <combo_box.item label="Negocios" name="item4"/>
+ <combo_box.item label="Educativo" name="item5"/>
+ <combo_box.item label="Juegos de azar" name="item6"/>
+ <combo_box.item label="Entretenimiento" name="item7"/>
+ <combo_box.item label="Para recién llegados" name="item8"/>
+ <combo_box.item label="Parques y Naturaleza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Terreno en alquiler" name="item13"/>
+ <combo_box.item label="Otra" name="item12"/>
+ </combo_box>
+ <check_box label="Contenido Moderado" name="MatureCheck" tool_tip=""/>
+ <text name="Snapshot:">
+ Foto:
+ </text>
+ <texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
+ <text name="landing_point">
+ Punto de llegada: [LANDING]
+ </text>
+ <button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/>
+ <button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/>
+ <text name="Teleport Routing: ">
+ Punto de teleporte:
+ </text>
+ <combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes.">
+ <combo_box.item label="Bloqueado" name="Blocked"/>
+ <combo_box.item label="Punto de llegada" name="LandingPoint"/>
+ <combo_box.item label="Cualquiera" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="MEDIA" name="land_media_panel">
+ <text name="with media:" width="85">
+ Tipo de media:
+ </text>
+ <combo_box left="97" name="media type" tool_tip="Especifique si la URL es una película, una web, u otro media"/>
+ <text name="at URL:" width="85">
+ Página inicial:
+ </text>
+ <line_editor left="97" name="media_url"/>
+ <button label="Definir" name="set_media_url"/>
+ <text name="Description:">
+ Descripción:
+ </text>
+ <line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/>
+ <text name="Media texture:">
+ Cambiar
+la textura:
+ </text>
+ <texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/>
+ <text name="replace_texture_help" width="285">
+ Cuando pulses la flecha &apos;play&apos;, los objetos que usen esta textura mostrarán la película o la página web. Selecciona la miniatura para elegir una textura distinta.
+ </text>
+ <check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
+ <text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120">
+ Tamaño del media:
+ </text>
+ <spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
+ <spinner name="media_size_height" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
+ <text name="pixels">
+ píxeles
+ </text>
+ <text name="Options:">
+ Opciones de
+los media:
+ </text>
+ <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
+ </panel>
+ <panel label="SONIDO" name="land_audio_panel">
+ <text name="MusicURL:">
+ URL de música:
+ </text>
+ <text name="Sound:">
+ Sonido:
+ </text>
+ <check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/>
+ <text name="Voice settings:">
+ Voz:
+ </text>
+ <check_box label="Activar la voz" name="parcel_enable_voice_channel"/>
+ <check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ACCESO" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Definido por el Estado)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán líneas de prohibición)
+ </panel.string>
+ <panel.string name="estate_override">
+ Una o más de esta opciones está configurada a nivel del estado
+ </panel.string>
+ <text name="Limit access to this parcel to:">
+ Acceso a esta parcela
+ </text>
+ <check_box label="Permitir el acceso público [MATURITY]" name="public_access"/>
+ <text name="Only Allow">
+ Restringir el acceso a residentes verificados con:
+ </text>
+ <check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
+ <check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
+ <check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
+ <check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Cualquiera" name="Anyone"/>
+ <combo_box.item label="Grupo" name="Group"/>
+ </combo_box>
+ <spinner label="Precio en L$:" name="PriceSpin"/>
+ <spinner label="Horas de acceso:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Always Allow" name="AllowedText">
+ Residentes autorizados
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
+ <button label="Añadir" name="add_allowed"/>
+ <button label="Quitar" label_selected="Quitar" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Ban" name="BanCheck">
+ Residentes con el acceso prohibido
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
+ <button label="Añadir" name="add_banned"/>
+ <button label="Quitar" label_selected="Quitar" name="remove_banned"/>
+ </panel>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml
index 74243a4d06..9d33b69de9 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml
@@ -129,25 +129,25 @@ para cubrir esta parcela.
<text name="region_name_label">
Región:
</text>
- <text left="565" name="region_name_text">
+ <text name="region_name_text">
(desconocida)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text left="565" name="region_type_text">
+ <text name="region_type_text">
(desconocido)
</text>
<text name="estate_name_label">
Estado:
</text>
- <text left="565" name="estate_name_text">
+ <text name="estate_name_text">
(desconocido)
</text>
- <text name="estate_owner_label" right="565" width="115">
+ <text name="estate_owner_label">
Propietario del estado:
</text>
- <text left="565" name="estate_owner_text">
+ <text name="estate_owner_text">
(desconocido)
</text>
<text name="resellable_changeable_label">
diff --git a/indra/newview/skins/default/xui/es/floater_postcard.xml b/indra/newview/skins/default/xui/es/floater_postcard.xml
index df94486c0e..b5b9805fe2 100644
--- a/indra/newview/skins/default/xui/es/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/es/floater_postcard.xml
@@ -1,29 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Postcard" title="FOTO POR CORREO">
<text name="to_label">
- Correo electrónico
- del destinatario:
- </text>
- <line_editor bottom_delta="-20" name="to_form"/>
- <text bottom_delta="-12" name="from_label">
- Su correo
- electrónico:
- </text>
- <line_editor bottom_delta="-20" name="from_form"/>
+ Correo del destinatario:
+ </text>
+ <text name="from_label">
+ Su correo:
+ </text>
<text name="name_label">
Su nombre:
- </text>
+ </text>
<text name="subject_label">
Asunto:
</text>
<line_editor label="Escriba aquí el asunto." name="subject_form"/>
- <text bottom_delta="-18" name="msg_label">
+ <text name="msg_label">
Mensaje:
</text>
<text_editor name="msg_form">
Escriba aquí el mensaje.
</text_editor>
- <text bottom_delta="-21" name="fine_print">
+ <text name="fine_print">
Si su destinatario se registra en [SECOND_LIFE],
usted conseguirá un bono de referido.
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_animation.xml b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
index 6b8c8b6ff5..c3f377a71a 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Descripción:
</text>
- <button label="Ver en el mundo" label_selected="Parar" left="12" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="142"/>
- <button label="Ejecutarla para usted" label_selected="Parar" left="156" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="136"/>
+ <button label="Ver en el mundo" label_selected="Parar" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="130"/>
+ <button label="Ejecutarla para usted" label_selected="Parar" left="135" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="130"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
index c541b0f98b..dc5d430375 100644
--- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
@@ -1,103 +1,103 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN">
- <floater.string name="Screenshot">
- Captura de pantalla
- </floater.string>
- <check_box label="Usar esta captura de pantalla" name="screen_check"/>
- <text name="reporter_title">
- Denunciante:
- </text>
- <text name="reporter_field">
- Loremipsum Dolorsitamut Longnamez
- </text>
- <text name="sim_title">
- Región:
- </text>
- <text name="sim_field">
- Nombre de la región
- </text>
- <text name="pos_title">
- Posición:
- </text>
- <text name="pos_field">
- {128.1, 128.1, 15.4}
- </text>
- <text name="select_object_label">
- Pulsa el botón y luego el objeto a denunciar:
- </text>
- <button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/>
- <text name="object_name_label">
- Objeto:
- </text>
- <text name="object_name">
- Consetetur Sadipscing
- </text>
- <text name="owner_name_label">
- Propietario:
- </text>
- <text name="owner_name">
- Hendrerit Vulputate Kamawashi Longname
- </text>
- <combo_box name="category_combo" tool_tip="Categoría -- Elija la categoría que describa mejor esta denuncia">
- <combo_box.item label="Elegir la categoría" name="Select_category"/>
- <combo_box.item label="Edad &gt; Jugar a ser niño" name="Age__Age_play"/>
- <combo_box.item label="Edad &gt; Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
- <combo_box.item label="Edad &gt; Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
- <combo_box.item label="Ataque &gt; Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/>
- <combo_box.item label="Ataque &gt; Zona segura" name="Assault__Safe_area"/>
- <combo_box.item label="Ataque &gt; Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/>
- <combo_box.item label="Comercio &gt; Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/>
- <combo_box.item label="Indiscreción &gt; Información del mundo real" name="Disclosure__Real_world_information"/>
- <combo_box.item label="Indiscreción &gt; Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/>
- <combo_box.item label="Indiscreción &gt; Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/>
- <combo_box.item label="Perturbando la paz &gt; Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
- <combo_box.item label="Perturbando la paz &gt; Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
- <combo_box.item label="Perturbando la paz &gt; Objeto basura" name="Disturbing_the_peace__Object_littering"/>
- <combo_box.item label="Perturbando la paz &gt; Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
- <combo_box.item label="Perturbando la paz &gt; Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/>
- <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
- <combo_box.item label="Fraude &gt; Terreno" name="Fraud__Land"/>
- <combo_box.item label="Fraude &gt; Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
- <combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
- <combo_box.item label="Acoso &gt; Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/>
- <combo_box.item label="Acoso &gt; Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/>
- <combo_box.item label="Acoso &gt; Impedir el movimiento" name="Harassment__Impeding_movement"/>
- <combo_box.item label="Acoso &gt; Acoso sexual" name="Harassment__Sexual_harassment"/>
- <combo_box.item label="Acoso &gt; Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
- <combo_box.item label="Acoso &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
- <combo_box.item label="Indecencia &gt; En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
- <combo_box.item label="Indecencia &gt; Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
- <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región General" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región Moderado" name="Indecency__Inappropriate_content_in_Mature_region"/>
- <combo_box.item label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
- <combo_box.item label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
- <combo_box.item label="Intolerancia" name="Intolerance"/>
- <combo_box.item label="Terreno &gt; Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/>
- <combo_box.item label="Terreno &gt; Invasión &gt; Objetos/Texturas" name="Land__Encroachment__Objects_textures"/>
- <combo_box.item label="Terreno &gt; Invasión &gt; Partículas" name="Land__Encroachment__Particles"/>
- <combo_box.item label="Terreno &gt; Invasión &gt; Árboles/Plantas" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/>
- <combo_box.item label="Otra" name="Other"/>
- </combo_box>
- <text name="abuser_name_title">
- Nombre del infractor:
- </text>
- <button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
- <text name="abuser_name_title2">
- Localización de la infracción:
- </text>
- <text name="sum_title">
- Resumen:
- </text>
- <text name="dscr_title">
- Detalles:
- </text>
- <text name="bug_aviso">
- Por favor, sé todo lo concreto que puedas
- </text>
- <text name="incomplete_title">
- * Las denuncias incompletas no se investigarán
- </text>
- <button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN">
+ <floater.string name="Screenshot">
+ Captura de pantalla
+ </floater.string>
+ <check_box label="Usar esta captura de pantalla" name="screen_check"/>
+ <text name="reporter_title">
+ Denunciante:
+ </text>
+ <text name="reporter_field">
+ Loremipsum Dolorsitamut Longnamez
+ </text>
+ <text name="sim_title">
+ Región:
+ </text>
+ <text name="sim_field">
+ Nombre de la región
+ </text>
+ <text name="pos_title">
+ Posición:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Pulsa el botón y luego el objeto a denunciar:
+ </text>
+ <button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/>
+ <text name="object_name_label">
+ Objeto:
+ </text>
+ <text name="object_name">
+ Consetetur Sadipscing
+ </text>
+ <text name="owner_name_label">
+ Propietario:
+ </text>
+ <text name="owner_name">
+ Hendrerit Vulputate Kamawashi Longname
+ </text>
+ <combo_box name="category_combo" tool_tip="Categoría -- Elija la categoría que describa mejor esta denuncia">
+ <combo_box.item label="Elegir la categoría" name="Select_category"/>
+ <combo_box.item label="Edad &gt; Jugar a ser niño" name="Age__Age_play"/>
+ <combo_box.item label="Edad &gt; Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Edad &gt; Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Ataque &gt; Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Ataque &gt; Zona segura" name="Assault__Safe_area"/>
+ <combo_box.item label="Ataque &gt; Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Comercio &gt; Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Indiscreción &gt; Información del mundo real" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Indiscreción &gt; Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Indiscreción &gt; Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Perturbando la paz &gt; Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Perturbando la paz &gt; Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Perturbando la paz &gt; Objeto basura" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Perturbando la paz &gt; Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Perturbando la paz &gt; Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraude &gt; Terreno" name="Fraud__Land"/>
+ <combo_box.item label="Fraude &gt; Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Acoso &gt; Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Acoso &gt; Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Acoso &gt; Impedir el movimiento" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Acoso &gt; Acoso sexual" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Acoso &gt; Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Acoso &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecencia &gt; En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecencia &gt; Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región General" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región Moderado" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerancia" name="Intolerance"/>
+ <combo_box.item label="Terreno &gt; Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Objetos/Texturas" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Partículas" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Árboles/Plantas" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/>
+ <combo_box.item label="Otra" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ Nombre del infractor:
+ </text>
+ <button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
+ <text name="abuser_name_title2">
+ Localización de la infracción:
+ </text>
+ <text name="sum_title">
+ Resumen:
+ </text>
+ <text name="dscr_title">
+ Detalles:
+ </text>
+ <text name="bug_aviso">
+ Por favor, sé todo lo concreto que puedas
+ </text>
+ <text name="incomplete_title">
+ * Las denuncias incompletas no se investigarán
+ </text>
+ <button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_sell_land.xml b/indra/newview/skins/default/xui/es/floater_sell_land.xml
index efedb5d689..d883683945 100644
--- a/indra/newview/skins/default/xui/es/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_sell_land.xml
@@ -54,8 +54,8 @@
<radio_item label="No, mantener la propiedad de los objetos" name="no"/>
<radio_item label="Sí, vender los objetos con el terreno" name="yes"/>
</radio_group>
- <button label="Mostrar los objetos" name="show_objects" width="120"/>
- <text name="nag_message_label">
+ <button label="Mostrar los objetos" name="show_objects"/>
+ <text name="nag_message_label" font="SansSerifSmallBold" left="10">
RECUERDA: todas las ventas son definitivas.
</text>
<button label="Poner en venta el terreno" name="sell_btn"/>
diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml
index 7c2522e8a9..033633bd22 100644
--- a/indra/newview/skins/default/xui/es/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml
@@ -39,19 +39,16 @@
<text name="id_text">
ID del objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
- <button label="Mostrar la baliza" name="show_beacon_btn" width="115"/>
+ <button label="Mostrar la baliza" name="show_beacon_btn"/>
<text name="obj_name_text">
Nombre del objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
- <button label="Filtro" name="filter_object_btn" width="115"/>
- <text name="owner_name_text" width="130">
+ <button label="Filtro" name="filter_object_btn"/>
+ <text name="owner_name_text">
Propietario:
</text>
- <line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
- <button label="Filtro" name="filter_owner_btn" width="115"/>
- <button label="Actualizar" name="refresh_btn" width="115"/>
+ <button label="Filtro" name="filter_owner_btn"/>
+ <button label="Actualizar" name="refresh_btn"/>
<button label="Devolver lo seleccionado" name="return_selected_btn" width="170"/>
<button label="Devolver todo" left="190" name="return_all_btn"/>
<button label="Desactivar lo seleccionado" name="disable_selected_btn" width="170"/>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 99ae2b2335..ce9273ab50 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -1,2952 +1,2952 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <global name="skipnexttime">
- No mostrarme esto otra vez
- </global>
- <global name="alwayschoose">
- Elegir siempre esta opción
- </global>
- <global name="implicitclosebutton">
- Cerrar
- </global>
- <template name="okbutton">
- <form>
- <button name="OK_okbutton" text="$yestext"/>
- </form>
- </template>
- <template name="okignore">
- <form>
- <button name="OK_okignore" text="$yestext"/>
- </form>
- </template>
- <template name="okcancelbuttons">
- <form>
- <button name="OK_okcancelbuttons" text="$yestext"/>
- <button name="Cancel_okcancelbuttons" text="$notext"/>
- </form>
- </template>
- <template name="okcancelignore">
- <form>
- <button name="OK_okcancelignore" text="$yestext"/>
- <button name="Cancel_okcancelignore" text="$notext"/>
- </form>
- </template>
- <template name="okhelpbuttons">
- <form>
- <button name="OK_okhelpbuttons" text="$yestext"/>
- <button name="Help" text="$helptext"/>
- </form>
- </template>
- <template name="yesnocancelbuttons">
- <form>
- <button name="Yes" text="$yestext"/>
- <button name="No" text="$notext"/>
- <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert">
- Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir. Por favor, comprueba que tienes instalado el último Visor.
-
-Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha encontrado en notifications.xml.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FloaterNotFound">
- Error: no se pudieron encontrar estos controles:
-
-[CONTROLS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TutorialNotFound">
- Actualmente, no hay un tutorial disponible.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GenericAlert">
- [MESSAGE]
- </notification>
- <notification name="GenericAlertYesCancel">
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
- </notification>
- <notification name="BadInstallation">
- Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LoginFailedNoNetwork">
- No se puede conectar con [SECOND_LIFE_GRID].
- &apos;[DIAGNOSTIC]&apos;
-Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MessageTemplateNotFound">
- No se ha encontrado la plantilla de mensaje [PATH].
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="WearableSave">
- ¿Guardar los cambios en las ropas o partes del cuerpo actuales?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/>
- </notification>
- <notification name="CompileQueueSaveText">
- Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
- </notification>
- <notification name="CompileQueueSaveBytecode">
- Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
- </notification>
- <notification name="WriteAnimationFail">
- Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde.
- </notification>
- <notification name="UploadAuctionSnapshotFail">
- Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON]
- </notification>
- <notification name="UnableToViewContentsMoreThanOne">
- No se puede ver a la vez los contenidos de más de un ítem. Por favor, elige un solo objeto y vuelve a intentarlo.
- </notification>
- <notification name="SaveClothingBodyChanges">
- ¿Guardar todos los cambios en la ropa y partes del cuerpo?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos todos"/>
- </notification>
- <notification name="FriendsAndGroupsOnly">
- Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FavoritesOnLogin">
- Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GrantModifyRights">
- Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
-¿Quieres conceder permisos de modificación a [NAME]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="GrantModifyRightsMultiple">
- Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
-¿Quieres conceder permisos de modificación a los Residentes elegidos?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="RevokeModifyRights">
- ¿Quieres retirar los permisos de modificación a [NAME]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="RevokeModifyRightsMultiple">
- ¿Quieres revocar los derechos de modificación a los residentes seleccionados?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="UnableToCreateGroup">
- No se ha podido crear el grupo.
-[MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PanelGroupApply">
- [NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ignorar los cambios" yestext="Aplicar los cambios"/>
- </notification>
- <notification name="MustSpecifyGroupNoticeSubject">
- Para enviar un aviso de grupo debes especificar un asunto.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AddGroupOwnerWarning">
- Vas a añadir miembros al rol de [ROLE_NAME].
-No podrás removérseles de ese rol, sino que deberán renunciar a él por sí mismos.
-¿Estás seguro de que quieres seguir?
- <usetemplate ignoretext="Confirmar que vas a añadir un nuevo propietario al grupo" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="AssignDangerousActionWarning">
- Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
-
- *ATENCIÓN*
- Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad.
-¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="AssignDangerousAbilityWarning">
- Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
-
- *ATENCIÓN*
- Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- todas las capacidades, elevándose hasta poderes cercanos a los del propietario.
-¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="AttachmentDrop">
- Vas a soltar tu anexado.
- ¿Estás seguro de que quieres continuar?
- <usetemplate ignoretext="Confirmar antes de soltar anexados" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="JoinGroupCanAfford">
- Entrar a este grupo cuesta [COST] L$.
-¿Quieres hacerlo??
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
- </notification>
- <notification name="JoinGroupNoCost">
- Vas a entrar al grupo [NAME].
-¿Quieres seguir?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
- </notification>
- <notification name="JoinGroupCannotAfford">
- Entrar a este grupo cuesta [COST] L$.
-No tienes dinero suficiente para entrar.
- </notification>
- <notification name="CreateGroupCost">
- Crear este grupo te costará 100 L$.
-Los grupos necesitan más de un miembro. Si no, son borrados permanentemente.
-Por favor, invita a miembros en las próximas 48 horas.
- <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/>
- </notification>
- <notification name="LandBuyPass">
- Por [COST] L$ puedes entrar a este terreno (&apos;[PARCEL_NAME]&apos;) durante [TIME] horas. ¿Comprar un pase?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="SalePriceRestriction">
- El precio de venta tiene que ser mayor de 0 L$ si la venta es a cualquiera.
-Por favor, elige a alguien concreto como comprador si la venta es por 0 L$.
- </notification>
- <notification name="ConfirmLandSaleChange">
- Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta.
-El precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME].
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmLandSaleToAnyoneChange">
- ATENCIÓN: Marcando &apos;vender a cualquiera&apos; hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
-
-Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta.
-El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME].
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsDeededToGroup">
- ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo &apos;[NAME]&apos; al inventario de su propietario anterior?
-
-*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
-
-Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedByUser">
- ¿Estás seguro de que quieres devolver al inventario de &apos;[NAME]&apos; todos los objetos que sean de su propiedad en esta parcela?
-
-Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedBySelf">
- ¿Estás seguro de que quieres devolver a su inventario todos los objetos de los que eres propietario en esta parcela?
-
-Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedBySelf">
- ¿Estás seguro de que quieres devolver todos los objetos de los que NO eres propietario en esta parcela al inventario de sus propietarios?
-Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
-
-*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
-
-Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByUser">
- ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario?
-Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
-
-*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
-
-Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ReturnAllTopObjects">
- ¿Estás seguro de que quieres devolver al inventario de su propietario todos los objetos de la lista?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="DisableAllTopObjects">
- ¿Estás seguro de que quieres desactivar todos los objetos de esta región?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByGroup">
- ¿Devolver a sus propietarios los objetos de esta parcela que NO estén compartidos con el grupo [NAME]?
-
-Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="UnableToDisableOutsideScripts">
- No se pueden desactivar los scripts.
-Toda esta región tiene activado el &apos;daño&apos;.
-Para que funcionen las armas los scripts deben estar activados.
- </notification>
- <notification name="MultipleFacesSelected">
- Están seleccionadas varias caras.
-Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media.
-Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir.
- <usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="MustBeInParcel">
- Para configurar el Punto de llegada de la parcela,
-debes estar dentro de ella.
- </notification>
- <notification name="PromptRecipientEmail">
- Por favor, escribe una dirección de correo electrónica válida para el/los receptor/es.
- </notification>
- <notification name="PromptSelfEmail">
- Por favor, escribe tu dirección de correo electrónico.
- </notification>
- <notification name="PromptMissingSubjMsg">
- ¿Foto por correo electrónico con el asunto o el mensaje por defecto?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ErrorProcessingSnapshot">
- Error al procesar los datos de la foto.
- </notification>
- <notification name="ErrorEncodingSnapshot">
- Error al codificar la foto.
- </notification>
- <notification name="ErrorUploadingPostcard">
- Hubo un problema al enviar la foto por la siguiente razón: [REASON]
- </notification>
- <notification name="ErrorUploadingReportScreenshot">
- Hubo un problema al subir la captura de pantalla del informe por la siguiente razón: [REASON]
- </notification>
- <notification name="MustAgreeToLogIn">
- Debes estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE].
- </notification>
- <notification name="CouldNotPutOnOutfit">
- No se ha podido poner el vestuario.
-La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa.
- </notification>
- <notification name="CannotWearTrash">
- No puedes vestirte ropas o partes del cuerpo que estén en la Papelera
- </notification>
- <notification name="MaxAttachmentsOnOutfit">
- No se puede anexar el objeto.
-Se ha superado el límite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quítate alguno.
- </notification>
- <notification name="CannotWearInfoNotComplete">
- No puedes vestirte este ítem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto.
- </notification>
- <notification name="MustHaveAccountToLogIn">
- Lo sentimos. Se ha quedado algún espacio en blanco.
-Tienes que volver a introducir el nombre de usuario de tu avatar.
-
-Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustaría crear una ahora?
- <url name="url">
- https://join.secondlife.com/index.php?lang=es-ES
- </url>
- <usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
- </notification>
- <notification name="InvalidCredentialFormat">
- Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez.
- </notification>
- <notification name="DeleteClassified">
- ¿Borrar el clasificado &apos;[NAME]&apos;?
-No se reembolsan las cuotas pagadas.
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="DeleteMedia">
- Has elegido borrar los media asociados a esta cara.
-¿Estás seguro de que quieres continuar?
- <usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="ClassifiedSave">
- ¿Guardar los cambios en el clasificado [NAME]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
- </notification>
- <notification name="ClassifiedInsufficientFunds">
- Dinero insuficiente para crear un clasificado.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeleteAvatarPick">
- ¿Borrar el destacado &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="DeleteOutfits">
- ¿Eliminar el vestuario seleccionado?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="PromptGoToEventsPage">
- ¿Ir a la web de eventos de [SECOND_LIFE]?
- <url name="url">
- http://secondlife.com/events/?lang=es-ES
- </url>
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="SelectProposalToView">
- Por favor, selecciona qué propuesta quieres ver.
- </notification>
- <notification name="SelectHistoryItemToView">
- Por favor, selecciona un ítem del historial para verlo.
- </notification>
- <notification name="CacheWillClear">
- La caché se limpiará cuando reinices [APP_NAME].
- </notification>
- <notification name="CacheWillBeMoved">
- La caché se moverá cuando reinicies [APP_NAME].
-Nota: esto vaciará la caché.
- </notification>
- <notification name="ChangeConnectionPort">
- La configuración del puerto tendrá efecto cuando reinicies [APP_NAME].
- </notification>
- <notification name="ChangeSkin">
- Verás la nueva apariencia cuando reinicies [APP_NAME].
- </notification>
- <notification name="ChangeLanguage">
- El cambio de idioma tendrá efecto cuando reinicies [APP_NAME].
- </notification>
- <notification name="GoToAuctionPage">
- ¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta
-o hacer una puja?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="SaveChanges">
- ¿Guardar los cambios?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
- </notification>
- <notification name="GestureSaveFailedTooManySteps">
- Fallo al guardar el gesto.
-Este gesto tiene demasiados pasos.
-Intenta quitarle algunos, y vuelve a guardarlo.
- </notification>
- <notification name="GestureSaveFailedTryAgain">
- Fallo al guardar el gesto. Por favor, vuelve a intentarlo en un minuto.
- </notification>
- <notification name="GestureSaveFailedObjectNotFound">
- No se ha podido guardar el gesto porque no se pudo encontrar el objeto o el objeto asociado.
-El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
- </notification>
- <notification name="GestureSaveFailedReason">
- Al guardar un gesto, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
- </notification>
- <notification name="SaveNotecardFailObjectNotFound">
- No se ha podido guardar la nota porque no se pudo encontrar el objeto o el objeto asociado del inventario.
-El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
- </notification>
- <notification name="SaveNotecardFailReason">
- Al guardar una nota, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarla más tarde.
- </notification>
- <notification name="ScriptCannotUndo">
- No se han podido deshacer todos los cambios en tu versión del script.
-¿Quieres cargar la última versión guardada en el servidor?
-(**Cuidado** No podrás deshacer esta operación).
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="SaveScriptFailReason">
- Al guardar un script, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
- </notification>
- <notification name="SaveScriptFailObjectNotFound">
- No se ha podido guardar el script porque no se pudo encontrar el objeto que incluye.
-El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
- </notification>
- <notification name="SaveBytecodeFailReason">
- Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde..
- </notification>
- <notification name="StartRegionEmpty">
- Perdón, no está definida tu Posición inicial.
-Por favor, escribe el nombre de la región en el cajetín de Posición inicial, o elige para esa posición Mi Base o Mi última posición.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CouldNotStartStopScript">
- No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye.
-El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
- </notification>
- <notification name="CannotDownloadFile">
- No se ha podido descargar el archivo.
- </notification>
- <notification name="CannotWriteFile">
- No se ha podido escribir el archivo [[FILE]]
- </notification>
- <notification name="UnsupportedHardware">
- Debes saber que tu ordenador no cumple los requisitos mínimos para la utilización de [APP_NAME]. Puede que experimentes un rendimiento muy bajo. Desafortunadamente, [SUPPORT_SITE] no puede dar asistencia técnica a sistemas con una configuración no admitida.
-
-¿Ir a [_URL] para más información?
- <url name="url" option="0">
- http://secondlife.com/support/sysreqs.php?lang=es
- </url>
- <usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="UnknownGPU">
- Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce.
-Suele suceder con hardware nuevo que todavía no ha sido probado con [APP_NAME]. Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas.
-(Yo &gt; Preferencias &gt; Gráficos).
- <form name="form">
- <ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/>
- </form>
- </notification>
- <notification name="DisplaySettingsNoShaders">
- [APP_NAME] se cae al iniciar los &apos;driver&apos; gráficos.
-La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas.
-Te recomendamos actualizar los &apos;drivers&apos; de tu tarjeta gráfica.
-La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
- </notification>
- <notification name="RegionNoTerraforming">
- En la región [REGION] no se permite modificar el terreno.
- </notification>
- <notification name="CannotCopyWarning">
- No tienes permiso para copiar los elementos siguientes:
-[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="CannotGiveItem">
- No se ha podido dar el ítem del inventario.
- </notification>
- <notification name="TransactionCancelled">
- Transacción cancelada.
- </notification>
- <notification name="TooManyItems">
- No puedes dar más de 42 ítems en una única transferencia del inventario.
- </notification>
- <notification name="NoItems">
- No tienes permiso para transferir el ítem seleccionado.
- </notification>
- <notification name="CannotCopyCountItems">
- No tienes permiso para copiar [COUNT] de los
-ítems seleccionados. Si los das, los perderás de tu inventario.
-¿Realmente quieres darlos?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="CannotGiveCategory">
- No tienes permiso para transferir
-la carpeta seleccionada.
- </notification>
- <notification name="FreezeAvatar">
- ¿Congelar a este avatar?
-Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
- </notification>
- <notification name="FreezeAvatarFullname">
- ¿Congelar a [AVATAR_NAME]?
-Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
- </notification>
- <notification name="EjectAvatarFullname">
- ¿Expulsar a [AVATAR_NAME] de tu terreno?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Expulsar y Prohibir el acceso" yestext="Expulsar"/>
- </notification>
- <notification name="EjectAvatarNoBan">
- ¿Expulsar a este avatar de tu terreno?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
- </notification>
- <notification name="EjectAvatarFullnameNoBan">
- ¿Expulsar a [AVATAR_NAME] de tu terreno?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
- </notification>
- <notification name="EjectAvatarFromGroup">
- Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME]
- </notification>
- <notification name="AcquireErrorTooManyObjects">
- ERROR &apos;ACQUIRE&apos;: Hay demasiados objetos seleccionados.
- </notification>
- <notification name="AcquireErrorObjectSpan">
- ERROR &apos;ACQUIRE&apos;: Los objetos están en más de una región.
-Por favor, mueve todos los objetos a adquirir a la
-misma región.
- </notification>
- <notification name="PromptGoToCurrencyPage">
- [EXTRA]
-
-¿Ir a [_URL] para informarte sobre la compra de L$?
- <url name="url">
- http://secondlife.com/app/currency/?lang=es-ES
- </url>
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="UnableToLinkObjects">
- No se pudo enlazar estos [COUNT] objetos.
-Puedes enlazar [MAX] objetos como máximo.
- </notification>
- <notification name="CannotLinkIncompleteSet">
- Sólo puedes enlazar objetos completos (no sus partes), y debes
-seleccionar más de uno.
- </notification>
- <notification name="CannotLinkModify">
- Imposible enlazarlos, porque no tienes permiso para modificar
-todos los objetos.
-
-Por favor, asegúrate de que no hay ninguno bloqueado, y de que eres el propietario de todos.
- </notification>
- <notification name="CannotLinkDifferentOwners">
- Imposible enlazarlos, porque hay objetos de distintos propietarios.
-
-Por favor, asegúrate de que eres el propietario de todos los objetos seleccionados.
- </notification>
- <notification name="NoFileExtension">
- No hay extensión de archivo en: &apos;[FILE]&apos;
-
-Por favor, asegúrate de que la extensión del archivo es correcta.
- </notification>
- <notification name="InvalidFileExtension">
- Extensión inválida de archivo: [EXTENSION]
-Podría ser [VALIDS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotUploadSoundFile">
- No se pudo abrir el archivo de sonido que has subido para leer:
-[FILE]
- </notification>
- <notification name="SoundFileNotRIFF">
- No parece que el archivo sea un archivo RIFF WAVE:
-[FILE]
- </notification>
- <notification name="SoundFileNotPCM">
- No parece que el archivo sea un archivo de audio PCM WAVE:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChannelCount">
- El archivo no tiene un número de canales válido (debe ser mono o estéreo):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidSampleRate">
- No parece que el archivo tenga una frecuencia de muestreo (sample rate) adecuada (debe de ser 44.1k):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidWordSize">
- No parece que el archivo tenga un tamaño de palabra (word size) adecuado (debe de ser de 8 o 16 bites):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidHeader">
- No se encontró el fragmento &apos;data&apos; en la cabecera del WAV:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChunkSize">
- Tamaño de lote erróneo en el archivo WAV:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidTooLong">
- El archivo de audio es demasiado largo (10 segundos como máximo):
-[FILE]
- </notification>
- <notification name="ProblemWithFile">
- Problemas con el archivo [FILE]:
-
-[ERROR]
- </notification>
- <notification name="CannotOpenTemporarySoundFile">
- No se ha podido abrir para su escritura el archivo comprimido de sonido: [FILE]
- </notification>
- <notification name="UnknownVorbisEncodeFailure">
- Códec Vorbis desconocido, fallo en : [FILE]
- </notification>
- <notification name="CannotEncodeFile">
- No se puede codificar el archivo: [FILE]
- </notification>
- <notification name="CorruptedProtectedDataStore">
- No se pueden rellenar el nombre de usuario y la contraseña. Esto puede deberse a un cambio de configuración de la red.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CorruptResourceFile">
- Archivo con los recursos corruptos: [FILE]
- </notification>
- <notification name="UnknownResourceFileVersion">
- Versión de archivo desconocida para el recurso Linden en el archivo: [FILE]
- </notification>
- <notification name="UnableToCreateOutputFile">
- No se ha podido crear el archivo de salida: [FILE]
- </notification>
- <notification name="DoNotSupportBulkAnimationUpload">
- Actualmente, [APP_NAME] no admite la subida masiva de animaciones.
- </notification>
- <notification name="CannotUploadReason">
- No se ha podido subir [FILE] por la siguiente razón: [REASON]
-Por favor, inténtalo más tarde.
- </notification>
- <notification name="LandmarkCreated">
- Se ha añadido &quot;[LANDMARK_NAME]&quot; a tu carpeta [FOLDER_NAME].
- </notification>
- <notification name="LandmarkAlreadyExists">
- Ya tienes un hito de esta localización.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotCreateLandmarkNotOwner">
- No puedes crear un hito aquí porque el propietario del terreno no lo permite.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoScripts">
- No se pudo &apos;recompilar&apos;.
-Selecciona un objeto con script.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoPermission">
- No se pudo &apos;recompilar&apos;.
-
-Selecciona objetos con scripts en los que tengas permiso para modificarlos.
- </notification>
- <notification name="CannotResetSelectObjectsNoScripts">
- No se pudo &apos;reiniciar&apos;.
-
-Selecciona objetos con scripts.
- </notification>
- <notification name="CannotResetSelectObjectsNoPermission">
- No se pudo &apos;reiniciar&apos;.
-
-Selecciona objetos con scripts en los que tengas permiso para modificarlos.
- </notification>
- <notification name="CannotOpenScriptObjectNoMod">
- Imposible abrir el script del objeto sin modificar los permisos.
- </notification>
- <notification name="CannotSetRunningSelectObjectsNoScripts">
- No se puede configurar ningún script como &apos;ejecutándose&apos;.
-
-Selecciona objetos con scripts.
- </notification>
- <notification name="CannotSetRunningNotSelectObjectsNoScripts">
- No se puede configurar ningún script como &apos;no ejecutándose&apos;.
-
-Selecciona objetos con scripts.
- </notification>
- <notification name="NoFrontmostFloater">
- No hay nada que guardar.
- </notification>
- <notification name="SeachFilteredOnShortWords">
- Se ha modificado tu búsqueda,
-eliminando las palabras demasiado cortas.
-
-Buscando: [FINALQUERY]
- </notification>
- <notification name="SeachFilteredOnShortWordsEmpty">
- Los términos de tu búsqueda son muy cortos,
-por lo que no se ha hecho la búsqueda.
- </notification>
- <notification name="CouldNotTeleportReason">
- Fallo en el teleporte.
-[REASON]
- </notification>
- <notification name="invalid_tport">
- Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
-Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
- </notification>
- <notification name="invalid_region_handoff">
- Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
-Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
- </notification>
- <notification name="blocked_tport">
- Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.
- </notification>
- <notification name="nolandmark_tport">
- Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
- </notification>
- <notification name="timeout_tport">
- Lo sentimos, pero el sistema no ha podido completar el teleporte.
-Vuelve a intentarlo en un momento.
- </notification>
- <notification name="noaccess_tport">
- Lo sentimos, pero no tienes acceso al destino de este teleporte.
- </notification>
- <notification name="missing_attach_tport">
- Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.
- </notification>
- <notification name="too_many_uploads_tport">
- La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.
- </notification>
- <notification name="expired_tport">
- Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
- </notification>
- <notification name="expired_region_handoff">
- Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
- </notification>
- <notification name="no_host">
- Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos pocos minutos.
- </notification>
- <notification name="no_inventory_host">
- En estos momentos no está disponible el sistema del inventario.
- </notification>
- <notification name="CannotSetLandOwnerNothingSelected">
- No se ha podido configurar el propietario del terreno:
-no se ha seleccionado una parcela.
- </notification>
- <notification name="CannotSetLandOwnerMultipleRegions">
- No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, selecciona un área más pequeña y vuelve a intentarlo.
- </notification>
- <notification name="ForceOwnerAuctionWarning">
- Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado.
-¿Forzar la propiedad?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="CannotContentifyNothingSelected">
- No se ha podido &apos;contentify&apos;:
-no se ha seleccionado una parcela.
- </notification>
- <notification name="CannotContentifyNoRegion">
- No se ha podido &apos;contentify&apos;:
-no se ha seleccionado una región.
- </notification>
- <notification name="CannotReleaseLandNothingSelected">
- No se ha podido abandonar el terreno:
-no se ha seleccionado una parcela.
- </notification>
- <notification name="CannotReleaseLandNoRegion">
- No se ha podido abandonar el terreno:
-no se ha podido encontrar la región.
- </notification>
- <notification name="CannotBuyLandNothingSelected">
- Imposible comprar terreno:
-no se ha seleccionado una parcela.
- </notification>
- <notification name="CannotBuyLandNoRegion">
- Imposible comprar terreno:
-no se ha podido encontrar en qué región está.
- </notification>
- <notification name="CannotCloseFloaterBuyLand">
- No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
- </notification>
- <notification name="CannotDeedLandNothingSelected">
- No se ha podido transferir el terreno:
-no se ha seleccionado una parcela.
- </notification>
- <notification name="CannotDeedLandNoGroup">
- No se ha podido transferir el terreno:
-no has seleccionado un grupo.
- </notification>
- <notification name="CannotDeedLandNoRegion">
- No se ha podido transferir el terreno:
-Ha sido imposible encontrar en qué región está.
- </notification>
- <notification name="CannotDeedLandMultipleSelected">
- No se ha podido transferir el terreno:
-has seleccionado varias parcelas.
-
-Inténtalo seleccionando sólo una.
- </notification>
- <notification name="CannotDeedLandWaitingForServer">
- No se ha podido transferir el terreno:
-esperando que el servidor informe acerca de la propiedad.
-
-Por favor, vuelve a intentarlo.
- </notification>
- <notification name="CannotDeedLandNoTransfer">
- No se ha podido transferir el terreno:
-En la región [REGION] no se permite transferir terrenos.
- </notification>
- <notification name="CannotReleaseLandWatingForServer">
- No se ha podido abandonar el terreno:
-esperando que el servidor actualice la información de la parcela.
-
-Vuelve a intentarlo en unos segundos.
- </notification>
- <notification name="CannotReleaseLandSelected">
- No se ha podido abandonar el terreno:
-no eres propietario de todas las parcelas seleccionadas.
-
-Por favor, selecciona una sola parcela.
- </notification>
- <notification name="CannotReleaseLandDontOwn">
- No se ha podido abandonar el terreno:
-no tienes permisos sobre esta parcela.
-Las parcelas de tu propiedad se muestran en verde.
- </notification>
- <notification name="CannotReleaseLandRegionNotFound">
- No se ha podido abandonar el terreno:
-Ha sido imposible encontrar en qué región está.
- </notification>
- <notification name="CannotReleaseLandNoTransfer">
- No se ha podido abandonar el terreno:
-En la región [REGION] no se permite transferir terrenos.
- </notification>
- <notification name="CannotReleaseLandPartialSelection">
- No se ha podido abandonar el terreno:
-debes seleccionar toda la parcela.
-
-Selecciona una parcela completa, o divídela primero.
- </notification>
- <notification name="ReleaseLandWarning">
- Vas a abandonar [AREA] m² de terreno.
-Al hacerlo, la quitarás de entre tus posesiones de terreno, pero no recibirás ningún L$.
-
-¿Abandonar este terreno?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNothingSelected">
- No se ha podido dividir el terreno:
-
-No has seleccionado ninguna parcela.
- </notification>
- <notification name="CannotDivideLandPartialSelection">
- No se ha podido dividir el terreno:
-
-Has seleccionado una parcela entera.
-Inténtalo seleccionando una parte.
- </notification>
- <notification name="LandDivideWarning">
- Dividir este terreno lo separará en dos parcelas, cada una de las cuales tendrá su propia configuración. Tras esta operación, algunas configuraciones volverán a las existentes por defecto.
-
-¿Dividir el terreno?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNoRegion">
- No se ha podido dividir el terreno:
-Ha sido imposible encontrar en qué región está.
- </notification>
- <notification name="CannotJoinLandNoRegion">
- No se ha podido unir el terreno:
-Ha sido imposible encontrar en qué región está.
- </notification>
- <notification name="CannotJoinLandNothingSelected">
- No se ha podido unir el terreno:
-No hay parcelas seleccionadas.
- </notification>
- <notification name="CannotJoinLandEntireParcelSelected">
- No se ha podido unir el terreno:
-Sólo has seleccionado una parcela.
-
-Selecciona terreno que incluya algo de ambas parcelas.
- </notification>
- <notification name="CannotJoinLandSelection">
- No se ha podido unir el terreno:
-Debes seleccionar más de una parcela.
-
-Selecciona terreno que incluya algo de ambas parcelas.
- </notification>
- <notification name="JoinLandWarning">
- Al unir este terreno crearás una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado.
-Deberás reconfigurar el nombre y las opciones de la nueva parcela.
-
-¿Unir el terreno?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmNotecardSave">
- Esta nota debe guardarse antes de que puedas copiarla o verla. ¿Guardar la nota?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmItemCopy">
- ¿Copiar este ítem a tu inventario?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Copiar"/>
- </notification>
- <notification name="ResolutionSwitchFail">
- Fallo al cambiar la resolución a [RESX] por [RESY]
- </notification>
- <notification name="ErrorUndefinedGrasses">
- Error, hierbas no definidas: [SPECIES]
- </notification>
- <notification name="ErrorUndefinedTrees">
- Error, árboles no definidos: [SPECIES]
- </notification>
- <notification name="CannotSaveWearableOutOfSpace">
- No se ha podido guardar el archivo &apos;[NAME]&apos;. Tendrás que liberar algo de espacio en tu ordenador y guardarlo de nuevo.
- </notification>
- <notification name="CannotSaveToAssetStore">
- No se ha podido guardar [NAME] en la base central de almacenamiento.
-Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el ítem de aquí a unos minutos.
- </notification>
- <notification name="YouHaveBeenLoggedOut">
- Vaya, se ha cerrado tu sesión en [SECOND_LIFE].
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/>
- </notification>
- <notification name="OnlyOfficerCanBuyLand">
- No se ha podido comprar terreno para el grupo:
-no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente.
- </notification>
- <notification label="Añadir como amigo" name="AddFriendWithMessage">
- Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado.
-
-¿Ofrecer a [NAME] que sea tu amigo?
- <form name="form">
- <input name="message">
- ¿Quieres formar parte de mis amigos?
- </input>
- <button name="Offer" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification label="Guardar el vestuario" name="SaveOutfitAs">
- Guardar como un nuevo vestuario lo que estoy llevando:
- <form name="form">
- <input name="message">
- [DESC] (nuevo)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification label="Guardar artículo" name="SaveWearableAs">
- Guardar el ítem en mi inventario como:
- <form name="form">
- <input name="message">
- [DESC] (nuevo)
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification label="Renombrar el vestuario" name="RenameOutfit">
- Nombre del nuevo vestuario:
- <form name="form">
- <input name="new_name">
- [NAME]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="RemoveFromFriends">
- ¿Quieres eliminar a [NAME] de tu lista de amigos?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="RemoveMultipleFromFriends">
- ¿Quieres quitar a varios amigos de tu lista de amigos?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedPublicObjectsByUser">
- ¿Estás seguro de que quieres borrar todos los objetos con script que sean propiedad de
-** [AVATAR_NAME] **
-en todos los otros terrenos de este sim?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedObjectsByUser">
- ¿Estás seguro de que quieres BORRAR TODOS los objetos con script que sean propiedad de
-** [AVATAR_NAME] **
-en TODO EL TERRENO de este sim?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllObjectsByUser">
- ¿Estás seguro de que quieres BORRAR TODOS los objetos (con script o no) que sean propiedad de
-** [AVATAR_NAME] **
-en TODO EL TERRENO de este sim?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="BlankClassifiedName">
- Debes especificar un nombre para tu clasificado.
- </notification>
- <notification name="MinClassifiedPrice">
- El pago para aparecer en la lista debe ser de, al menos, [MIN_PRICE] L$.
-
-Por favor, elige un pago mayor.
- </notification>
- <notification name="ConfirmItemDeleteHasLinks">
- Por lo menos uno de los elementos seleccionados contiene vínculos que le señalan. Si eliminas este elemento, los vínculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vínculos.
-
-¿Estás seguro de que quieres eliminar los elementos?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLock">
- Al menos uno de los ítems que has seleccionado está bloqueado.
-
-¿Estás seguro de que quieres borrar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopy">
- Al menos uno de los ítems que has seleccionado no es copiable.
-
-¿Estás seguro de que quieres borrar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoOwn">
- No eres el propietario de, al menos, uno de los ítems que has seleccionado.
-
-¿Estás seguro de que quieres borrar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopy">
- Al menos un objeto está bloqueado.
-Al menos un objeto no es copiable.
-
-¿Estás seguro de que quieres borrar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoOwn">
- Al menos un objeto está bloqueado.
-No eres propietario de, al menos, un objeto.
-
-¿Estás seguro de que quieres borrar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopyNoOwn">
- Al menos un objeto no es copiable.
-No eres propietario de, al menos, un objeto.
-
-¿Estás seguro de que quieres borrar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- Al menos un objeto está bloqueado.
-Al menos un objeto no es copiable.
-No eres propietario de, al menos, un objeto.
-
-¿Estás seguro de que quieres borrar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLock">
- Al menos un objeto está bloqueado.
-
-¿Estás seguro de que quieres tomar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeNoOwn">
- No eres el propietario de todos los objetos que estás tomando.
-Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
-
-¿Estás seguro de que quieres tomar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLockNoOwn">
- Al menos un objeto está bloqueado.
-No eres el propietario de todos los objetos que estás tomando.
-Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
-Con todo, puedes tomar lo actualmente seleccionado.
-
-¿Estás seguro de que quieres tomar estos ítems?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="CantBuyLandAcrossMultipleRegions">
- No se ha podido hacer la compra porque el terreno seleccionado se extiende por varias regiones.
-
-Por favor, selecciona un área más pequeña y vuelve a intentarlo.
- </notification>
- <notification name="DeedLandToGroup">
- Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno.
-El precio de compra de la parcela no se reembolsa al propietario.
-Si se vende una parcela transferida, el precio de venta se dividirá a partes iguales entre los miembros del grupo.
-
-¿Transferir estos [AREA] m² de terreno al grupo
-&apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="DeedLandToGroupWithContribution">
- Al transferir esta parcela, el grupo deberá poseer y mantener el número suficiente de créditos de uso de terreno.
-El traspaso incluirá una contribución simultánea de terreno al grupo de &quot;[NAME]&quot;.
-El precio de compra del terreno no se le devolverá al propietario. Si se vende una parcela transferida, el precio de venta se dividirá en partes iguales entre los miembros del grupo.
-
-¿Transferir este terreno de [AREA] m² al grupo &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="DisplaySetToSafe">
- Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos.
- </notification>
- <notification name="DisplaySetToRecommended">
- Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema.
- </notification>
- <notification name="ErrorMessage">
- [ERROR_MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarMovedDesired">
- La localización que querías no está disponible en estos momentos.
-Se te ha llevado a una región cercana.
- </notification>
- <notification name="AvatarMovedLast">
- En estos momentos no está disponible tu última posición.
-Se te ha llevado a una región cercana.
- </notification>
- <notification name="AvatarMovedHome">
- En estos momentos no está disponible tu Base.
-Se te ha llevado a una región cercana.
-Quizá quieras configurar una nueva posición para tu Base.
- </notification>
- <notification name="ClothingLoading">
- Aún está descargándose tu ropa.
-Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente.
- <form name="form">
- <ignore name="ignore" text="La ropa está tardando mucho en descargarse"/>
- </form>
- </notification>
- <notification name="FirstRun">
- Se ha completado la instalación de [SECOND_LIFE].
-
-Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
-¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva?
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
- </notification>
- <notification name="LoginPacketNeverReceived">
- Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID].
-
-Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base.
- <url name="url">
- http://es.secondlife.com/support/
- </url>
- <form name="form">
- <button name="OK" text="OK"/>
- <button name="Help" text="Ayuda"/>
- <button name="Teleport" text="Teleportar"/>
- </form>
- </notification>
- <notification name="WelcomeChooseSex">
- Tu personaje aparecerá en un momento.
-
-Para caminar, usa las teclas del cursor.
-En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE].
-Por favor, elige el avatar masculino o femenino.
-Puedes cambiar más adelante tu elección.
- <usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/>
- </notification>
- <notification name="CantTeleportToGrid">
- No se puede hacer el teleporte a [SLURL] porque se encuentra en una cuadrícula ([GRID]) diferente de la actual ([CURRENT_GRID]). Cierra el visor y vuelve a intentarlo.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GeneralCertificateError">
- No se puede establecer la conexión con el servidor.
-[REASON]
-
-Nombre del asunto: [SUBJECT_NAME_STRING]
-Nombre del emisor: [ISSUER_NAME_STRING]
-Válido desde: [VALID_FROM]
-Válido hasta: [VALID_TO]
-Huella digital MD5: [SHA1_DIGEST]
-Huella digital SHA1: [MD5_DIGEST]
-Uso de la clave: [KEYUSAGE]
-Uso de clave extendida: [EXTENDEDKEYUSAGE]
-Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TrustCertificateError">
- La autoridad de certificación de este servidor se desconoce.
-
-Información del certificado:
-Nombre del asunto: [SUBJECT_NAME_STRING]
-Nombre del emisor: [ISSUER_NAME_STRING]
-Válido desde: [VALID_FROM]
-Válido hasta: [VALID_TO]
-Huella digital MD5: [SHA1_DIGEST]
-Huella digital SHA1: [MD5_DIGEST]
-Uso de la clave: [KEYUSAGE]
-Uso de clave extendida: [EXTENDEDKEYUSAGE]
-Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
-
-¿Deseas confiar en esta autoridad?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiar"/>
- </notification>
- <notification name="NotEnoughCurrency">
- [NAME] cuesta [PRICE] L$. No tienes suficientes L$ para hacer eso.
- </notification>
- <notification name="GrantedModifyRights">
- [NAME] te ha dado permiso para modificar sus objetos.
- </notification>
- <notification name="RevokedModifyRights">
- Ha sido revocado tu privilegio de modificar los objetos de [NAME]
- </notification>
- <notification name="FlushMapVisibilityCaches">
- Esto limpiará las cachés del mapa en esta región.
-Esto sólo es realmente útil para cuestiones de depuración (&apos;debugging&apos;).
-(A efectos prácticos, espera 5 minutos, y el mapa de cualquiera se actualizará después de que reinicies sesión).
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="BuyOneObjectOnly">
- No se puede comprar más de un objeto a la vez. Por favor, selecciona sólo un objeto y vuelve a intentarlo.
- </notification>
- <notification name="OnlyCopyContentsOfSingleItem">
- No se puede copiar a la vez los contenidos de más de un objeto.
-Por favor, selecciona sólo uno y vuelve a intentarlo.
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="KickUsersFromRegion">
- ¿Teleportar a tu base a todos los residentes en esta región?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="EstateObjectReturn">
- ¿Estás seguro de que quieres devolver los objetos propiedad de
-[USER_NAME] ?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="InvalidTerrainBitDepth">
- No se han podido configurar las texturas de la región:
-La textura del terreno [TEXTURE_NUM] tiene una profundidad de bites inválida: [TEXTURE_BIT_DEPTH].
-
-Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
- </notification>
- <notification name="InvalidTerrainSize">
- No se han podido configurar las texturas de la región:
-La textura del terreno [TEXTURE_NUM] es demasiado grande: [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
-
-Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
- </notification>
- <notification name="RawUploadStarted">
- Ha empezado la subida. Dependiendo de la velocidad de tu conexión, llevará unos dos minutos.
- </notification>
- <notification name="ConfirmBakeTerrain">
- ¿Realmente quieres predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta &apos;Revertir&apos;?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="MaxAllowedAgentOnRegion">
- Sólo puedes tener [MAX_AGENTS] residentes autorizados.
- </notification>
- <notification name="MaxBannedAgentsOnRegion">
- Sólo puedes tener [MAX_BANNED] residentes no admitidos.
- </notification>
- <notification name="MaxAgentOnRegionBatch">
- Fallo al intentar añadir [NUM_ADDED] agentes:
-Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE].
- </notification>
- <notification name="MaxAllowedGroupsOnRegion">
- Sólo puedes tener [MAX_GROUPS] grupos permitidos.
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Predeterminar"/>
- </notification>
- <notification name="MaxManagersOnRegion">
- Sólo puedes tener [MAX_MANAGER] administradores del estado.
- </notification>
- <notification name="OwnerCanNotBeDenied">
- No se puede añadir a la lista de residentes no admitidos al propietario del estado.
- </notification>
- <notification name="CanNotChangeAppearanceUntilLoaded">
- No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma.
- </notification>
- <notification name="ClassifiedMustBeAlphanumeric">
- El nombre de tu anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación.
- </notification>
- <notification name="CantSetBuyObject">
- No puede configurar el Comprar el objeto, porque éste no está en venta.
-Por favor, pon en venta el objeto y vuelve a intentarlo.
- </notification>
- <notification name="FinishedRawDownload">
- Acabada la descarga del archivo raw de terreno en:
-[DOWNLOAD_PATH].
- </notification>
- <notification name="DownloadWindowsMandatory">
- Hay una versión nueva de [SECOND_LIFE] disponible.
-[MESSAGE]
-Debes descargar esta actualización para usar [SECOND_LIFE].
- <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
- </notification>
- <notification name="DownloadWindows">
- Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
- </notification>
- <notification name="DownloadWindowsReleaseForDownload">
- Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
- </notification>
- <notification name="DownloadLinuxMandatory">
- Hay una versión nueva de [SECOND_LIFE] disponible.
-[MESSAGE]
-Debes descargar esta actualización para usar [SECOND_LIFE].
- <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/>
- </notification>
- <notification name="DownloadLinux">
- Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
- </notification>
- <notification name="DownloadLinuxReleaseForDownload">
- Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
- </notification>
- <notification name="DownloadMacMandatory">
- Hay una versión nueva de [SECOND_LIFE] disponible.
-[MESSAGE]
-Debes descargar esta actualización para usar [SECOND_LIFE].
-
-¿Descargarla a tu carpeta de Programas?
- <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
- </notification>
- <notification name="DownloadMac">
- Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-
-¿Descargarla a tu carpeta de Programas?
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
- </notification>
- <notification name="DownloadMacReleaseForDownload">
- Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-
-¿Descargarla a tu carpeta de Programas?
- <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
- </notification>
- <notification name="FailedUpdateInstall">
- Se ha producido un error al instalar la actualización del visor.
-Descarga e instala el último visor a través de
-http://secondlife.com/download.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FailedRequiredUpdateInstall">
- No hemos podido instalar una actualización necesaria.
-No podrás iniciar sesión hasta que [APP_NAME] se haya actualizado.
-
-Descarga e instala el último visor a través de
-http://secondlife.com/download.
- <usetemplate name="okbutton" yestext="Salir"/>
- </notification>
- <notification name="UpdaterServiceNotRunning">
- Hay una actualización necesaria para la instalación de Second Life.
-
-Puedes descargar esta actualización de http://www.secondlife.com/downloads
-o instalarla ahora.
- <usetemplate name="okcancelbuttons" notext="Salir de Second Life" yestext="Descargar e instalar ahora"/>
- </notification>
- <notification name="DownloadBackgroundTip">
- Hemos descargado una actualización para la instalación de [APP_NAME].
-Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
- <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [NOMBRE_APL]"/>
- </notification>
- <notification name="DownloadBackgroundDialog">
- Hemos descargado una actualización para la instalación de [APP_NAME].
-Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
- <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/>
- </notification>
- <notification name="RequiredUpdateDownloadedVerboseDialog">
- Hemos descargado una actualización de software necesaria.
-Versión [VERSION]
-
-Debemos reiniciar [APP_NAME] para instalar la actualización.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RequiredUpdateDownloadedDialog">
- Debemos reiniciar [APP_NAME] para instalar la actualización.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeedObjectToGroup">
- Transferir este objeto al grupo hará que:
-* Reciba los L$ pagados en el objeto
- <usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
- </notification>
- <notification name="WebLaunchExternalTarget">
- ¿Quieres abrir tu navegador para ver este contenido?
- <usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="WebLaunchJoinNow">
- ¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta?
- <usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="WebLaunchSecurityIssues">
- Visita el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad.
- <usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="WebLaunchQAWiki">
- Visita el wiki QA de [SECOND_LIFE].
- <usetemplate ignoretext="Abrir mi navegador para el ver el wiki de &apos;QA&apos; (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="WebLaunchPublicIssue">
- Visita el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrás informar de errores y otros asuntos.
- <usetemplate ignoretext="Abrir mi navegador para usar el &apos;Public Issue Tracker&apos;" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="WebLaunchSupportWiki">
- Para ver las últimas noticias e informaciones, ¿ir la Blog oficial?
- <usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLGuide">
- ¿Quieres abrir la Guía de Script para tener ayuda sobre el tema?
- <usetemplate ignoretext="Abrir mi navegador para ver la Guía de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLWiki">
- ¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts?
- <usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="ReturnToOwner">
- ¿Estás seguro de que quieres devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores.
-
-*ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos!
- <usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="GroupLeaveConfirmMember">
- Actualmente, eres miembro del grupo [GROUP].
-¿Dejar el grupo?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmKick">
- ¿Quieres realmente expulsar a todos los residentes de la cuadrícula?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/>
- </notification>
- <notification name="MuteLinden">
- Lo sentimos, pero no puedes ignorar a un Linden.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotStartAuctionAlreadyForSale">
- No puedes empezar una subasta en una parcela que ya está en venta. Desactiva la venta de terreno si estás seguro de querer iniciar una subasta.
- </notification>
- <notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed">
- Ya has ignorado este nombre.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RemoveItemWarn">
- Aunque esté permitido, borrar contenidos puede dañar el objeto.
-¿Quieres borrar ese ítem?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="CantOfferCallingCard">
- En este momento, no se puede ofrecer una tarjeta de visita. Por favor, vuelve a intentarlo en un momento.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CantOfferFriendship">
- En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="BusyModeSet">
- Pasar al modo ocupado.
-Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera.
- <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/>
- </notification>
- <notification name="JoinedTooManyGroupsMember">
- Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta.
-[NAME] te ha invitado a ser miembro de un grupo.
- <usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/>
- </notification>
- <notification name="JoinedTooManyGroups">
- Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="KickUser">
- ¿Con qué mensaje quieres expulsar a este Residente?
- <form name="form">
- <input name="message">
- Un administrador te ha desconectado.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="KickAllUsers">
- ¿Con qué mensaje se expulsará a cualquiera que esté actualmente en el grid?
- <form name="form">
- <input name="message">
- Un administrador te ha desconectado.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="FreezeUser">
- ¿Con qué mensaje quieres congelar a este residente?
- <form name="form">
- <input name="message">
- Has sido congelado. No puedes moverte o escribir en el chat. Un administrador se pondrá en contacto contigo a través de un mensaje instantáneo (MI).
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="UnFreezeUser">
- ¿Con qué mensaje quieres congelar a este residente?
- <form name="form">
- <input name="message">
- Ya no estás congelado.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="SetDisplayNameSuccess">
- ¡Hola, [DISPLAY_NAME]!
-
-Al igual que en la vida real, normalmente se tarda algún tiempo en aprender nombres nuevos. Te recomendamos que esperes varios días antes de [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] en objetos, scripts, búsquedas, etc.
- </notification>
- <notification name="SetDisplayNameBlocked">
- Lo sentimos. No puedes cambiar tu nombre mostrado. Si crees que se trata de un error, ponte en contacto con soporte.
- </notification>
- <notification name="SetDisplayNameFailedLength">
- Lo sentimos. El nombre es demasiado largo. Los nombres mostrados pueden tener un máximo de [LENGTH] caracteres.
-
-Prueba con un nombre más corto.
- </notification>
- <notification name="SetDisplayNameFailedGeneric">
- Lo sentimos. No hemos podido configurar tu nombre mostrado. Vuelve a intentarlo más tarde.
- </notification>
- <notification name="SetDisplayNameMismatch">
- Los nombres mostrados introducidos no coinciden. Vuelve a introducirlos.
- </notification>
- <notification name="AgentDisplayNameUpdateThresholdExceeded">
- Lo sentimos. Tendrás que esperar para poder cambiar tu nombre mostrado.
-
-Consulta http://wiki.secondlife.com/wiki/Setting_your_display_name
-
-Vuelve a intentarlo más tarde.
- </notification>
- <notification name="AgentDisplayNameSetBlocked">
- Lo sentimos. No he mos podido configurar el nombre que has solicitado porque contiene una palabra prohibida.
-
- Prueba con un nombre distinto.
- </notification>
- <notification name="AgentDisplayNameSetInvalidUnicode">
- El nombre mostrado que deseas configurar contiene caracteres no válidos.
- </notification>
- <notification name="AgentDisplayNameSetOnlyPunctuation">
- Tu nombre mostrado debe contener letras y no debe incluir signos de puntuación.
- </notification>
- <notification name="DisplayNameUpdate">
- A [OLD_NAME] ([SLID]) se le conoce ahora como [NEW_NAME].
- </notification>
- <notification name="OfferTeleport">
- ¿Ofrecer teleporte a tu posición con este mensaje?
- <form name="form">
- <input name="message">
- Ven conmigo a [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="OfferTeleportFromGod">
- ¿Obligar a este Residente a ir a tu localización?
- <form name="form">
- <input name="message">
- Ven conmigo a [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="TeleportFromLandmark">
- ¿Seguro que quieres teleportarte a &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
- <usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
- </notification>
- <notification name="TeleportToPick">
- ¿Teleportarte a [PICK]?
- <usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
- </notification>
- <notification name="TeleportToClassified">
- ¿Teleportarte a [CLASSIFIED]?
- <usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
- </notification>
- <notification name="TeleportToHistoryEntry">
- ¿Teleportarse a [HISTORY_ENTRY]?
- <usetemplate ignoretext="Confirmar que quiero teleportarme a una localización del historial" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
- </notification>
- <notification label="Mensaje a todo el estado" name="MessageEstate">
- Escribe un anuncio breve que se enviará a todo el que esté en tu estado.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification label="Cambiar un estado Linden" name="ChangeLindenEstate">
- Estás a punto de cambiar un estado propiedad de Linden (continente, teen grid, orientación, etc.).
-
-Esto es EXTREMADAMENTE PELIGROSO porque puede afectar en gran manera la experiencia de los Residentes. En el Continente, cambiará miles de regiones y y se provocará un colapso en el espacio del servidor.
-
-¿Continuar?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess">
- Vas a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
-
-Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$.
-Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification label="Seleccionar el estado" name="EstateAllowedAgentAdd">
- ¿Añadir a la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
- </notification>
- <notification label="Seleccionar el estado" name="EstateAllowedAgentRemove">
- ¿Quitar de la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
- </notification>
- <notification label="Seleccionar el estado" name="EstateAllowedGroupAdd">
- ¿Añadir a la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
- </notification>
- <notification label="Seleccionar el estado" name="EstateAllowedGroupRemove">
- ¿Quitar de la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
- </notification>
- <notification label="Seleccionar el estado" name="EstateBannedAgentAdd">
- ¿Denegar el acceso sólo a este estado o a [ALL_ESTATES]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
- </notification>
- <notification label="Seleccionar el estado" name="EstateBannedAgentRemove">
- ¿Quitar de la lista de prohibición de acceso a este residente para que acceda sólo a este estado o a [ALL_ESTATES]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
- </notification>
- <notification label="Seleccionar el estado" name="EstateManagerAdd">
- ¿Añadir al administrador del estado sólo para este estado o para [ALL_ESTATES]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
- </notification>
- <notification label="Seleccionar el estado" name="EstateManagerRemove">
- ¿Remover al administrador del estado sólo para este estado o para [ALL_ESTATES]?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
- </notification>
- <notification label="Confirmar la expulsión" name="EstateKickUser">
- ¿Echar a [EVIL_USER] de este estado?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="EstateChangeCovenant">
- ¿Estás seguro de que quieres cambiar el contrato del estado?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked">
- No estás autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-
-Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_KB">
- No estás autorizado en esa región por su nivel de calificación.
-
-¿Quieres ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
- </url>
- <usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_Notify">
- No estás autorizado en esa región por su nivel de calificación.
- </notification>
- <notification name="RegionEntryAccessBlocked_Change">
- No estás autorizado en esta región por tus preferencias sobre el nivel de calificación.
-
-Para entrar en la región que deseas, cambia tu preferencia de nivel de calificación. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Para deshacer los cambios, elige Yo &gt; Preferencias &gt; General.
- <form name="form">
- <button name="OK" text="Cambiar las preferencias"/>
- <button default="true" name="Cancel" text="Cerrar"/>
- <ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/>
- </form>
- </notification>
- <notification name="PreferredMaturityChanged">
- Tu preferencia de nivel de calificación actual es [RATING].
- </notification>
- <notification name="LandClaimAccessBlocked">
- No puedes reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-
-Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked_KB">
- No puedes reclamar este terreno por su nivel de calificación.
-
-¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
- </url>
- <usetemplate ignoretext="No puedo reclamar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
- </notification>
- <notification name="LandClaimAccessBlocked_Notify">
- No puedes reclamar este terreno debido a su nivel de calificación.
- </notification>
- <notification name="LandClaimAccessBlocked_Change">
- No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación.
-
-Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
- <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
- </notification>
- <notification name="LandBuyAccessBlocked">
- No puedes comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-
-Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandBuyAccessBlocked_KB">
- No puedes comprar este terreno por tus preferencias de nivel de calificación.
-
-¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
- <url name="url">
- http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
- </url>
- <usetemplate ignoretext="No puedo comprar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
- </notification>
- <notification name="LandBuyAccessBlocked_Notify">
- No puedes comprar este terreno por su nivel de calificación.
- </notification>
- <notification name="LandBuyAccessBlocked_Change">
- No puedes comprar este terreno por tus preferencias sobre el nivel de calificación.
-
-Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
- <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
- </notification>
- <notification name="TooManyPrimsSelected">
- Hay demasiados prims seleccionados. Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemImportingEstateCovenant">
- Hay problemas al importar el contrato del estado.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemAddingEstateManager">
- Hay problemas al añadir un administrador nuevo del estado. Uno o más estados deben de tener llena la lista de administradores.
- </notification>
- <notification name="ProblemAddingEstateGeneric">
- Hay problemas al añadir a la lista del estado. Uno o más estados deben de tener llena la lista.
- </notification>
- <notification name="UnableToLoadNotecardAsset">
- En este momento, no se pueden cargar los datos de la&apos;s nota&apos;s.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NotAllowedToViewNotecard">
- Permisos insuficientes para ver la nota asociada a la ID solicitada.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MissingNotecardAssetID">
- Se ha perdido en la base de datos la ID de la nota.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PublishClassified">
- Recuerda: las cuotas que se pagan por los clasificados no son reembolsables.
-
-¿Publicar ahora este anuncio por [AMOUNT] L$?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="SetClassifiedMature">
- ¿Este anuncio tiene contenido moderado?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="SetGroupMature">
- ¿Este grupo tiene contenido moderado?
- <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification label="Confirmar el reinicio" name="ConfirmRestart">
- ¿Verdaderamente quieres reiniciar la región de aquí a 2 minutos?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification label="Mensaje a toda la región" name="MessageRegion">
- Escribe un anuncio breve que se enviará a todo el que esté en esta región.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification label="Cambiada la calificación de la región" name="RegionMaturityChange">
- Se ha actualizado el nivel de calificación de esta región.
-Puede que lleve algún tiempo hasta que el cambio se vea reflejado en el mapa.
-
-Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta, bien verificando la edad o bien verificando una forma de pago.
- </notification>
- <notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch">
- Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME].
- </notification>
- <notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner">
- No se pueden comprar a la vez objetos de propietarios diferentes.
-Por favor, selecciona sólo un objeto y vuelve a intentarlo.
- </notification>
- <notification label="No se pudo comprar el contenido" name="BuyContentsOneOnly">
- No se puede comprar a la vez los contenidos de más de un objeto.
-Por favor, selecciona sólo un objeto y vuelve a intentarlo.
- </notification>
- <notification label="No se pudo comprar el contenido" name="BuyContentsOneOwner">
- No se pueden comprar a la vez objetos de propietarios diferentes.
-Por favor, selecciona sólo un objeto y vuelve a intentarlo.
- </notification>
- <notification name="BuyOriginal">
- ¿Comprar el objeto original de [OWNER] por [PRICE] L$?
-Pasarás a ser el propietario de este objeto.
-Podrás:
- Modificarlo: [MODIFYPERM]
- Copiarlo: [COPYPERM]
- Revenderlo o darlo: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="BuyOriginalNoOwner">
- ¿Comprar el objeto original por [PRICE] L$?
-Pasarás a ser el propietario de este objeto.
-Podrás:
- Modificarlo: [MODIFYPERM]
- Copiarlo: [COPYPERM]
- Revenderlo o darlo: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="BuyCopy">
- ¿Comprar una copia de [OWNER] por [PRICE] L$?
-El objeto se copiará a tu inventario.
-Podrás:
- Modificarlo: [MODIFYPERM]
- Copiarlo: [COPYPERM]
- Revenderlo o darlo: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="BuyCopyNoOwner">
- ¿Comprar una copia por [PRICE] L$?
-El objeto se copiará a tu inventario.
-Podrás:
- Modificarlo: [MODIFYPERM]
- Copiarlo: [COPYPERM]
- Revenderlo o darlo: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="BuyContents">
- ¿Comprar los contenidos de [OWNER] por [PRICE] L$?
-Serán copiados a tu inventario.
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="BuyContentsNoOwner">
- ¿Comprar los contenidos por [PRICE] L$?
-Serán copiados a tu inventario.
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchase">
- Esta transacción consiste en:
-[ACTION]
-
-¿Estás seguro de querer hacer esta compra?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchasePassword">
- Esta transacción consiste en:
-[ACTION]
-
-¿Estás seguro de querer hacer esta compra?
-Por favor, vuelva a escribir tu contraseña y pulsa OK.
- <form name="form">
- <input name="message"/>
- <button name="ConfirmPurchase" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="SetPickLocation">
- Nota:
-Has actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromObject">
- Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se quitarán de tu inventario, no se copiarán.
-
-¿Mover el/los ítem/s del inventario?
- <usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromScriptedObject">
- Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se moverán a tu inventario, no se copiarán.
-Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar un mal funcionamiento del script.
-
-¿Mover el/los ítem/s del inventario?
- <usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ClickActionNotPayable">
- Advertencia: la acción &apos;Pagar al objeto&apos; ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
- <form name="form">
- <ignore name="ignore" text="He establecido la acción &apos;Pagar al objeto&apos; cuando construyo uno sin un script money()"/>
- </form>
- </notification>
- <notification name="OpenObjectCannotCopy">
- En este objeto, no hay ítems que estés autorizado a copiar.
- </notification>
- <notification name="WebLaunchAccountHistory">
- ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta?
- <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="ConfirmQuit">
- ¿Estás seguro de que quieres salir?
- <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
- </notification>
- <notification name="DeleteItems">
- [QUESTION]
- <usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="HelpReportAbuseEmailLL">
- Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones del Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad].
-
-Se investigan y resuelven todas las infracciones denunciadas.
- </notification>
- <notification name="HelpReportAbuseSelectCategory">
- Por favor, elige una categoría para esta denuncia de infracción.
-Seleccionar una categoría nos ayuda a clasificar y procesar las denuncias de infracciones.
- </notification>
- <notification name="HelpReportAbuseAbuserNameEmpty">
- Por favor, escribe el nombre del infractor.
-Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
- </notification>
- <notification name="HelpReportAbuseAbuserLocationEmpty">
- Por favor, escribe la localización donde tuvo lugar la infracción.
-Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
- </notification>
- <notification name="HelpReportAbuseSummaryEmpty">
- Por favor, escribe un resumen de la infracción que ha habido.
-Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
- </notification>
- <notification name="HelpReportAbuseDetailsEmpty">
- Por favor, escribe una descripción minuciosa de la infracción que ha habido.
-Sé tan específico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias.
-Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones.
- </notification>
- <notification name="HelpReportAbuseContainsCopyright">
- Estimado Residente:
-
-Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta.
-
-(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (&apos;Abuse Team&apos;) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
-
-(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php &apos;DMCA Policy&apos;].
-
-Si todavía quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia. En concreto, debes seleccionar la categoría &apos;CopyBot o Programa para saltarse los permisos&apos;.
-
-Gracias,
-
-Linden Lab
- </notification>
- <notification name="FailedRequirementsCheck">
- Han desaparecido de [FLOATER] estos componentes:
-[COMPONENTS]
- </notification>
- <notification label="Reemplazar el anexado actual" name="ReplaceAttachment">
- En ese punto de tu cuerpo ya hay un objeto anexado. ¿Quieres reemplazarlo por el objeto que has elegido?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el ítem seleccionado"/>
- <button ignore="Reemplazar automaticamente" name="Yes" text="OK"/>
- <button ignore="Nunca reemplazar" name="No" text="Cancelar"/>
- </form>
- </notification>
- <notification label="¡Aviso! Modo Ocupado" name="BusyModePay">
- Estás en el modo Ocupado. Por tanto, no recibirás ningún ítem a cambio de este pago.
-
-¿Quieres salir del modo Ocupado antes de completar esta transacción?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/>
- <button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/>
- <button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/>
- </form>
- </notification>
- <notification name="ConfirmDeleteProtectedCategory">
- La carpeta &apos;[FOLDERNAME]&apos; pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla?
- <usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmEmptyTrash">
- ¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera?
- <usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearBrowserCache">
- ¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearCookies">
- ¿Estás seguro de que quieres limpiar tus cookies?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
- </notification>
- <notification name="ConfirmClearMediaUrlList">
- ¿Estás seguro de que quieres vaciar tu lista de URL guardadas?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
- </notification>
- <notification name="ConfirmEmptyLostAndFound">
- ¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos?
- <usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="CopySLURL">
- Se ha copiado a tu portapapeles esta SLurl:
- [SLURL]
-
-Publícala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador.
- <form name="form">
- <ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/>
- </form>
- </notification>
- <notification name="WLSavePresetAlert">
- ¿Quieres sobrescribir la preselección guardada?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="WLDeletePresetAlert">
- ¿Quieres borrar [SKY]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="WLNoEditDefault">
- No puedes editar ni borrar una preselección por defecto.
- </notification>
- <notification name="WLMissingSky">
- Este archivo del ciclo de un día se refiere a un archivo perdido de cielo: [SKY].
- </notification>
- <notification name="PPSaveEffectAlert">
- Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="NewSkyPreset">
- Dame un nombre para el cielo nuevo.
- <form name="form">
- <input name="message">
- Preselección nueva
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="ExistsSkyPresetAlert">
- ¡Esa preselección ya existe!
- </notification>
- <notification name="NewWaterPreset">
- Dame un nombre para la nueva preselección de agua.
- <form name="form">
- <input name="message">
- Preselección nueva
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="ExistsWaterPresetAlert">
- ¡Esa preselección ya existe!
- </notification>
- <notification name="WaterNoEditDefault">
- No puedes editar o borrar una preselección por defecto.
- </notification>
- <notification name="ChatterBoxSessionStartError">
- No se puede empezar una nueva sesión de chat con [RECIPIENT].
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ChatterBoxSessionEventError">
- [EVENT]
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ForceCloseChatterBoxSession">
- Debe cerrarse tu sesión de chat con [NAME].
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="Cannot_Purchase_an_Attachment">
- No puedes comprar un objeto mientras esté anexado.
- </notification>
- <notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails">
- Al admitir esta petición, le das permiso a un script para que coja dólares Linden (L$) de tu cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AutoWearNewClothing">
- ¿Quieres ponerte automáticamente la ropa que vas a crear?
- <usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="NotAgeVerified">
- Debes haber verificado tu edad para visitar este sitio. ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=es
- </url>
- <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="Cannot enter parcel: no payment info on file">
- Para visitar este sitio debes haber aportado información de pago en tu cuenta. ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/index.php?lang=es
- </url>
- <usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="MissingString">
- La cadena [STRING_NAME] Ha desaparecido de strings.xml
- </notification>
- <notification name="SystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="IMSystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="Cancelled">
- Cancelado
- </notification>
- <notification name="CancelledSit">
- Cancelado el sentarte
- </notification>
- <notification name="CancelledAttach">
- Cancelado el anexar
- </notification>
- <notification name="ReplacedMissingWearable">
- Reemplazadas las ropas o partes del cuerpo perdidas con sus equivalentes por defecto.
- </notification>
- <notification name="GroupNotice">
- Asunto: [SUBJECT], Mensaje: [MESSAGE]
- </notification>
- <notification name="FriendOnline">
- [NAME] está conectado
- </notification>
- <notification name="FriendOffline">
- [NAME] está desconectado
- </notification>
- <notification name="AddSelfFriend">
- Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
- </notification>
- <notification name="UploadingAuctionSnapshot">
- Subiendo fotos del mundo y del sitio web...
-(tardará unos 5 minutos).
- </notification>
- <notification name="UploadPayment">
- Has pagado [AMOUNT] LS por la subida.
- </notification>
- <notification name="UploadWebSnapshotDone">
- Completada la subida de la foto del sitio web.
- </notification>
- <notification name="UploadSnapshotDone">
- Completada la subida de la foto del mundo.
- </notification>
- <notification name="TerrainDownloaded">
- Se ha descargado Terrain.raw
- </notification>
- <notification name="GestureMissing">
- No se encuentra en la base de datos el gesto [NAME].
- </notification>
- <notification name="UnableToLoadGesture">
- No se puede cargar el gesto [NAME].
- </notification>
- <notification name="LandmarkMissing">
- El hito ha desaparecido de la base de datos.
- </notification>
- <notification name="UnableToLoadLandmark">
- No se ha podido cargar el hito. Por favor, vuelve a intentarlo.
- </notification>
- <notification name="CapsKeyOn">
- Tienes pulsada la tecla de mayúsculas.
-Esto puede influir en tu contraseña.
- </notification>
- <notification name="NotecardMissing">
- La nota ha desaparecido de la base de datos.
- </notification>
- <notification name="NotecardNoPermissions">
- No tienes permiso para ver esta nota.
- </notification>
- <notification name="RezItemNoPermissions">
- No tienes permisos suficientes para renderizar el objeto.
- </notification>
- <notification name="UnableToLoadNotecard">
- En este momento no se puede cargar la nota.
- </notification>
- <notification name="ScriptMissing">
- El script ha desaparecido de la base de datos.
- </notification>
- <notification name="ScriptNoPermissions">
- No tienes permisos suficientes para ver el script.
- </notification>
- <notification name="UnableToLoadScript">
- No se ha podido cargar el script. Por favor, vuelve a intentarlo.
- </notification>
- <notification name="IncompleteInventory">
- Los contenidos que estás ofreciendo aún no están disponibles. Por favor, vuelve a ofrecerlos en un minuto.
- </notification>
- <notification name="CannotModifyProtectedCategories">
- No puedes modificar categorías que están protegidas.
- </notification>
- <notification name="CannotRemoveProtectedCategories">
- No puedes quitar categorías que están protegidas.
- </notification>
- <notification name="UnableToBuyWhileDownloading">
- No se puede comprar un objeto mientras se descargan los datos.
-Por favor, vuelve a intentarlo.
- </notification>
- <notification name="UnableToLinkWhileDownloading">
- No se puede enlazar un objeto mientras se descargan los datos.
-Por favor, vuelve a intentarlo.
- </notification>
- <notification name="CannotBuyObjectsFromDifferentOwners">
- No puedes comprar más de un objeto a la vez.
-Por favor, selecciona un sólo objeto.
- </notification>
- <notification name="ObjectNotForSale">
- Este objeto no está en venta.
- </notification>
- <notification name="EnteringGodMode">
- Entrando en el modo administrativo, nivel [LEVEL]
- </notification>
- <notification name="LeavingGodMode">
- Saliendo del modo administrativo, nivel [LEVEL]
- </notification>
- <notification name="CopyFailed">
- No tienes pemiso para copiar esto.
- </notification>
- <notification name="InventoryAccepted">
- [NAME] ha recibido tu oferta de inventario.
- </notification>
- <notification name="InventoryDeclined">
- [NAME] ha rehusado tu oferta del inventario.
- </notification>
- <notification name="ObjectMessage">
- [NAME]: [MESSAGE]
- </notification>
- <notification name="CallingCardAccepted">
- Se ha aceptado tu tarjeta de visita.
- </notification>
- <notification name="CallingCardDeclined">
- Se ha rehusado tu tarjeta de visita.
- </notification>
- <notification name="TeleportToLandmark">
- Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
-Pulsa en un hito para seleccionarlo, y, luego, pulsa &apos;Teleportar&apos; en la parte inferior del panel.
-(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir &apos;Teleportar&apos;.)
- </notification>
- <notification name="TeleportToPerson">
- Puedes contactar con un Residente como &apos;[NAME]&apos; abriendo el panel Gente en el lado derecho de tu pantalla.
-Elige al Residente de la lista y pulsa &apos;MI&apos; en la parte inferior del panel.
-(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
- </notification>
- <notification name="CantSelectLandFromMultipleRegions">
- No puedes seleccionar un terreno que cruce las fronteras entre servidores.
-Inténtalo seleccionando un trozo más pequeño de terreno.
- </notification>
- <notification name="SearchWordBanned">
- Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
- </notification>
- <notification name="NoContentToSearch">
- Por favor, elige al menos un tipo de contenido a buscar (General, Moderado o Adulto;).
- </notification>
- <notification name="SystemMessage">
- [MESSAGE]
- </notification>
- <notification name="PaymentReceived">
- [MESSAGE]
- </notification>
- <notification name="PaymentSent">
- [MESSAGE]
- </notification>
- <notification name="EventNotification">
- Notificación de un evento:
-
-[NAME]
-[DATE]
- <form name="form">
- <button name="Details" text="Detalles"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="TransferObjectsHighlighted">
- En estos momentos, están realzados todos los objetos de esta parcela que serán transferidos al comprador de la misma.
-
-* No están realzados los árboles y hierbas que se transferirán.
- <form name="form">
- <button name="Done" text="Hecho"/>
- </form>
- </notification>
- <notification name="DeactivatedGesturesTrigger">
- Desactivados los gestos que tienen el mismo botón:
-[NAMES]
- </notification>
- <notification name="NoQuickTime">
- No parece que tu sistema tenga instalado el software QuickTime de Apple.
-Si quieres ver media en streaming en las parcelas que los tienen, deberías ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player.
- </notification>
- <notification name="NoPlugin">
- No se ha encontrado el &apos;Media Plugin&apos; para manejar el &apos;mime type&apos; &quot;[MIME_TYPE]&quot;. Los media de este tipo no estarán disponibles.
- </notification>
- <notification name="MediaPluginFailed">
- Fallo de este &apos;Media Plugin&apos;:
- [PLUGIN]
-
-Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas.
- <form name="form">
- <ignore name="ignore" text="Fallo al ejecutar un &apos;Media Plugin&apos;"/>
- </form>
- </notification>
- <notification name="OwnedObjectsReturned">
- Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada.
- </notification>
- <notification name="OtherObjectsReturned">
- Se han devuelto a su inventario los objetos en la parcela de terreno seleccionada propiedad de [NAME].
- </notification>
- <notification name="OtherObjectsReturned2">
- Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de &apos;[NAME]&apos;.
- </notification>
- <notification name="GroupObjectsReturned">
- Se han devuelto a los inventarios de sus propietarios los objetos que estaban compartidos con el grupo [GROUPNAME] en la parcela seleccionada.
-Los objetos transferibles que se transfirieron al grupo se han devuelto a sus propietarios anteriores.
-Los objetos no transferibles que se transfirieron al grupo han sido borrados.
- </notification>
- <notification name="UnOwnedObjectsReturned">
- Se han devuelto a sus propietarios los objetos de los que NO eras propietario en la parcela seleccionada.
- </notification>
- <notification name="ServerObjectMessage">
- Mensaje de [NAME]:
-&lt;nolink&gt;[MSG]&lt;/nolink&gt;
- </notification>
- <notification name="NotSafe">
- Este terreno tiene el daño activado.
-Aquí puedes ser herido. Si mueres, se te teleportará a tu Base.
- </notification>
- <notification name="NoFly">
- Este terreno tiene desactivado el poder volar.
-Aquí no puedes volar.
- </notification>
- <notification name="PushRestricted">
- Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno.
- </notification>
- <notification name="NoVoice">
- Este tereno tiene desactivado el chat de voz. No podrás oír hablar a nadie.
- </notification>
- <notification name="NoBuild">
- Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
- </notification>
- <notification name="ScriptsStopped">
- Un administrador ha detenido temporalmente los scripts en esta región.
- </notification>
- <notification name="ScriptsNotRunning">
- En esta región no se está ejecutando ningún script.
- </notification>
- <notification name="NoOutsideScripts">
- Este terreno tiene desactivados los scripts externos.
-
-Los scripts no funcionan aquí, excepto los pertenecientes al propietario del terreno.
- </notification>
- <notification name="ClaimPublicLand">
- Sólo puedes reclamar terreno público de la región en que estás.
- </notification>
- <notification name="RegionTPAccessBlocked">
- No estás autorizado en esa región por su nivel de calificación. Debes validar tu edad y/o instalar el último visor.
-
-Por favor, dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- </notification>
- <notification name="URBannedFromRegion">
- Se te ha prohibido el acceso a la región.
- </notification>
- <notification name="NoTeenGridAccess">
- Tu cuenta no puede conectarse a esta región del grid teen.
- </notification>
- <notification name="ImproperPaymentStatus">
- No tienes el estado de pago adecuado para entrar a esta región.
- </notification>
- <notification name="MustGetAgeParcel">
- Debes haber verificado tu edad para entrar a esta parcela.
- </notification>
- <notification name="NoDestRegion">
- No se ha encontrada la región de destino.
- </notification>
- <notification name="NotAllowedInDest">
- No estás autorizado en el destino.
- </notification>
- <notification name="RegionParcelBan">
- No puedes cruzar la región por una parcela con el acceso prohibido. Intenta otro camino.
- </notification>
- <notification name="TelehubRedirect">
- Has sido redirigido a un punto de teleporte.
- </notification>
- <notification name="CouldntTPCloser">
- No se puede teleportar a un destino tan cercano.
- </notification>
- <notification name="TPCancelled">
- Teleporte cancelado.
- </notification>
- <notification name="FullRegionTryAgain">
- En estos momentos, está llena la región a la que estás intentando entrar.
-Por favor, vuelve a intentarlo en unos momentos.
- </notification>
- <notification name="GeneralFailure">
- Fallo general.
- </notification>
- <notification name="RoutedWrongRegion">
- Mal dirigido a la región. Por favor, vuelve a intentarlo.
- </notification>
- <notification name="NoValidAgentID">
- ID de agente inválido.
- </notification>
- <notification name="NoValidSession">
- ID de sesión inválido.
- </notification>
- <notification name="NoValidCircuit">
- Circuito de código inválido.
- </notification>
- <notification name="NoValidTimestamp">
- Fecha inválida.
- </notification>
- <notification name="NoPendingConnection">
- No se puede crear la conexión.
- </notification>
- <notification name="InternalUsherError">
- Se ha producido un error interno al intentar acceder al destino de tu teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
- </notification>
- <notification name="NoGoodTPDestination">
- No se puede encontrar en esta región un buen destino para el teleporte.
- </notification>
- <notification name="InternalErrorRegionResolver">
- Se ha producido un error interno al manejar las coordenadas globales de tu petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
- </notification>
- <notification name="NoValidLanding">
- No se ha podido encontrar un punto de aterrizaje válido.
- </notification>
- <notification name="NoValidParcel">
- No se ha podido encontrar una parcela válida.
- </notification>
- <notification name="ObjectGiveItem">
- Un objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]:
-[ITEM_SLURL]
- <form name="form">
- <button name="Keep" text="Guardar"/>
- <button name="Discard" text="Descartar"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
- <notification name="UserGiveItem">
- [NAME_SLURL] te ha dado este [OBJECTTYPE]:
-[ITEM_SLURL]
- <form name="form">
- <button name="Show" text="Mostrar"/>
- <button name="Discard" text="Descartar"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
- <notification name="GodMessage">
- [NAME]
-
-[MESSAGE]
- </notification>
- <notification name="JoinGroup">
- [MESSAGE]
- <form name="form">
- <button name="Join" text="Entrar"/>
- <button name="Decline" text="Rehusar"/>
- <button name="Info" text="Información"/>
- </form>
- </notification>
- <notification name="TeleportOffered">
- [NAME_SLURL] te ha ofrecido teleportarte a su posición:
-
-[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
- <form name="form">
- <button name="Teleport" text="Teleportar"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="TeleportOfferSent">
- Teleporte ofrecido a [TO_NAME]
- </notification>
- <notification name="GotoURL">
- [MESSAGE]
-[URL]
- <form name="form">
- <button name="Later" text="Más tarde"/>
- <button name="GoNow..." text="Ir ahora..."/>
- </form>
- </notification>
- <notification name="OfferFriendship">
- [NAME_SLURL] te está ofreciendo su amistad.
-
-[MESSAGE]
-
-(Por defecto, podrás ver si el otro está conectado)
- <form name="form">
- <button name="Accept" text="Aceptar"/>
- <button name="Decline" text="Rehusar"/>
- </form>
- </notification>
- <notification name="FriendshipOffered">
- Has ofrecido amistad a [TO_NAME]
- </notification>
- <notification name="OfferFriendshipNoMessage">
- [NAME_SLURL] está ofreciendo amistad.
-
-(De manera predeterminada, podrás ver si están conectados los demás.)
- <form name="form">
- <button name="Accept" text="Aceptar"/>
- <button name="Decline" text="Rehusar"/>
- </form>
- </notification>
- <notification name="FriendshipAccepted">
- [NAME] ha aceptado tu oferta de amistad.
- </notification>
- <notification name="FriendshipDeclined">
- [NAME] ha rehusado tu oferta de amistad.
- </notification>
- <notification name="FriendshipAcceptedByMe">
- Aceptado el ofrecimiento de amistad.
- </notification>
- <notification name="FriendshipDeclinedByMe">
- Rehusado el ofrecimiento de amistad.
- </notification>
- <notification name="OfferCallingCard">
- [NAME] te está ofreciendo su tarjeta de visita.
-Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI.
- <form name="form">
- <button name="Accept" text="Aceptar"/>
- <button name="Decline" text="Rehusar"/>
- </form>
- </notification>
- <notification name="RegionRestartMinutes">
- Esta región se reiniciará en [MINUTES] minutos.
-Si permaneces en esta región serás desconectado.
- </notification>
- <notification name="RegionRestartSeconds">
- Esta región se reiniciará en [SECONDS] segundos.
-Si permaneces en esta región serás desconectado.
- </notification>
- <notification name="LoadWebPage">
- ¿Cargar página web [URL]?
-
-[MESSAGE]
-
-Del objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propietario: [NAME]?
- <form name="form">
- <button name="Gotopage" text="Cargar"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification name="FailedToFindWearableUnnamed">
- Búsqueda fallida de [TYPE] en la base de datos.
- </notification>
- <notification name="FailedToFindWearable">
- Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos.
- </notification>
- <notification name="InvalidWearable">
- El ítem que quieres vestirte tiene una característica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este ítem.
- </notification>
- <notification name="ScriptQuestion">
- &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, un objeto propiedad de &apos;[NAME]&apos;, quiere:
-
-[QUESTIONS]
-¿Es correcto?
- <form name="form">
- <button name="Yes" text="Sí"/>
- <button name="No" text="No"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
- <notification name="ScriptQuestionCaution">
- Un objeto de nombre &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, propiedad de &apos;[NAME]&apos;, quiere:
-
-[QUESTIONS]
-Si no confias en este objeto y en su creador, deberías rehusar esta petición.
-
-¿Autorizar esta petición?
- <form name="form">
- <button name="Grant" text="Autorizar"/>
- <button name="Deny" text="Denegar"/>
- <button name="Details" text="Detalles..."/>
- </form>
- </notification>
- <notification name="ScriptDialog">
- &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Ignorar"/>
- </form>
- </notification>
- <notification name="ScriptDialogGroup">
- &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [GROUPNAME]
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Ignorar"/>
- </form>
- </notification>
- <notification name="BuyLindenDollarSuccess">
- ¡Gracias por tu pago!
-
-Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$.
-
-Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control]
- </notification>
- <notification name="FirstOverrideKeys">
- A partir de ahora, tus teclas de movimiento las gestiona un objeto.
-Prueba las teclas del cursor o AWSD para ver qué hacen.
-Algunos objetos (las pistolas, por ejemplo) te pedirán que, para usarlos, entres en vista subjetiva. Pulsa &apos;M&apos; para hacerlo.
- </notification>
- <notification name="FirstSandbox">
- Esta es una región &apos;sandbox&apos; (zona de pruebas) donde los Residentes pueden aprender a construir.
-
-Los objetos que construyas aquí serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir &apos;Tomar&apos; para que tu creación vaya a tu inventario.
- </notification>
- <notification name="MaxListSelectMessage">
- Puedes seleccionar un máximo de [MAX_SELECT] ítems de esta lista.
- </notification>
- <notification name="VoiceInviteP2P">
- [NAME] te está invitando a un chat de voz.
-Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
- <form name="form">
- <button name="Accept" text="Aceptar"/>
- <button name="Decline" text="Rehusar"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
- <notification name="AutoUnmuteByIM">
- [NAME] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo.
- </notification>
- <notification name="AutoUnmuteByMoney">
- [NAME] ha dejado automáticamente de estar ignorado al darle dinero.
- </notification>
- <notification name="AutoUnmuteByInventory">
- [NAME] ha dejado automáticamente de estar ignorado al ofrecerle inventario.
- </notification>
- <notification name="VoiceInviteGroup">
- [NAME] ha empezado un chat de voz con el grupo [GROUP].
-Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
- <form name="form">
- <button name="Accept" text="Aceptar"/>
- <button name="Decline" text="Rehusar"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
- <notification name="VoiceInviteAdHoc">
- [NAME] ha empezado un chat de voz en multiconferencia.
-Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
- <form name="form">
- <button name="Accept" text="Aceptar"/>
- <button name="Decline" text="Rehusar"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
- <notification name="InviteAdHoc">
- NAME] te está invitando a un chat en multiconferencia.
-Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
- <form name="form">
- <button name="Accept" text="Aceptar"/>
- <button name="Decline" text="Rehusar"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
- <notification name="VoiceChannelFull">
- El chat de voz al que estás intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, vuelve a intentarlo más tarde.
- </notification>
- <notification name="ProximalVoiceChannelFull">
- Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intenta usar la voz en otra zona.
- </notification>
- <notification name="VoiceChannelDisconnected">
- Has sido desconectado de [VOICE_CHANNEL_NAME]. Vas a ser reconectado al chat de voz.
- </notification>
- <notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] ha colgado la llamada. Vas a ser reconectado al chat de voz.
- </notification>
- <notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] ha rehusado tu llamada. Vas a ser reconectado al chat de voz.
- </notification>
- <notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] no está disponible para coger tu llamada. Vas a ser reconectado al chat de voz.
- </notification>
- <notification name="VoiceChannelJoinFailed">
- Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz.
- </notification>
- <notification name="VoiceLoginRetry">
- Estamos creando un canal de voz para ti. Se puede tardar hasta un minuto.
- </notification>
- <notification name="VoiceEffectsExpired">
- Una o más de las transformaciones de voz a las que estás suscrito han caducado.
-[Pulsa aquí [URL]] para renovar la suscripción.
- </notification>
- <notification name="VoiceEffectsExpiredInUse">
- La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal.
-[Pulsa aquí [URL]] para renovar la suscripción.
- </notification>
- <notification name="VoiceEffectsWillExpire">
- Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] días.
-[Pulsa aquí [URL]] para renovar la suscripción.
- </notification>
- <notification name="VoiceEffectsNew">
- Están disponibles nuevas transformaciones de voz.
- </notification>
- <notification name="Cannot enter parcel: not a group member">
- Sólo los miembros de un grupo determinado pueden visitar esta zona.
- </notification>
- <notification name="Cannot enter parcel: banned">
- No puedes entrar en esta parcela, se te ha prohibido el acceso.
- </notification>
- <notification name="Cannot enter parcel: not on access list">
- No puedes entrar en esta parcela, no estás en la lista de acceso.
- </notification>
- <notification name="VoiceNotAllowed">
- No tienes permiso para conectarte al chat de voz de [VOICE_CHANNEL_NAME].
- </notification>
- <notification name="VoiceCallGenericError">
- Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde.
- </notification>
- <notification name="UnsupportedCommandSLURL">
- No se admite el formato de la SLurl que has pulsado.
- </notification>
- <notification name="BlockedSLURL">
- Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza.
- </notification>
- <notification name="ThrottledSLURL">
- En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza.
-Por tu seguridad, serán bloqueadas durante unos segundos.
- </notification>
- <notification name="IMToast">
- [MESSAGE]
- <form name="form">
- <button name="respondbutton" text="Responder"/>
- </form>
- </notification>
- <notification name="ConfirmCloseAll">
- ¿Seguro que quieres cerrar todos los MI?
- <usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="AttachmentSaved">
- Se ha guardado el adjunto.
- </notification>
- <notification name="UnableToFindHelpTopic">
- No se ha podido encontrar un tema de ayuda para este elemento.
- </notification>
- <notification name="ObjectMediaFailure">
- Error del servidor: fallo en la actualización u obtención de los media.
-&apos;[ERROR]&apos;
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TextChatIsMutedByModerator">
- Un moderador ha silenciado tu chat de texto.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="VoiceIsMutedByModerator">
- Un moderador ha silenciado tu voz.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearTeleportHistory">
- ¿Estás seguro de que quieres borrar tu historial de teleportes?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="BottomTrayButtonCanNotBeShown">
- El botón elegido no se puede mostrar correctamente.
-Se mostrará cuando haya suficiente espacio.
- </notification>
- <notification name="ShareNotification">
- Selecciona los residentes con quienes deseas compartir.
- </notification>
- <notification name="ShareItemsConfirmation">
- ¿Estás seguro de que quieres compartir los elementos siguientes?
-
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-
-Con los siguientes residentes:
-
-[RESIDENTS]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="ItemsShared">
- Los elementos se han compartido correctamente.
- </notification>
- <notification name="DeedToGroupFail">
- Error de transferencia a grupo.
- </notification>
- <notification name="AvatarRezNotification">
- ( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; tardó [TIME] segundos en dejar de aparecer como nube.
- </notification>
- <notification name="AvatarRezSelfBakedDoneNotification">
- ( [EXISTENCE] segundos vivo)
-Has terminado de texturizar tu vestuario en [TIME] segundos.
- </notification>
- <notification name="AvatarRezSelfBakedUpdateNotification">
- ( [EXISTENCE] segundos vivo)
-Has enviado una actualización de tu apariencia después de [TIME] segundos.
-[STATUS]
- </notification>
- <notification name="AvatarRezCloudNotification">
- ( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; se convirtió en nube.
- </notification>
- <notification name="AvatarRezArrivedNotification">
- ( [EXISTENCE] segundos vivo)
-Apareció el avatar &apos;[NAME]&apos;.
- </notification>
- <notification name="AvatarRezLeftCloudNotification">
- ( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; salió al cabo de [TIME] segundos como nube.
- </notification>
- <notification name="AvatarRezEnteredAppearanceNotification">
- ( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; ya está en modo de edición de apariencia.
- </notification>
- <notification name="AvatarRezLeftAppearanceNotification">
- ( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; desactivó el modo de apariencia.
- </notification>
- <notification name="NoConnect">
- Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
-Comprueba la configuración de la red y del servidor de seguridad.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NoVoiceConnect">
- Tenemos problemas de conexión con tu servidor de voz:
-
-[HOSTID]
-
-No podrás establecer comunicaciones de voz.
-Comprueba la configuración de la red y del servidor de seguridad.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarRezLeftNotification">
- ( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; ya estaba totalmente cargado al salir.
- </notification>
- <notification name="AvatarRezSelfBakedTextureUploadNotification">
- ( [EXISTENCE] segundos con vida )
-Has actualizado una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
- </notification>
- <notification name="AvatarRezSelfBakedTextureUpdateNotification">
- ( [EXISTENCE] segundos con vida )
-Has actualizado de manera local una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
- </notification>
- <notification name="ConfirmLeaveCall">
- ¿Estás seguro de que deseas salir de esta multiconferencia?
- <usetemplate ignoretext="Confirma antes de salir de la llamada" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="ConfirmMuteAll">
- Has seleccionado silenciar a todos los participantes en una multiconferencia.
-Si lo haces, todos los residentes que se unan posteriormente a la llamada también serán silenciados, incluso cuando abandones la conferencia.
-
-¿Deseas silenciar a todos?
- <usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification label="Chat" name="HintChat">
- Para unirte a la conversación, escribe en el campo de chat que aparece a continuación.
- </notification>
- <notification label="Levantarme" name="HintSit">
- Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme.
- </notification>
- <notification label="Hablar" name="HintSpeak">
- Pulsa en el botón: Hablar para conectar y desconectar el micrófono.
-
-Pulsa en el cursor arriba para ver el panel de control de voz.
-
-Al ocultar el botón Hablar se desactiva la función de voz.
- </notification>
- <notification label="Explora el mundo" name="HintDestinationGuide">
- La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
- </notification>
- <notification label="Panel lateral" name="HintSidePanel">
- Accede de manera rápida a tu inventario, así como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral.
- </notification>
- <notification label="Mover" name="HintMove">
- Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado.
- </notification>
- <notification label="" name="HintMoveClick">
- 1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él.
-
-2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista.
- </notification>
- <notification label="Nombre mostrado" name="HintDisplayName">
- Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias.
- </notification>
- <notification label="Visión" name="HintView">
- Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina.
- </notification>
- <notification label="Inventario" name="HintInventory">
- Accede a tu inventario para buscar ítems. Los ítems más recientes se pueden encontrar fácilmente en la pestaña Recientes.
- </notification>
- <notification label="¡Tienes dólares Linden!" name="HintLindenDollar">
- Éste es tu saldo actual de L$. Haz clic en Comprar L$ para comprar más dólares Linden.
- </notification>
- <notification name="PopupAttempt">
- Se ha impedido que se abriera una ventana emergente.
- <form name="form">
- <ignore name="ignore" text="Permitir todas las ventanas emergentes"/>
- <button name="open" text="Abrir ventana emergente"/>
- </form>
- </notification>
- <notification name="AuthRequest">
- El sitio en &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; de la plataforma &apos;[REALM]&apos; requiere un nombre de usuario y una contraseña.
- <form name="form">
- <input name="username" text="Nombre de usuario"/>
- <input name="password" text="Contraseña"/>
- <button name="ok" text="Enviar"/>
- <button name="cancel" text="Cancelar"/>
- </form>
- </notification>
- <notification label="" name="ModeChange">
- Para cambiar de modo tienes que salir y reiniciar.
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
- <notification label="" name="NoClassifieds">
- La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
- <notification label="" name="NoGroupInfo">
- La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
- <notification label="" name="NoPicks">
- La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
- <notification label="" name="NoWorldMap">
- La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
- <notification label="" name="NoVoiceCall">
- Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
- <notification label="" name="NoAvatarShare">
- Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
- <notification label="" name="NoAvatarPay">
- El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
- <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
- </notification>
- <global name="UnsupportedCPU">
- - La velocidad de tu CPU no cumple los requerimientos mínimos.
- </global>
- <global name="UnsupportedGLRequirements">
- Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tienes, comprueba que tienes los últimos &apos;drivers&apos; para tu tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para tu sistema operativo.
-
-Si los problemas persisten, por favor, acude a [SUPPORT_SITE].
- </global>
- <global name="UnsupportedCPUAmount">
- 796
- </global>
- <global name="UnsupportedRAMAmount">
- 510
- </global>
- <global name="UnsupportedGPU">
- - Tu tarjeta gráfica no cumple los requerimientos mínimos.
- </global>
- <global name="UnsupportedRAM">
- - La memoria de tu sistema no cumple los requerimientos mínimos.
- </global>
- <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
- Si posees un terreno, puedes hacerlo tu Base.
-También puedes buscar en el Mapa lugares marcados como &quot;Puntos de Información&quot;.
- </global>
- <global name="You died and have been teleported to your home location">
- Has muerto y te has teleportado a tu Base.
- </global>
-</notifications>
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ No mostrarme esto otra vez
+ </global>
+ <global name="alwayschoose">
+ Elegir siempre esta opción
+ </global>
+ <global name="implicitclosebutton">
+ Cerrar
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert">
+ Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir. Por favor, comprueba que tienes instalado el último Visor.
+
+Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha encontrado en notifications.xml.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Error: no se pudieron encontrar estos controles:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ Actualmente, no hay un tutorial disponible.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
+ </notification>
+ <notification name="BadInstallation">
+ Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ No se puede conectar con [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ No se ha encontrado la plantilla de mensaje [PATH].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="WearableSave">
+ ¿Guardar los cambios en las ropas o partes del cuerpo actuales?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="WriteAnimationFail">
+ Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ No se puede ver a la vez los contenidos de más de un ítem. Por favor, elige un solo objeto y vuelve a intentarlo.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ ¿Guardar todos los cambios en la ropa y partes del cuerpo?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos todos"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
+¿Quieres conceder permisos de modificación a [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
+¿Quieres conceder permisos de modificación a los Residentes elegidos?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ ¿Quieres retirar los permisos de modificación a [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ ¿Quieres revocar los derechos de modificación a los residentes seleccionados?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ No se ha podido crear el grupo.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ignorar los cambios" yestext="Aplicar los cambios"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ Para enviar un aviso de grupo debes especificar un asunto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ Vas a añadir miembros al rol de [ROLE_NAME].
+No podrás removérseles de ese rol, sino que deberán renunciar a él por sí mismos.
+¿Estás seguro de que quieres seguir?
+ <usetemplate ignoretext="Confirmar que vas a añadir un nuevo propietario al grupo" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
+
+ *ATENCIÓN*
+ Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad.
+¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
+
+ *ATENCIÓN*
+ Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- todas las capacidades, elevándose hasta poderes cercanos a los del propietario.
+¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ Vas a soltar tu anexado.
+ ¿Estás seguro de que quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de soltar anexados" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Entrar a este grupo cuesta [COST] L$.
+¿Quieres hacerlo??
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ Vas a entrar al grupo [NAME].
+¿Quieres seguir?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Entrar a este grupo cuesta [COST] L$.
+No tienes dinero suficiente para entrar.
+ </notification>
+ <notification name="CreateGroupCost">
+ Crear este grupo te costará 100 L$.
+Los grupos necesitan más de un miembro. Si no, son borrados permanentemente.
+Por favor, invita a miembros en las próximas 48 horas.
+ <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/>
+ </notification>
+ <notification name="LandBuyPass">
+ Por [COST] L$ puedes entrar a este terreno (&apos;[PARCEL_NAME]&apos;) durante [TIME] horas. ¿Comprar un pase?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ El precio de venta tiene que ser mayor de 0 L$ si la venta es a cualquiera.
+Por favor, elige a alguien concreto como comprador si la venta es por 0 L$.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta.
+El precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME].
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ ATENCIÓN: Marcando &apos;vender a cualquiera&apos; hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
+
+Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta.
+El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME].
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo &apos;[NAME]&apos; al inventario de su propietario anterior?
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ ¿Estás seguro de que quieres devolver al inventario de &apos;[NAME]&apos; todos los objetos que sean de su propiedad en esta parcela?
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ ¿Estás seguro de que quieres devolver a su inventario todos los objetos de los que eres propietario en esta parcela?
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ ¿Estás seguro de que quieres devolver todos los objetos de los que NO eres propietario en esta parcela al inventario de sus propietarios?
+Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario?
+Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ ¿Estás seguro de que quieres devolver al inventario de su propietario todos los objetos de la lista?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ ¿Estás seguro de que quieres desactivar todos los objetos de esta región?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ ¿Devolver a sus propietarios los objetos de esta parcela que NO estén compartidos con el grupo [NAME]?
+
+Objetos: [N]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ No se pueden desactivar los scripts.
+Toda esta región tiene activado el &apos;daño&apos;.
+Para que funcionen las armas los scripts deben estar activados.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Están seleccionadas varias caras.
+Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media.
+Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir.
+ <usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ Para configurar el Punto de llegada de la parcela,
+debes estar dentro de ella.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Por favor, escribe una dirección de correo electrónica válida para el/los receptor/es.
+ </notification>
+ <notification name="PromptSelfEmail">
+ Por favor, escribe tu dirección de correo electrónico.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ ¿Foto por correo electrónico con el asunto o el mensaje por defecto?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Error al procesar los datos de la foto.
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Error al codificar la foto.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ Hubo un problema al enviar la foto por la siguiente razón: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ Hubo un problema al subir la captura de pantalla del informe por la siguiente razón: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ Debes estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE].
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ No se ha podido poner el vestuario.
+La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa.
+ </notification>
+ <notification name="CannotWearTrash">
+ No puedes vestirte ropas o partes del cuerpo que estén en la Papelera
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ No se puede anexar el objeto.
+Se ha superado el límite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quítate alguno.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ No puedes vestirte este ítem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Lo sentimos. Se ha quedado algún espacio en blanco.
+Tienes que volver a introducir el nombre de usuario de tu avatar.
+
+Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustaría crear una ahora?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=es-ES
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez.
+ </notification>
+ <notification name="DeleteClassified">
+ ¿Borrar el clasificado &apos;[NAME]&apos;?
+No se reembolsan las cuotas pagadas.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Has elegido borrar los media asociados a esta cara.
+¿Estás seguro de que quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ ¿Guardar los cambios en el clasificado [NAME]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Dinero insuficiente para crear un clasificado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ ¿Borrar el destacado &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ ¿Eliminar el vestuario seleccionado?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ ¿Ir a la web de eventos de [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/?lang=es-ES
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Por favor, selecciona qué propuesta quieres ver.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Por favor, selecciona un ítem del historial para verlo.
+ </notification>
+ <notification name="CacheWillClear">
+ La caché se limpiará cuando reinices [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ La caché se moverá cuando reinicies [APP_NAME].
+Nota: esto vaciará la caché.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ La configuración del puerto tendrá efecto cuando reinicies [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ Verás la nueva apariencia cuando reinicies [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ El cambio de idioma tendrá efecto cuando reinicies [APP_NAME].
+ </notification>
+ <notification name="GoToAuctionPage">
+ ¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta
+o hacer una puja?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SaveChanges">
+ ¿Guardar los cambios?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Fallo al guardar el gesto.
+Este gesto tiene demasiados pasos.
+Intenta quitarle algunos, y vuelve a guardarlo.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Fallo al guardar el gesto. Por favor, vuelve a intentarlo en un minuto.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ No se ha podido guardar el gesto porque no se pudo encontrar el objeto o el objeto asociado.
+El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ Al guardar un gesto, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ No se ha podido guardar la nota porque no se pudo encontrar el objeto o el objeto asociado del inventario.
+El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ Al guardar una nota, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarla más tarde.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ No se han podido deshacer todos los cambios en tu versión del script.
+¿Quieres cargar la última versión guardada en el servidor?
+(**Cuidado** No podrás deshacer esta operación).
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ Al guardar un script, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ No se ha podido guardar el script porque no se pudo encontrar el objeto que incluye.
+El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde..
+ </notification>
+ <notification name="StartRegionEmpty">
+ Perdón, no está definida tu Posición inicial.
+Por favor, escribe el nombre de la región en el cajetín de Posición inicial, o elige para esa posición Mi Base o Mi última posición.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye.
+El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
+ </notification>
+ <notification name="CannotDownloadFile">
+ No se ha podido descargar el archivo.
+ </notification>
+ <notification name="CannotWriteFile">
+ No se ha podido escribir el archivo [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ Debes saber que tu ordenador no cumple los requisitos mínimos para la utilización de [APP_NAME]. Puede que experimentes un rendimiento muy bajo. Desafortunadamente, [SUPPORT_SITE] no puede dar asistencia técnica a sistemas con una configuración no admitida.
+
+¿Ir a [_URL] para más información?
+ <url name="url" option="0">
+ http://secondlife.com/support/sysreqs.php?lang=es
+ </url>
+ <usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce.
+Suele suceder con hardware nuevo que todavía no ha sido probado con [APP_NAME]. Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas.
+(Yo &gt; Preferencias &gt; Gráficos).
+ <form name="form">
+ <ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ [APP_NAME] se cae al iniciar los &apos;driver&apos; gráficos.
+La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas.
+Te recomendamos actualizar los &apos;drivers&apos; de tu tarjeta gráfica.
+La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ En la región [REGION] no se permite modificar el terreno.
+ </notification>
+ <notification name="CannotCopyWarning">
+ No tienes permiso para copiar los elementos siguientes:
+[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ No se ha podido dar el ítem del inventario.
+ </notification>
+ <notification name="TransactionCancelled">
+ Transacción cancelada.
+ </notification>
+ <notification name="TooManyItems">
+ No puedes dar más de 42 ítems en una única transferencia del inventario.
+ </notification>
+ <notification name="NoItems">
+ No tienes permiso para transferir el ítem seleccionado.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ No tienes permiso para copiar [COUNT] de los
+ítems seleccionados. Si los das, los perderás de tu inventario.
+¿Realmente quieres darlos?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ No tienes permiso para transferir
+la carpeta seleccionada.
+ </notification>
+ <notification name="FreezeAvatar">
+ ¿Congelar a este avatar?
+Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ ¿Congelar a [AVATAR_NAME]?
+Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ ¿Expulsar a [AVATAR_NAME] de tu terreno?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Expulsar y Prohibir el acceso" yestext="Expulsar"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ ¿Expulsar a este avatar de tu terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ ¿Expulsar a [AVATAR_NAME] de tu terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME]
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ ERROR &apos;ACQUIRE&apos;: Hay demasiados objetos seleccionados.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ERROR &apos;ACQUIRE&apos;: Los objetos están en más de una región.
+Por favor, mueve todos los objetos a adquirir a la
+misma región.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+¿Ir a [_URL] para informarte sobre la compra de L$?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=es-ES
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ No se pudo enlazar estos [COUNT] objetos.
+Puedes enlazar [MAX] objetos como máximo.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ Sólo puedes enlazar objetos completos (no sus partes), y debes
+seleccionar más de uno.
+ </notification>
+ <notification name="CannotLinkModify">
+ Imposible enlazarlos, porque no tienes permiso para modificar
+todos los objetos.
+
+Por favor, asegúrate de que no hay ninguno bloqueado, y de que eres el propietario de todos.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Imposible enlazarlos, porque hay objetos de distintos propietarios.
+
+Por favor, asegúrate de que eres el propietario de todos los objetos seleccionados.
+ </notification>
+ <notification name="NoFileExtension">
+ No hay extensión de archivo en: &apos;[FILE]&apos;
+
+Por favor, asegúrate de que la extensión del archivo es correcta.
+ </notification>
+ <notification name="InvalidFileExtension">
+ Extensión inválida de archivo: [EXTENSION]
+Podría ser [VALIDS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ No se pudo abrir el archivo de sonido que has subido para leer:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ No parece que el archivo sea un archivo RIFF WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ No parece que el archivo sea un archivo de audio PCM WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ El archivo no tiene un número de canales válido (debe ser mono o estéreo):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ No parece que el archivo tenga una frecuencia de muestreo (sample rate) adecuada (debe de ser 44.1k):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ No parece que el archivo tenga un tamaño de palabra (word size) adecuado (debe de ser de 8 o 16 bites):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ No se encontró el fragmento &apos;data&apos; en la cabecera del WAV:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Tamaño de lote erróneo en el archivo WAV:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ El archivo de audio es demasiado largo (10 segundos como máximo):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ Problemas con el archivo [FILE]:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ No se ha podido abrir para su escritura el archivo comprimido de sonido: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Códec Vorbis desconocido, fallo en : [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ No se puede codificar el archivo: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ No se pueden rellenar el nombre de usuario y la contraseña. Esto puede deberse a un cambio de configuración de la red.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Archivo con los recursos corruptos: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Versión de archivo desconocida para el recurso Linden en el archivo: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ No se ha podido crear el archivo de salida: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ Actualmente, [APP_NAME] no admite la subida masiva de animaciones.
+ </notification>
+ <notification name="CannotUploadReason">
+ No se ha podido subir [FILE] por la siguiente razón: [REASON]
+Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="LandmarkCreated">
+ Se ha añadido &quot;[LANDMARK_NAME]&quot; a tu carpeta [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Ya tienes un hito de esta localización.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ No puedes crear un hito aquí porque el propietario del terreno no lo permite.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ No se pudo &apos;recompilar&apos;.
+Selecciona un objeto con script.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ No se pudo &apos;recompilar&apos;.
+
+Selecciona objetos con scripts en los que tengas permiso para modificarlos.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ No se pudo &apos;reiniciar&apos;.
+
+Selecciona objetos con scripts.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ No se pudo &apos;reiniciar&apos;.
+
+Selecciona objetos con scripts en los que tengas permiso para modificarlos.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Imposible abrir el script del objeto sin modificar los permisos.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ No se puede configurar ningún script como &apos;ejecutándose&apos;.
+
+Selecciona objetos con scripts.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ No se puede configurar ningún script como &apos;no ejecutándose&apos;.
+
+Selecciona objetos con scripts.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ No hay nada que guardar.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Se ha modificado tu búsqueda,
+eliminando las palabras demasiado cortas.
+
+Buscando: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Los términos de tu búsqueda son muy cortos,
+por lo que no se ha hecho la búsqueda.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Fallo en el teleporte.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.
+ </notification>
+ <notification name="nolandmark_tport">
+ Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
+ </notification>
+ <notification name="timeout_tport">
+ Lo sentimos, pero el sistema no ha podido completar el teleporte.
+Vuelve a intentarlo en un momento.
+ </notification>
+ <notification name="noaccess_tport">
+ Lo sentimos, pero no tienes acceso al destino de este teleporte.
+ </notification>
+ <notification name="missing_attach_tport">
+ Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.
+ </notification>
+ <notification name="expired_tport">
+ Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="expired_region_handoff">
+ Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="no_host">
+ Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="no_inventory_host">
+ En estos momentos no está disponible el sistema del inventario.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ No se ha podido configurar el propietario del terreno:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, selecciona un área más pequeña y vuelve a intentarlo.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado.
+¿Forzar la propiedad?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ No se ha podido &apos;contentify&apos;:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ No se ha podido &apos;contentify&apos;:
+no se ha seleccionado una región.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ No se ha podido abandonar el terreno:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ No se ha podido abandonar el terreno:
+no se ha podido encontrar la región.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Imposible comprar terreno:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Imposible comprar terreno:
+no se ha podido encontrar en qué región está.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ No se ha podido transferir el terreno:
+no se ha seleccionado una parcela.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ No se ha podido transferir el terreno:
+no has seleccionado un grupo.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ No se ha podido transferir el terreno:
+Ha sido imposible encontrar en qué región está.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ No se ha podido transferir el terreno:
+has seleccionado varias parcelas.
+
+Inténtalo seleccionando sólo una.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ No se ha podido transferir el terreno:
+esperando que el servidor informe acerca de la propiedad.
+
+Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ No se ha podido transferir el terreno:
+En la región [REGION] no se permite transferir terrenos.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ No se ha podido abandonar el terreno:
+esperando que el servidor actualice la información de la parcela.
+
+Vuelve a intentarlo en unos segundos.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ No se ha podido abandonar el terreno:
+no eres propietario de todas las parcelas seleccionadas.
+
+Por favor, selecciona una sola parcela.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ No se ha podido abandonar el terreno:
+no tienes permisos sobre esta parcela.
+Las parcelas de tu propiedad se muestran en verde.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ No se ha podido abandonar el terreno:
+Ha sido imposible encontrar en qué región está.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ No se ha podido abandonar el terreno:
+En la región [REGION] no se permite transferir terrenos.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ No se ha podido abandonar el terreno:
+debes seleccionar toda la parcela.
+
+Selecciona una parcela completa, o divídela primero.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ Vas a abandonar [AREA] m² de terreno.
+Al hacerlo, la quitarás de entre tus posesiones de terreno, pero no recibirás ningún L$.
+
+¿Abandonar este terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ No se ha podido dividir el terreno:
+
+No has seleccionado ninguna parcela.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ No se ha podido dividir el terreno:
+
+Has seleccionado una parcela entera.
+Inténtalo seleccionando una parte.
+ </notification>
+ <notification name="LandDivideWarning">
+ Dividir este terreno lo separará en dos parcelas, cada una de las cuales tendrá su propia configuración. Tras esta operación, algunas configuraciones volverán a las existentes por defecto.
+
+¿Dividir el terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ No se ha podido dividir el terreno:
+Ha sido imposible encontrar en qué región está.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ No se ha podido unir el terreno:
+Ha sido imposible encontrar en qué región está.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ No se ha podido unir el terreno:
+No hay parcelas seleccionadas.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ No se ha podido unir el terreno:
+Sólo has seleccionado una parcela.
+
+Selecciona terreno que incluya algo de ambas parcelas.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ No se ha podido unir el terreno:
+Debes seleccionar más de una parcela.
+
+Selecciona terreno que incluya algo de ambas parcelas.
+ </notification>
+ <notification name="JoinLandWarning">
+ Al unir este terreno crearás una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado.
+Deberás reconfigurar el nombre y las opciones de la nueva parcela.
+
+¿Unir el terreno?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ Esta nota debe guardarse antes de que puedas copiarla o verla. ¿Guardar la nota?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ ¿Copiar este ítem a tu inventario?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Copiar"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Fallo al cambiar la resolución a [RESX] por [RESY]
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Error, hierbas no definidas: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Error, árboles no definidos: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ No se ha podido guardar el archivo &apos;[NAME]&apos;. Tendrás que liberar algo de espacio en tu ordenador y guardarlo de nuevo.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ No se ha podido guardar [NAME] en la base central de almacenamiento.
+Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el ítem de aquí a unos minutos.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Vaya, se ha cerrado tu sesión en [SECOND_LIFE].
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ No se ha podido comprar terreno para el grupo:
+no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente.
+ </notification>
+ <notification label="Añadir como amigo" name="AddFriendWithMessage">
+ Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado.
+
+¿Ofrecer a [NAME] que sea tu amigo?
+ <form name="form">
+ <input name="message">
+ ¿Quieres formar parte de mis amigos?
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Guardar el vestuario" name="SaveOutfitAs">
+ Guardar como un nuevo vestuario lo que estoy llevando:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuevo)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Guardar artículo" name="SaveWearableAs">
+ Guardar el ítem en mi inventario como:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuevo)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Renombrar el vestuario" name="RenameOutfit">
+ Nombre del nuevo vestuario:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ ¿Quieres eliminar a [NAME] de tu lista de amigos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ ¿Quieres quitar a varios amigos de tu lista de amigos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ ¿Estás seguro de que quieres borrar todos los objetos con script que sean propiedad de
+** [AVATAR_NAME] **
+en todos los otros terrenos de este sim?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ ¿Estás seguro de que quieres BORRAR TODOS los objetos con script que sean propiedad de
+** [AVATAR_NAME] **
+en TODO EL TERRENO de este sim?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ ¿Estás seguro de que quieres BORRAR TODOS los objetos (con script o no) que sean propiedad de
+** [AVATAR_NAME] **
+en TODO EL TERRENO de este sim?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ Debes especificar un nombre para tu clasificado.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ El pago para aparecer en la lista debe ser de, al menos, [MIN_PRICE] L$.
+
+Por favor, elige un pago mayor.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Por lo menos uno de los elementos seleccionados contiene vínculos que le señalan. Si eliminas este elemento, los vínculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vínculos.
+
+¿Estás seguro de que quieres eliminar los elementos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ Al menos uno de los ítems que has seleccionado está bloqueado.
+
+¿Estás seguro de que quieres borrar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ Al menos uno de los ítems que has seleccionado no es copiable.
+
+¿Estás seguro de que quieres borrar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ No eres el propietario de, al menos, uno de los ítems que has seleccionado.
+
+¿Estás seguro de que quieres borrar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ Al menos un objeto está bloqueado.
+Al menos un objeto no es copiable.
+
+¿Estás seguro de que quieres borrar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ Al menos un objeto está bloqueado.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ Al menos un objeto no es copiable.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ Al menos un objeto está bloqueado.
+Al menos un objeto no es copiable.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ Al menos un objeto está bloqueado.
+
+¿Estás seguro de que quieres tomar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ No eres el propietario de todos los objetos que estás tomando.
+Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
+
+¿Estás seguro de que quieres tomar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ Al menos un objeto está bloqueado.
+No eres el propietario de todos los objetos que estás tomando.
+Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
+Con todo, puedes tomar lo actualmente seleccionado.
+
+¿Estás seguro de que quieres tomar estos ítems?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ No se ha podido hacer la compra porque el terreno seleccionado se extiende por varias regiones.
+
+Por favor, selecciona un área más pequeña y vuelve a intentarlo.
+ </notification>
+ <notification name="DeedLandToGroup">
+ Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno.
+El precio de compra de la parcela no se reembolsa al propietario.
+Si se vende una parcela transferida, el precio de venta se dividirá a partes iguales entre los miembros del grupo.
+
+¿Transferir estos [AREA] m² de terreno al grupo
+&apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ Al transferir esta parcela, el grupo deberá poseer y mantener el número suficiente de créditos de uso de terreno.
+El traspaso incluirá una contribución simultánea de terreno al grupo de &quot;[NAME]&quot;.
+El precio de compra del terreno no se le devolverá al propietario. Si se vende una parcela transferida, el precio de venta se dividirá en partes iguales entre los miembros del grupo.
+
+¿Transferir este terreno de [AREA] m² al grupo &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos.
+ </notification>
+ <notification name="DisplaySetToRecommended">
+ Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ La localización que querías no está disponible en estos momentos.
+Se te ha llevado a una región cercana.
+ </notification>
+ <notification name="AvatarMovedLast">
+ En estos momentos no está disponible tu última posición.
+Se te ha llevado a una región cercana.
+ </notification>
+ <notification name="AvatarMovedHome">
+ En estos momentos no está disponible tu Base.
+Se te ha llevado a una región cercana.
+Quizá quieras configurar una nueva posición para tu Base.
+ </notification>
+ <notification name="ClothingLoading">
+ Aún está descargándose tu ropa.
+Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente.
+ <form name="form">
+ <ignore name="ignore" text="La ropa está tardando mucho en descargarse"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ Se ha completado la instalación de [SECOND_LIFE].
+
+Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
+¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva?
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID].
+
+Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base.
+ <url name="url">
+ http://es.secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Help" text="Ayuda"/>
+ <button name="Teleport" text="Teleportar"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Tu personaje aparecerá en un momento.
+
+Para caminar, usa las teclas del cursor.
+En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE].
+Por favor, elige el avatar masculino o femenino.
+Puedes cambiar más adelante tu elección.
+ <usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ No se puede hacer el teleporte a [SLURL] porque se encuentra en una cuadrícula ([GRID]) diferente de la actual ([CURRENT_GRID]). Cierra el visor y vuelve a intentarlo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ No se puede establecer la conexión con el servidor.
+[REASON]
+
+Nombre del asunto: [SUBJECT_NAME_STRING]
+Nombre del emisor: [ISSUER_NAME_STRING]
+Válido desde: [VALID_FROM]
+Válido hasta: [VALID_TO]
+Huella digital MD5: [SHA1_DIGEST]
+Huella digital SHA1: [MD5_DIGEST]
+Uso de la clave: [KEYUSAGE]
+Uso de clave extendida: [EXTENDEDKEYUSAGE]
+Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ La autoridad de certificación de este servidor se desconoce.
+
+Información del certificado:
+Nombre del asunto: [SUBJECT_NAME_STRING]
+Nombre del emisor: [ISSUER_NAME_STRING]
+Válido desde: [VALID_FROM]
+Válido hasta: [VALID_TO]
+Huella digital MD5: [SHA1_DIGEST]
+Huella digital SHA1: [MD5_DIGEST]
+Uso de la clave: [KEYUSAGE]
+Uso de clave extendida: [EXTENDEDKEYUSAGE]
+Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
+
+¿Deseas confiar en esta autoridad?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiar"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] cuesta [PRICE] L$. No tienes suficientes L$ para hacer eso.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] te ha dado permiso para modificar sus objetos.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Ha sido revocado tu privilegio de modificar los objetos de [NAME]
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ Esto limpiará las cachés del mapa en esta región.
+Esto sólo es realmente útil para cuestiones de depuración (&apos;debugging&apos;).
+(A efectos prácticos, espera 5 minutos, y el mapa de cualquiera se actualizará después de que reinicies sesión).
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ No se puede comprar más de un objeto a la vez. Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ No se puede copiar a la vez los contenidos de más de un objeto.
+Por favor, selecciona sólo uno y vuelve a intentarlo.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ ¿Teleportar a tu base a todos los residentes en esta región?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ ¿Estás seguro de que quieres devolver los objetos propiedad de
+[USER_NAME] ?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ No se han podido configurar las texturas de la región:
+La textura del terreno [TEXTURE_NUM] tiene una profundidad de bites inválida: [TEXTURE_BIT_DEPTH].
+
+Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
+ </notification>
+ <notification name="InvalidTerrainSize">
+ No se han podido configurar las texturas de la región:
+La textura del terreno [TEXTURE_NUM] es demasiado grande: [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
+ </notification>
+ <notification name="RawUploadStarted">
+ Ha empezado la subida. Dependiendo de la velocidad de tu conexión, llevará unos dos minutos.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ ¿Realmente quieres predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta &apos;Revertir&apos;?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ Sólo puedes tener [MAX_AGENTS] residentes autorizados.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ Sólo puedes tener [MAX_BANNED] residentes no admitidos.
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ Fallo al intentar añadir [NUM_ADDED] agentes:
+Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ Sólo puedes tener [MAX_GROUPS] grupos permitidos.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Predeterminar"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ Sólo puedes tener [MAX_MANAGER] administradores del estado.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ No se puede añadir a la lista de residentes no admitidos al propietario del estado.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ El nombre de tu anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación.
+ </notification>
+ <notification name="CantSetBuyObject">
+ No puede configurar el Comprar el objeto, porque éste no está en venta.
+Por favor, pon en venta el objeto y vuelve a intentarlo.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Acabada la descarga del archivo raw de terreno en:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadWindows">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+
+¿Descargarla a tu carpeta de Programas?
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadMac">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+
+¿Descargarla a tu carpeta de Programas?
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+
+¿Descargarla a tu carpeta de Programas?
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ Se ha producido un error al instalar la actualización del visor.
+Descarga e instala el último visor a través de
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ No hemos podido instalar una actualización necesaria.
+No podrás iniciar sesión hasta que [APP_NAME] se haya actualizado.
+
+Descarga e instala el último visor a través de
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Salir"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Hay una actualización necesaria para la instalación de Second Life.
+
+Puedes descargar esta actualización de http://www.secondlife.com/downloads
+o instalarla ahora.
+ <usetemplate name="okcancelbuttons" notext="Salir de Second Life" yestext="Descargar e instalar ahora"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Hemos descargado una actualización para la instalación de [APP_NAME].
+Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
+ <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [NOMBRE_APL]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Hemos descargado una actualización para la instalación de [APP_NAME].
+Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
+ <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Hemos descargado una actualización de software necesaria.
+Versión [VERSION]
+
+Debemos reiniciar [APP_NAME] para instalar la actualización.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Debemos reiniciar [APP_NAME] para instalar la actualización.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Transferir este objeto al grupo hará que:
+* Reciba los L$ pagados en el objeto
+ <usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ ¿Quieres abrir tu navegador para ver este contenido?
+ <usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ ¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta?
+ <usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Visita el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad.
+ <usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ Visita el wiki QA de [SECOND_LIFE].
+ <usetemplate ignoretext="Abrir mi navegador para el ver el wiki de &apos;QA&apos; (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ Visita el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrás informar de errores y otros asuntos.
+ <usetemplate ignoretext="Abrir mi navegador para usar el &apos;Public Issue Tracker&apos;" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ Para ver las últimas noticias e informaciones, ¿ir la Blog oficial?
+ <usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ ¿Quieres abrir la Guía de Script para tener ayuda sobre el tema?
+ <usetemplate ignoretext="Abrir mi navegador para ver la Guía de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ ¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts?
+ <usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ ¿Estás seguro de que quieres devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores.
+
+*ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos!
+ <usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ Actualmente, eres miembro del grupo [GROUP].
+¿Dejar el grupo?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmKick">
+ ¿Quieres realmente expulsar a todos los residentes de la cuadrícula?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/>
+ </notification>
+ <notification name="MuteLinden">
+ Lo sentimos, pero no puedes ignorar a un Linden.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ No puedes empezar una subasta en una parcela que ya está en venta. Desactiva la venta de terreno si estás seguro de querer iniciar una subasta.
+ </notification>
+ <notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed">
+ Ya has ignorado este nombre.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Aunque esté permitido, borrar contenidos puede dañar el objeto.
+¿Quieres borrar ese ítem?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ En este momento, no se puede ofrecer una tarjeta de visita. Por favor, vuelve a intentarlo en un momento.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BusyModeSet">
+ Pasar al modo ocupado.
+Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera.
+ <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta.
+[NAME] te ha invitado a ser miembro de un grupo.
+ <usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="KickUser">
+ ¿Con qué mensaje quieres expulsar a este Residente?
+ <form name="form">
+ <input name="message">
+ Un administrador te ha desconectado.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ ¿Con qué mensaje se expulsará a cualquiera que esté actualmente en el grid?
+ <form name="form">
+ <input name="message">
+ Un administrador te ha desconectado.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ ¿Con qué mensaje quieres congelar a este residente?
+ <form name="form">
+ <input name="message">
+ Has sido congelado. No puedes moverte o escribir en el chat. Un administrador se pondrá en contacto contigo a través de un mensaje instantáneo (MI).
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ ¿Con qué mensaje quieres congelar a este residente?
+ <form name="form">
+ <input name="message">
+ Ya no estás congelado.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ ¡Hola, [DISPLAY_NAME]!
+
+Al igual que en la vida real, normalmente se tarda algún tiempo en aprender nombres nuevos. Te recomendamos que esperes varios días antes de [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] en objetos, scripts, búsquedas, etc.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Lo sentimos. No puedes cambiar tu nombre mostrado. Si crees que se trata de un error, ponte en contacto con soporte.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Lo sentimos. El nombre es demasiado largo. Los nombres mostrados pueden tener un máximo de [LENGTH] caracteres.
+
+Prueba con un nombre más corto.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Lo sentimos. No hemos podido configurar tu nombre mostrado. Vuelve a intentarlo más tarde.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ Los nombres mostrados introducidos no coinciden. Vuelve a introducirlos.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Lo sentimos. Tendrás que esperar para poder cambiar tu nombre mostrado.
+
+Consulta http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Vuelve a intentarlo más tarde.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Lo sentimos. No he mos podido configurar el nombre que has solicitado porque contiene una palabra prohibida.
+
+ Prueba con un nombre distinto.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ El nombre mostrado que deseas configurar contiene caracteres no válidos.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Tu nombre mostrado debe contener letras y no debe incluir signos de puntuación.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ A [OLD_NAME] ([SLID]) se le conoce ahora como [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ ¿Ofrecer teleporte a tu posición con este mensaje?
+ <form name="form">
+ <input name="message">
+ Ven conmigo a [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ ¿Obligar a este Residente a ir a tu localización?
+ <form name="form">
+ <input name="message">
+ Ven conmigo a [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ ¿Seguro que quieres teleportarte a &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToPick">
+ ¿Teleportarte a [PICK]?
+ <usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ ¿Teleportarte a [CLASSIFIED]?
+ <usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ ¿Teleportarse a [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Confirmar que quiero teleportarme a una localización del historial" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification label="Mensaje a todo el estado" name="MessageEstate">
+ Escribe un anuncio breve que se enviará a todo el que esté en tu estado.
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Cambiar un estado Linden" name="ChangeLindenEstate">
+ Estás a punto de cambiar un estado propiedad de Linden (continente, teen grid, orientación, etc.).
+
+Esto es EXTREMADAMENTE PELIGROSO porque puede afectar en gran manera la experiencia de los Residentes. En el Continente, cambiará miles de regiones y y se provocará un colapso en el espacio del servidor.
+
+¿Continuar?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess">
+ Vas a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
+
+Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$.
+Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateAllowedAgentAdd">
+ ¿Añadir a la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateAllowedAgentRemove">
+ ¿Quitar de la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateAllowedGroupAdd">
+ ¿Añadir a la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateAllowedGroupRemove">
+ ¿Quitar de la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateBannedAgentAdd">
+ ¿Denegar el acceso sólo a este estado o a [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateBannedAgentRemove">
+ ¿Quitar de la lista de prohibición de acceso a este residente para que acceda sólo a este estado o a [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateManagerAdd">
+ ¿Añadir al administrador del estado sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Seleccionar el estado" name="EstateManagerRemove">
+ ¿Remover al administrador del estado sólo para este estado o para [ALL_ESTATES]?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+ </notification>
+ <notification label="Confirmar la expulsión" name="EstateKickUser">
+ ¿Echar a [EVIL_USER] de este estado?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ ¿Estás seguro de que quieres cambiar el contrato del estado?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ No estás autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ No estás autorizado en esa región por su nivel de calificación.
+
+¿Quieres ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+ </url>
+ <usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ No estás autorizado en esa región por su nivel de calificación.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ No estás autorizado en esta región por tus preferencias sobre el nivel de calificación.
+
+Para entrar en la región que deseas, cambia tu preferencia de nivel de calificación. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Para deshacer los cambios, elige Yo &gt; Preferencias &gt; General.
+ <form name="form">
+ <button name="OK" text="Cambiar las preferencias"/>
+ <button default="true" name="Cancel" text="Cerrar"/>
+ <ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Tu preferencia de nivel de calificación actual es [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ No puedes reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ No puedes reclamar este terreno por su nivel de calificación.
+
+¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+ </url>
+ <usetemplate ignoretext="No puedo reclamar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ No puedes reclamar este terreno debido a su nivel de calificación.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación.
+
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+ <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ No puedes comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ No puedes comprar este terreno por tus preferencias de nivel de calificación.
+
+¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+ </url>
+ <usetemplate ignoretext="No puedo comprar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ No puedes comprar este terreno por su nivel de calificación.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ No puedes comprar este terreno por tus preferencias sobre el nivel de calificación.
+
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+ <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Hay demasiados prims seleccionados. Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Hay problemas al importar el contrato del estado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Hay problemas al añadir un administrador nuevo del estado. Uno o más estados deben de tener llena la lista de administradores.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Hay problemas al añadir a la lista del estado. Uno o más estados deben de tener llena la lista.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ En este momento, no se pueden cargar los datos de la&apos;s nota&apos;s.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ Permisos insuficientes para ver la nota asociada a la ID solicitada.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Se ha perdido en la base de datos la ID de la nota.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PublishClassified">
+ Recuerda: las cuotas que se pagan por los clasificados no son reembolsables.
+
+¿Publicar ahora este anuncio por [AMOUNT] L$?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ ¿Este anuncio tiene contenido moderado?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="SetGroupMature">
+ ¿Este grupo tiene contenido moderado?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification label="Confirmar el reinicio" name="ConfirmRestart">
+ ¿Verdaderamente quieres reiniciar la región de aquí a 2 minutos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification label="Mensaje a toda la región" name="MessageRegion">
+ Escribe un anuncio breve que se enviará a todo el que esté en esta región.
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Cambiada la calificación de la región" name="RegionMaturityChange">
+ Se ha actualizado el nivel de calificación de esta región.
+Puede que lleve algún tiempo hasta que el cambio se vea reflejado en el mapa.
+
+Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta, bien verificando la edad o bien verificando una forma de pago.
+ </notification>
+ <notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch">
+ Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME].
+ </notification>
+ <notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner">
+ No se pueden comprar a la vez objetos de propietarios diferentes.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+ </notification>
+ <notification label="No se pudo comprar el contenido" name="BuyContentsOneOnly">
+ No se puede comprar a la vez los contenidos de más de un objeto.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+ </notification>
+ <notification label="No se pudo comprar el contenido" name="BuyContentsOneOwner">
+ No se pueden comprar a la vez objetos de propietarios diferentes.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+ </notification>
+ <notification name="BuyOriginal">
+ ¿Comprar el objeto original de [OWNER] por [PRICE] L$?
+Pasarás a ser el propietario de este objeto.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ ¿Comprar el objeto original por [PRICE] L$?
+Pasarás a ser el propietario de este objeto.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopy">
+ ¿Comprar una copia de [OWNER] por [PRICE] L$?
+El objeto se copiará a tu inventario.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ ¿Comprar una copia por [PRICE] L$?
+El objeto se copiará a tu inventario.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyContents">
+ ¿Comprar los contenidos de [OWNER] por [PRICE] L$?
+Serán copiados a tu inventario.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ ¿Comprar los contenidos por [PRICE] L$?
+Serán copiados a tu inventario.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ Esta transacción consiste en:
+[ACTION]
+
+¿Estás seguro de querer hacer esta compra?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ Esta transacción consiste en:
+[ACTION]
+
+¿Estás seguro de querer hacer esta compra?
+Por favor, vuelva a escribir tu contraseña y pulsa OK.
+ <form name="form">
+ <input name="message"/>
+ <button name="ConfirmPurchase" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Nota:
+Has actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se quitarán de tu inventario, no se copiarán.
+
+¿Mover el/los ítem/s del inventario?
+ <usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se moverán a tu inventario, no se copiarán.
+Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar un mal funcionamiento del script.
+
+¿Mover el/los ítem/s del inventario?
+ <usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Advertencia: la acción &apos;Pagar al objeto&apos; ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
+ <form name="form">
+ <ignore name="ignore" text="He establecido la acción &apos;Pagar al objeto&apos; cuando construyo uno sin un script money()"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ En este objeto, no hay ítems que estés autorizado a copiar.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta?
+ <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ ¿Estás seguro de que quieres salir?
+ <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones del Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad].
+
+Se investigan y resuelven todas las infracciones denunciadas.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Por favor, elige una categoría para esta denuncia de infracción.
+Seleccionar una categoría nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Por favor, escribe el nombre del infractor.
+Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Por favor, escribe la localización donde tuvo lugar la infracción.
+Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Por favor, escribe un resumen de la infracción que ha habido.
+Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Por favor, escribe una descripción minuciosa de la infracción que ha habido.
+Sé tan específico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias.
+Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Estimado Residente:
+
+Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta.
+
+(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (&apos;Abuse Team&apos;) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
+
+(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php &apos;DMCA Policy&apos;].
+
+Si todavía quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia. En concreto, debes seleccionar la categoría &apos;CopyBot o Programa para saltarse los permisos&apos;.
+
+Gracias,
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ Han desaparecido de [FLOATER] estos componentes:
+[COMPONENTS]
+ </notification>
+ <notification label="Reemplazar el anexado actual" name="ReplaceAttachment">
+ En ese punto de tu cuerpo ya hay un objeto anexado. ¿Quieres reemplazarlo por el objeto que has elegido?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el ítem seleccionado"/>
+ <button ignore="Reemplazar automaticamente" name="Yes" text="OK"/>
+ <button ignore="Nunca reemplazar" name="No" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="¡Aviso! Modo Ocupado" name="BusyModePay">
+ Estás en el modo Ocupado. Por tanto, no recibirás ningún ítem a cambio de este pago.
+
+¿Quieres salir del modo Ocupado antes de completar esta transacción?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/>
+ <button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/>
+ <button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ La carpeta &apos;[FOLDERNAME]&apos; pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla?
+ <usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ ¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera?
+ <usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ ¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ ¿Estás seguro de que quieres limpiar tus cookies?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ ¿Estás seguro de que quieres vaciar tu lista de URL guardadas?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ ¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos?
+ <usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="CopySLURL">
+ Se ha copiado a tu portapapeles esta SLurl:
+ [SLURL]
+
+Publícala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador.
+ <form name="form">
+ <ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ ¿Quieres sobrescribir la preselección guardada?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="WLDeletePresetAlert">
+ ¿Quieres borrar [SKY]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ No puedes editar ni borrar una preselección por defecto.
+ </notification>
+ <notification name="WLMissingSky">
+ Este archivo del ciclo de un día se refiere a un archivo perdido de cielo: [SKY].
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="NewSkyPreset">
+ Dame un nombre para el cielo nuevo.
+ <form name="form">
+ <input name="message">
+ Preselección nueva
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="ExistsSkyPresetAlert">
+ ¡Esa preselección ya existe!
+ </notification>
+ <notification name="NewWaterPreset">
+ Dame un nombre para la nueva preselección de agua.
+ <form name="form">
+ <input name="message">
+ Preselección nueva
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="ExistsWaterPresetAlert">
+ ¡Esa preselección ya existe!
+ </notification>
+ <notification name="WaterNoEditDefault">
+ No puedes editar o borrar una preselección por defecto.
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ No se puede empezar una nueva sesión de chat con [RECIPIENT].
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ Debe cerrarse tu sesión de chat con [NAME].
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ No puedes comprar un objeto mientras esté anexado.
+ </notification>
+ <notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails">
+ Al admitir esta petición, le das permiso a un script para que coja dólares Linden (L$) de tu cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ ¿Quieres ponerte automáticamente la ropa que vas a crear?
+ <usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ Debes haber verificado tu edad para visitar este sitio. ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/verification.php?lang=es
+ </url>
+ <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Para visitar este sitio debes haber aportado información de pago en tu cuenta. ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/index.php?lang=es
+ </url>
+ <usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="MissingString">
+ La cadena [STRING_NAME] Ha desaparecido de strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Cancelado
+ </notification>
+ <notification name="CancelledSit">
+ Cancelado el sentarte
+ </notification>
+ <notification name="CancelledAttach">
+ Cancelado el anexar
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Reemplazadas las ropas o partes del cuerpo perdidas con sus equivalentes por defecto.
+ </notification>
+ <notification name="GroupNotice">
+ Asunto: [SUBJECT], Mensaje: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ [NAME] está conectado
+ </notification>
+ <notification name="FriendOffline">
+ [NAME] está desconectado
+ </notification>
+ <notification name="AddSelfFriend">
+ Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Subiendo fotos del mundo y del sitio web...
+(tardará unos 5 minutos).
+ </notification>
+ <notification name="UploadPayment">
+ Has pagado [AMOUNT] LS por la subida.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Completada la subida de la foto del sitio web.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ Completada la subida de la foto del mundo.
+ </notification>
+ <notification name="TerrainDownloaded">
+ Se ha descargado Terrain.raw
+ </notification>
+ <notification name="GestureMissing">
+ No se encuentra en la base de datos el gesto [NAME].
+ </notification>
+ <notification name="UnableToLoadGesture">
+ No se puede cargar el gesto [NAME].
+ </notification>
+ <notification name="LandmarkMissing">
+ El hito ha desaparecido de la base de datos.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ No se ha podido cargar el hito. Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="CapsKeyOn">
+ Tienes pulsada la tecla de mayúsculas.
+Esto puede influir en tu contraseña.
+ </notification>
+ <notification name="NotecardMissing">
+ La nota ha desaparecido de la base de datos.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ No tienes permiso para ver esta nota.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ No tienes permisos suficientes para renderizar el objeto.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ En este momento no se puede cargar la nota.
+ </notification>
+ <notification name="ScriptMissing">
+ El script ha desaparecido de la base de datos.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ No tienes permisos suficientes para ver el script.
+ </notification>
+ <notification name="UnableToLoadScript">
+ No se ha podido cargar el script. Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="IncompleteInventory">
+ Los contenidos que estás ofreciendo aún no están disponibles. Por favor, vuelve a ofrecerlos en un minuto.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ No puedes modificar categorías que están protegidas.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ No puedes quitar categorías que están protegidas.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ No se puede comprar un objeto mientras se descargan los datos.
+Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ No se puede enlazar un objeto mientras se descargan los datos.
+Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ No puedes comprar más de un objeto a la vez.
+Por favor, selecciona un sólo objeto.
+ </notification>
+ <notification name="ObjectNotForSale">
+ Este objeto no está en venta.
+ </notification>
+ <notification name="EnteringGodMode">
+ Entrando en el modo administrativo, nivel [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Saliendo del modo administrativo, nivel [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ No tienes pemiso para copiar esto.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] ha recibido tu oferta de inventario.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] ha rehusado tu oferta del inventario.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Se ha aceptado tu tarjeta de visita.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Se ha rehusado tu tarjeta de visita.
+ </notification>
+ <notification name="TeleportToLandmark">
+ Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
+Pulsa en un hito para seleccionarlo, y, luego, pulsa &apos;Teleportar&apos; en la parte inferior del panel.
+(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir &apos;Teleportar&apos;.)
+ </notification>
+ <notification name="TeleportToPerson">
+ Puedes contactar con un Residente como &apos;[NAME]&apos; abriendo el panel Gente en el lado derecho de tu pantalla.
+Elige al Residente de la lista y pulsa &apos;MI&apos; en la parte inferior del panel.
+(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ No puedes seleccionar un terreno que cruce las fronteras entre servidores.
+Inténtalo seleccionando un trozo más pequeño de terreno.
+ </notification>
+ <notification name="SearchWordBanned">
+ Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
+ </notification>
+ <notification name="NoContentToSearch">
+ Por favor, elige al menos un tipo de contenido a buscar (General, Moderado o Adulto;).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Notificación de un evento:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="Detalles"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ En estos momentos, están realzados todos los objetos de esta parcela que serán transferidos al comprador de la misma.
+
+* No están realzados los árboles y hierbas que se transferirán.
+ <form name="form">
+ <button name="Done" text="Hecho"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Desactivados los gestos que tienen el mismo botón:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ No parece que tu sistema tenga instalado el software QuickTime de Apple.
+Si quieres ver media en streaming en las parcelas que los tienen, deberías ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ No se ha encontrado el &apos;Media Plugin&apos; para manejar el &apos;mime type&apos; &quot;[MIME_TYPE]&quot;. Los media de este tipo no estarán disponibles.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Fallo de este &apos;Media Plugin&apos;:
+ [PLUGIN]
+
+Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas.
+ <form name="form">
+ <ignore name="ignore" text="Fallo al ejecutar un &apos;Media Plugin&apos;"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ Se han devuelto a su inventario los objetos en la parcela de terreno seleccionada propiedad de [NAME].
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de &apos;[NAME]&apos;.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ Se han devuelto a los inventarios de sus propietarios los objetos que estaban compartidos con el grupo [GROUPNAME] en la parcela seleccionada.
+Los objetos transferibles que se transfirieron al grupo se han devuelto a sus propietarios anteriores.
+Los objetos no transferibles que se transfirieron al grupo han sido borrados.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ Se han devuelto a sus propietarios los objetos de los que NO eras propietario en la parcela seleccionada.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Mensaje de [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ Este terreno tiene el daño activado.
+Aquí puedes ser herido. Si mueres, se te teleportará a tu Base.
+ </notification>
+ <notification name="NoFly">
+ Este terreno tiene desactivado el poder volar.
+Aquí no puedes volar.
+ </notification>
+ <notification name="PushRestricted">
+ Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno.
+ </notification>
+ <notification name="NoVoice">
+ Este tereno tiene desactivado el chat de voz. No podrás oír hablar a nadie.
+ </notification>
+ <notification name="NoBuild">
+ Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
+ </notification>
+ <notification name="ScriptsStopped">
+ Un administrador ha detenido temporalmente los scripts en esta región.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ En esta región no se está ejecutando ningún script.
+ </notification>
+ <notification name="NoOutsideScripts">
+ Este terreno tiene desactivados los scripts externos.
+
+Los scripts no funcionan aquí, excepto los pertenecientes al propietario del terreno.
+ </notification>
+ <notification name="ClaimPublicLand">
+ Sólo puedes reclamar terreno público de la región en que estás.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ No estás autorizado en esa región por su nivel de calificación. Debes validar tu edad y/o instalar el último visor.
+
+Por favor, dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ </notification>
+ <notification name="URBannedFromRegion">
+ Se te ha prohibido el acceso a la región.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Tu cuenta no puede conectarse a esta región del grid teen.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ No tienes el estado de pago adecuado para entrar a esta región.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ Debes haber verificado tu edad para entrar a esta parcela.
+ </notification>
+ <notification name="NoDestRegion">
+ No se ha encontrada la región de destino.
+ </notification>
+ <notification name="NotAllowedInDest">
+ No estás autorizado en el destino.
+ </notification>
+ <notification name="RegionParcelBan">
+ No puedes cruzar la región por una parcela con el acceso prohibido. Intenta otro camino.
+ </notification>
+ <notification name="TelehubRedirect">
+ Has sido redirigido a un punto de teleporte.
+ </notification>
+ <notification name="CouldntTPCloser">
+ No se puede teleportar a un destino tan cercano.
+ </notification>
+ <notification name="TPCancelled">
+ Teleporte cancelado.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ En estos momentos, está llena la región a la que estás intentando entrar.
+Por favor, vuelve a intentarlo en unos momentos.
+ </notification>
+ <notification name="GeneralFailure">
+ Fallo general.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Mal dirigido a la región. Por favor, vuelve a intentarlo.
+ </notification>
+ <notification name="NoValidAgentID">
+ ID de agente inválido.
+ </notification>
+ <notification name="NoValidSession">
+ ID de sesión inválido.
+ </notification>
+ <notification name="NoValidCircuit">
+ Circuito de código inválido.
+ </notification>
+ <notification name="NoValidTimestamp">
+ Fecha inválida.
+ </notification>
+ <notification name="NoPendingConnection">
+ No se puede crear la conexión.
+ </notification>
+ <notification name="InternalUsherError">
+ Se ha producido un error interno al intentar acceder al destino de tu teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ No se puede encontrar en esta región un buen destino para el teleporte.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Se ha producido un error interno al manejar las coordenadas globales de tu petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
+ </notification>
+ <notification name="NoValidLanding">
+ No se ha podido encontrar un punto de aterrizaje válido.
+ </notification>
+ <notification name="NoValidParcel">
+ No se ha podido encontrar una parcela válida.
+ </notification>
+ <notification name="ObjectGiveItem">
+ Un objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Keep" text="Guardar"/>
+ <button name="Discard" text="Descartar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] te ha dado este [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Mostrar"/>
+ <button name="Discard" text="Descartar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Entrar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Info" text="Información"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] te ha ofrecido teleportarte a su posición:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="Teleportar"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Teleporte ofrecido a [TO_NAME]
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Más tarde"/>
+ <button name="GoNow..." text="Ir ahora..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] te está ofreciendo su amistad.
+
+[MESSAGE]
+
+(Por defecto, podrás ver si el otro está conectado)
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ Has ofrecido amistad a [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] está ofreciendo amistad.
+
+(De manera predeterminada, podrás ver si están conectados los demás.)
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ [NAME] ha aceptado tu oferta de amistad.
+ </notification>
+ <notification name="FriendshipDeclined">
+ [NAME] ha rehusado tu oferta de amistad.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Aceptado el ofrecimiento de amistad.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Rehusado el ofrecimiento de amistad.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] te está ofreciendo su tarjeta de visita.
+Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ Esta región se reiniciará en [MINUTES] minutos.
+Si permaneces en esta región serás desconectado.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ Esta región se reiniciará en [SECONDS] segundos.
+Si permaneces en esta región serás desconectado.
+ </notification>
+ <notification name="LoadWebPage">
+ ¿Cargar página web [URL]?
+
+[MESSAGE]
+
+Del objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propietario: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Cargar"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ Búsqueda fallida de [TYPE] en la base de datos.
+ </notification>
+ <notification name="FailedToFindWearable">
+ Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos.
+ </notification>
+ <notification name="InvalidWearable">
+ El ítem que quieres vestirte tiene una característica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este ítem.
+ </notification>
+ <notification name="ScriptQuestion">
+ &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, un objeto propiedad de &apos;[NAME]&apos;, quiere:
+
+[QUESTIONS]
+¿Es correcto?
+ <form name="form">
+ <button name="Yes" text="Sí"/>
+ <button name="No" text="No"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ Un objeto de nombre &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, propiedad de &apos;[NAME]&apos;, quiere:
+
+[QUESTIONS]
+Si no confias en este objeto y en su creador, deberías rehusar esta petición.
+
+¿Autorizar esta petición?
+ <form name="form">
+ <button name="Grant" text="Autorizar"/>
+ <button name="Deny" text="Denegar"/>
+ <button name="Details" text="Detalles..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [GROUPNAME]
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ ¡Gracias por tu pago!
+
+Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$.
+
+Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control]
+ </notification>
+ <notification name="FirstOverrideKeys">
+ A partir de ahora, tus teclas de movimiento las gestiona un objeto.
+Prueba las teclas del cursor o AWSD para ver qué hacen.
+Algunos objetos (las pistolas, por ejemplo) te pedirán que, para usarlos, entres en vista subjetiva. Pulsa &apos;M&apos; para hacerlo.
+ </notification>
+ <notification name="FirstSandbox">
+ Esta es una región &apos;sandbox&apos; (zona de pruebas) donde los Residentes pueden aprender a construir.
+
+Los objetos que construyas aquí serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir &apos;Tomar&apos; para que tu creación vaya a tu inventario.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ Puedes seleccionar un máximo de [MAX_SELECT] ítems de esta lista.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] te está invitando a un chat de voz.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] ha dejado automáticamente de estar ignorado al darle dinero.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] ha dejado automáticamente de estar ignorado al ofrecerle inventario.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] ha empezado un chat de voz con el grupo [GROUP].
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] ha empezado un chat de voz en multiconferencia.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ NAME] te está invitando a un chat en multiconferencia.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+ <form name="form">
+ <button name="Accept" text="Aceptar"/>
+ <button name="Decline" text="Rehusar"/>
+ <button name="Mute" text="Ignorar"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ El chat de voz al que estás intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, vuelve a intentarlo más tarde.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intenta usar la voz en otra zona.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ Has sido desconectado de [VOICE_CHANNEL_NAME]. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] ha colgado la llamada. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] ha rehusado tu llamada. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] no está disponible para coger tu llamada. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ Estamos creando un canal de voz para ti. Se puede tardar hasta un minuto.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ Una o más de las transformaciones de voz a las que estás suscrito han caducado.
+[Pulsa aquí [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal.
+[Pulsa aquí [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] días.
+[Pulsa aquí [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Están disponibles nuevas transformaciones de voz.
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Sólo los miembros de un grupo determinado pueden visitar esta zona.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ No puedes entrar en esta parcela, se te ha prohibido el acceso.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ No puedes entrar en esta parcela, no estás en la lista de acceso.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ No tienes permiso para conectarte al chat de voz de [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ No se admite el formato de la SLurl que has pulsado.
+ </notification>
+ <notification name="BlockedSLURL">
+ Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza.
+ </notification>
+ <notification name="ThrottledSLURL">
+ En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza.
+Por tu seguridad, serán bloqueadas durante unos segundos.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Responder"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ ¿Seguro que quieres cerrar todos los MI?
+ <usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Se ha guardado el adjunto.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ No se ha podido encontrar un tema de ayuda para este elemento.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Error del servidor: fallo en la actualización u obtención de los media.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Un moderador ha silenciado tu chat de texto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Un moderador ha silenciado tu voz.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ ¿Estás seguro de que quieres borrar tu historial de teleportes?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ El botón elegido no se puede mostrar correctamente.
+Se mostrará cuando haya suficiente espacio.
+ </notification>
+ <notification name="ShareNotification">
+ Selecciona los residentes con quienes deseas compartir.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ ¿Estás seguro de que quieres compartir los elementos siguientes?
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Con los siguientes residentes:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ItemsShared">
+ Los elementos se han compartido correctamente.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Error de transferencia a grupo.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; tardó [TIME] segundos en dejar de aparecer como nube.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] segundos vivo)
+Has terminado de texturizar tu vestuario en [TIME] segundos.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] segundos vivo)
+Has enviado una actualización de tu apariencia después de [TIME] segundos.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; se convirtió en nube.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] segundos vivo)
+Apareció el avatar &apos;[NAME]&apos;.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; salió al cabo de [TIME] segundos como nube.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; ya está en modo de edición de apariencia.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; desactivó el modo de apariencia.
+ </notification>
+ <notification name="NoConnect">
+ Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
+Comprueba la configuración de la red y del servidor de seguridad.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Tenemos problemas de conexión con tu servidor de voz:
+
+[HOSTID]
+
+No podrás establecer comunicaciones de voz.
+Comprueba la configuración de la red y del servidor de seguridad.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; ya estaba totalmente cargado al salir.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] segundos con vida )
+Has actualizado una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] segundos con vida )
+Has actualizado de manera local una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ ¿Estás seguro de que deseas salir de esta multiconferencia?
+ <usetemplate ignoretext="Confirma antes de salir de la llamada" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Has seleccionado silenciar a todos los participantes en una multiconferencia.
+Si lo haces, todos los residentes que se unan posteriormente a la llamada también serán silenciados, incluso cuando abandones la conferencia.
+
+¿Deseas silenciar a todos?
+ <usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification label="Chat" name="HintChat">
+ Para unirte a la conversación, escribe en el campo de chat que aparece a continuación.
+ </notification>
+ <notification label="Levantarme" name="HintSit">
+ Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme.
+ </notification>
+ <notification label="Hablar" name="HintSpeak">
+ Pulsa en el botón: Hablar para conectar y desconectar el micrófono.
+
+Pulsa en el cursor arriba para ver el panel de control de voz.
+
+Al ocultar el botón Hablar se desactiva la función de voz.
+ </notification>
+ <notification label="Explora el mundo" name="HintDestinationGuide">
+ La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
+ </notification>
+ <notification label="Panel lateral" name="HintSidePanel">
+ Accede de manera rápida a tu inventario, así como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral.
+ </notification>
+ <notification label="Mover" name="HintMove">
+ Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él.
+
+2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista.
+ </notification>
+ <notification label="Nombre mostrado" name="HintDisplayName">
+ Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias.
+ </notification>
+ <notification label="Visión" name="HintView">
+ Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina.
+ </notification>
+ <notification label="Inventario" name="HintInventory">
+ Accede a tu inventario para buscar ítems. Los ítems más recientes se pueden encontrar fácilmente en la pestaña Recientes.
+ </notification>
+ <notification label="¡Tienes dólares Linden!" name="HintLindenDollar">
+ Éste es tu saldo actual de L$. Haz clic en Comprar L$ para comprar más dólares Linden.
+ </notification>
+ <notification name="PopupAttempt">
+ Se ha impedido que se abriera una ventana emergente.
+ <form name="form">
+ <ignore name="ignore" text="Permitir todas las ventanas emergentes"/>
+ <button name="open" text="Abrir ventana emergente"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ El sitio en &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; de la plataforma &apos;[REALM]&apos; requiere un nombre de usuario y una contraseña.
+ <form name="form">
+ <input name="username" text="Nombre de usuario"/>
+ <input name="password" text="Contraseña"/>
+ <button name="ok" text="Enviar"/>
+ <button name="cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ Para cambiar de modo tienes que salir y reiniciar.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <global name="UnsupportedCPU">
+ - La velocidad de tu CPU no cumple los requerimientos mínimos.
+ </global>
+ <global name="UnsupportedGLRequirements">
+ Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tienes, comprueba que tienes los últimos &apos;drivers&apos; para tu tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para tu sistema operativo.
+
+Si los problemas persisten, por favor, acude a [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - Tu tarjeta gráfica no cumple los requerimientos mínimos.
+ </global>
+ <global name="UnsupportedRAM">
+ - La memoria de tu sistema no cumple los requerimientos mínimos.
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Si posees un terreno, puedes hacerlo tu Base.
+También puedes buscar en el Mapa lugares marcados como &quot;Puntos de Información&quot;.
+ </global>
+ <global name="You died and have been teleported to your home location">
+ Has muerto y te has teleportado a tu Base.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/es/panel_group_general.xml b/indra/newview/skins/default/xui/es/panel_group_general.xml
index ef2309dd55..b00c300c85 100644
--- a/indra/newview/skins/default/xui/es/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_general.xml
@@ -1,58 +1,58 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="General" name="general_tab">
- <panel.string name="help_text">
- La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros.
-
-Deja el cursor sobre las opciones para ver más ayuda.
- </panel.string>
- <panel.string name="group_info_unchanged">
- Ha cambiado la información general del grupo
- </panel.string>
- <panel.string name="incomplete_member_data_str">
- Recuperando los datos de los miembros
- </panel.string>
- <panel name="group_info_top">
- <texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/>
- <text name="prepend_founded_by">
- Fundador:
- </text>
- <name_box initial_value="(obteniendo)" name="founder_name"/>
- <text name="join_cost_text">
- Gratis
- </text>
- <button label="¡ENTRA AHORA!" name="btn_join"/>
- </panel>
- <text_editor name="charter">
- Carta del grupo
- </text_editor>
- <name_list name="visible_members">
- <name_list.columns label="Miembro" name="name" relwidth="0.40"/>
- <name_list.columns label="Etiqueta" name="title" relwidth="0.25"/>
- <name_list.columns label="Estado" name="status"/>
- </name_list>
- <text name="my_group_settngs_label">
- Yo
- </text>
- <text name="active_title_label">
- Mi etiqueta:
- </text>
- <combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/>
- <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo. Desmárcalo si este grupo te envía &apos;spam&apos;."/>
- <check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/>
- <panel name="preferences_container">
- <text name="group_settngs_label">
- Grupo
- </text>
- <check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
- <check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
- <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
- <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es moderado." width="150">
- <combo_item name="select_mature">
- - Selecciona el nivel de calificación -
- </combo_item>
- <combo_box.item label="Contenido moderado" name="mature"/>
- <combo_box.item label="Contenido general" name="pg"/>
- </combo_box>
- <check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
- </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="General" name="general_tab">
+ <panel.string name="help_text">
+ La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros.
+
+Deja el cursor sobre las opciones para ver más ayuda.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Ha cambiado la información general del grupo
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Recuperando los datos de los miembros
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="prepend_founded_by">
+ Fundador:
+ </text>
+ <name_box initial_value="(obteniendo)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratis
+ </text>
+ <button label="¡ENTRA AHORA!" name="btn_join"/>
+ </panel>
+ <text_editor name="charter">
+ Carta del grupo
+ </text_editor>
+ <name_list name="visible_members">
+ <name_list.columns label="Miembro" name="name" relwidth="0.40"/>
+ <name_list.columns label="Etiqueta" name="title" relwidth="0.25"/>
+ <name_list.columns label="Estado" name="status"/>
+ </name_list>
+ <text name="my_group_settngs_label">
+ Yo
+ </text>
+ <text name="active_title_label">
+ Mi etiqueta:
+ </text>
+ <combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/>
+ <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo. Desmárcalo si este grupo te envía &apos;spam&apos;."/>
+ <check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ Grupo
+ </text>
+ <check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
+ <check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
+ <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
+ <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es moderado." width="150">
+ <combo_item name="select_mature">
+ - Selecciona el nivel de calificación -
+ </combo_item>
+ <combo_box.item label="Contenido moderado" name="mature"/>
+ <combo_box.item label="Contenido general" name="pg"/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
index c72f562a68..a1a3ec86cf 100644
--- a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Seguridad" name="Media Settings Security">
<check_box initial_value="false" label="Permitir el acceso sólo a los patrones de URL especificados" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Están marcadas las entradas que la página web no admite:
+ Están marcadas las entradas que la página web no
+admite:
</text>
<button label="Añadir" name="whitelist_add"/>
<button label="Borrar" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index d9a65aabc2..e725e4a05a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -1,73 +1,73 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="General" name="general_panel">
- <text name="language_textbox">
- Idioma:
- </text>
- <combo_box name="language_combobox">
- <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
- <combo_box.item label="English (Inglés)" name="English"/>
- <combo_box.item label="Dansk (Danés) - Beta" name="Danish"/>
- <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/>
- <combo_box.item label="Español - Beta" name="Spanish"/>
- <combo_box.item label="Français (Francés) - Beta" name="French"/>
- <combo_box.item label="Italiano - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
- <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
- <combo_box.item label="Português (portugués) - Beta" name="Portugese"/>
- <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
- </combo_box>
- <text name="language_textbox2">
- (requiere reiniciar)
- </text>
- <text name="maturity_desired_prompt">
- Quiero acceder a contenido:
- </text>
- <text name="maturity_desired_textbox"/>
- <combo_box name="maturity_desired_combobox">
- <combo_box.item label="General, Moderado y Adulto" name="Desired_Adult"/>
- <combo_box.item label="General y Moderado" name="Desired_Mature"/>
- <combo_box.item label="General" name="Desired_PG"/>
- </combo_box>
- <text name="start_location_textbox">
- Localización inicial:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/>
- <combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/>
- </combo_box>
- <check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/>
- <text name="name_tags_textbox">
- Etiquetas de los nombres:
- </text>
- <radio_group name="Name_Tag_Preference">
- <radio_item label="Off" name="radio" value="0"/>
- <radio_item label="On" name="radio2" value="1"/>
- <radio_item label="Mostrar brevemente" name="radio3" value="2"/>
- </radio_group>
- <check_box label="Mi nombre" name="show_my_name_checkbox1"/>
- <check_box label="Nombre de usuario" name="show_slids" tool_tip="Mostrar el nombre de usuario, como bobsmith123"/>
- <check_box label="Títulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar títulos de grupos, como Jefe o Miembro"/>
- <check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/>
- <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/>
- <check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/>
- <text name="inworld_typing_rg_label">
- Si pulsas las teclas de letras:
- </text>
- <radio_group name="inworld_typing_preference">
- <radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/>
- <radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/>
- </radio_group>
- <text name="title_afk_text">
- Ausente tras:
- </text>
- <combo_box label="Ausente tras:" name="afk">
- <combo_box.item label="2 minutos" name="item0"/>
- <combo_box.item label="5 minutos" name="item1"/>
- <combo_box.item label="10 minutos" name="item2"/>
- <combo_box.item label="30 minutos" name="item3"/>
- <combo_box.item label="nunca" name="item4"/>
- </combo_box>
- <text name="text_box3">
- Respuesta cuando estoy en modo ocupado:
- </text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="General" name="general_panel">
+ <text name="language_textbox">
+ Idioma:
+ </text>
+ <combo_box name="language_combobox">
+ <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
+ <combo_box.item label="English (Inglés)" name="English"/>
+ <combo_box.item label="Dansk (Danés) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Francés) - Beta" name="French"/>
+ <combo_box.item label="Italiano - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
+ <combo_box.item label="Português (portugués) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (requiere reiniciar)
+ </text>
+ <text name="maturity_desired_prompt">
+ Quiero acceder a contenido:
+ </text>
+ <text name="maturity_desired_textbox"/>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="General, Moderado y Adulto" name="Desired_Adult"/>
+ <combo_box.item label="General y Moderado" name="Desired_Mature"/>
+ <combo_box.item label="General" name="Desired_PG"/>
+ </combo_box>
+ <text name="start_location_textbox">
+ Localización inicial:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/>
+ <combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Etiquetas de los nombres:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Off" name="radio" value="0"/>
+ <radio_item label="On" name="radio2" value="1"/>
+ <radio_item label="Mostrar brevemente" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Mi nombre" name="show_my_name_checkbox1"/>
+ <check_box label="Nombre de usuario" name="show_slids" tool_tip="Mostrar el nombre de usuario, como bobsmith123"/>
+ <check_box label="Títulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar títulos de grupos, como Jefe o Miembro"/>
+ <check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/>
+ <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/>
+ <check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/>
+ <text name="inworld_typing_rg_label">
+ Si pulsas las teclas de letras:
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/>
+ <radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ Ausente tras:
+ </text>
+ <combo_box label="Ausente tras:" name="afk">
+ <combo_box.item label="2 minutos" name="item0"/>
+ <combo_box.item label="5 minutos" name="item1"/>
+ <combo_box.item label="10 minutos" name="item2"/>
+ <combo_box.item label="30 minutos" name="item3"/>
+ <combo_box.item label="nunca" name="item4"/>
+ </combo_box>
+ <text name="text_box3">
+ Respuesta cuando estoy en modo ocupado:
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
index 1ae5d63ace..0ac3d11ab0 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
@@ -86,7 +86,7 @@
<check_box initial_value="true" label="Avatares simulados" name="AvatarImpostors"/>
<check_box initial_value="true" label="Renderizado por hardware" name="AvatarVertexProgram"/>
<check_box initial_value="true" label="Ropas del avatar" name="AvatarCloth"/>
- <text name="TerrainDetailText">
+ <text name="TerrainDetailText" left="402">
Detalle del terreno:
</text>
<radio_group name="TerrainDetailRadio">
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
index adc0862cf1..c162130af6 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
@@ -11,7 +11,7 @@
<check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
<check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
<check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
- <check_box label="Mostrar mis Hitos favoritos al Inicio de sesión (menú desplegable &quot;Empezar en&quot;)" name="favorites_on_login_check"/>
+ <check_box label="Mostrar mis Hitos favoritos al Inicio de sesión (menú desplegable &quot;Empezar &#10;en&quot;)" name="favorites_on_login_check" top_pad="15"/>
<text name="Logs:">
Registros de chat:
</text>
diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
index 84fe9937b9..2beacda235 100644
--- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
@@ -1,83 +1,83 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Contrato" name="Covenant">
- <text name="estate_section_lbl">
- Estado
- </text>
- <text name="estate_name_lbl">
- Nombre:
- </text>
- <text name="estate_name_text">
- mainland
- </text>
- <text name="estate_owner_lbl">
- Propietario:
- </text>
- <text name="estate_owner_text">
- (nadie)
- </text>
- <text name="estate_cov_lbl">
- Contrato:
- </text>
- <text name="covenant_timestamp_text">
- Última modificación el miér. 31 de dic. de 1969, 16:00:00
- </text>
- <button label="?" name="covenant_help"/>
- <text_editor bottom="-263" height="178" name="covenant_editor">
- No se ha aportado un contrato para este estado.
- </text_editor>
- <button label="Cambiar" name="reset_covenant"/>
- <text name="covenant_help_text">
- Los cambios en el contrato se mostrarán en todas las parcelas
-del estado.
- </text>
- <text bottom_delta="-31" name="covenant_instructions">
- Arrastra y suelta una nota para cambiar el contrato de este estado.
- </text>
- <text name="region_section_lbl">
- Región
- </text>
- <text name="region_name_lbl">
- Nombre:
- </text>
- <text name="region_name_text">
- leyla
- </text>
- <text name="region_landtype_lbl">
- Tipo:
- </text>
- <text name="region_landtype_text">
- Mainland / Homestead
- </text>
- <text name="region_maturity_lbl">
- Calificación:
- </text>
- <text name="region_maturity_text">
- Adulto
- </text>
- <text name="resellable_lbl">
- Revender:
- </text>
- <text name="resellable_clause">
- El terreno de esta región no se podrá revender.
- </text>
- <text name="changeable_lbl">
- Dividir:
- </text>
- <text name="changeable_clause">
- El terreno de esta región no se podrá unir/dividir.
- </text>
- <string name="can_resell">
- El terreno comprado en esta región se podrá revender.
- </string>
- <string name="can_not_resell">
- El terreno comprado en esta región no se podrá revender.
- </string>
- <string name="can_change">
- El terreno comprado en esta región se podrá unir o
-subdividir.
- </string>
- <string name="can_not_change">
- El terreno comprado en esta región no se podrá unir ni
-subdividir.
- </string>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Contrato" name="Covenant">
+ <text name="estate_section_lbl">
+ Estado
+ </text>
+ <text name="estate_name_lbl">
+ Nombre:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ Propietario:
+ </text>
+ <text name="estate_owner_text">
+ (nadie)
+ </text>
+ <text name="estate_cov_lbl">
+ Contrato:
+ </text>
+ <text name="covenant_timestamp_text">
+ Última modificación el miér. 31 de dic. de 1969, 16:00:00
+ </text>
+ <button label="?" name="covenant_help"/>
+ <text_editor bottom="-263" height="178" name="covenant_editor">
+ No se ha aportado un contrato para este estado.
+ </text_editor>
+ <button label="Cambiar" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Los cambios en el contrato se mostrarán en todas las parcelas
+del estado.
+ </text>
+ <text bottom_delta="-31" name="covenant_instructions">
+ Arrastra y suelta una nota para cambiar el contrato de este estado.
+ </text>
+ <text name="region_section_lbl">
+ Región
+ </text>
+ <text name="region_name_lbl">
+ Nombre:
+ </text>
+ <text name="region_name_text">
+ leyla
+ </text>
+ <text name="region_landtype_lbl">
+ Tipo:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ Calificación:
+ </text>
+ <text name="region_maturity_text">
+ Adulto
+ </text>
+ <text name="resellable_lbl">
+ Revender:
+ </text>
+ <text name="resellable_clause">
+ El terreno de esta región no se podrá revender.
+ </text>
+ <text name="changeable_lbl">
+ Dividir:
+ </text>
+ <text name="changeable_clause">
+ El terreno de esta región no se podrá unir/dividir.
+ </text>
+ <string name="can_resell">
+ El terreno comprado en esta región se podrá revender.
+ </string>
+ <string name="can_not_resell">
+ El terreno comprado en esta región no se podrá revender.
+ </string>
+ <string name="can_change">
+ El terreno comprado en esta región se podrá unir o
+subdividir.
+ </string>
+ <string name="can_not_change">
+ El terreno comprado en esta región no se podrá unir ni
+subdividir.
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index e5fc33b487..27ca0e3bbb 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1,4346 +1,4346 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
- It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
- that are returned from one component and may appear in many places-->
-<strings>
- <string name="CAPITALIZED_APP_NAME">
- SECOND LIFE
- </string>
- <string name="SUPPORT_SITE">
- Portal de Soporte de Second Life
- </string>
- <string name="StartupDetectingHardware">
- Identificando el hardware...
- </string>
- <string name="StartupLoading">
- Instalando [APP_NAME]...
- </string>
- <string name="StartupClearingCache">
- Limpiando la caché...
- </string>
- <string name="StartupInitializingTextureCache">
- Iniciando la caché de las texturas...
- </string>
- <string name="StartupInitializingVFS">
- Iniciando VFS...
- </string>
- <string name="ProgressRestoring">
- Restaurando...
- </string>
- <string name="ProgressChangingResolution">
- Cambiando la resolución...
- </string>
- <string name="LoginInProgress">
- Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
- </string>
- <string name="LoginInProgressNoFrozen">
- Iniciando la sesión...
- </string>
- <string name="LoginAuthenticating">
- Autenticando
- </string>
- <string name="LoginMaintenance">
- Realizando el mantenimiento de la cuenta...
- </string>
- <string name="LoginAttempt">
- Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Cargando el mundo...
- </string>
- <string name="LoginInitializingBrowser">
- Iniciando el navegador web incorporado...
- </string>
- <string name="LoginInitializingMultimedia">
- Iniciando multimedia...
- </string>
- <string name="LoginInitializingFonts">
- Cargando las fuentes...
- </string>
- <string name="LoginVerifyingCache">
- Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
- </string>
- <string name="LoginProcessingResponse">
- Procesando la respuesta...
- </string>
- <string name="LoginInitializingWorld">
- Iniciando el mundo...
- </string>
- <string name="LoginDecodingImages">
- Decodificando las imágenes...
- </string>
- <string name="LoginInitializingQuicktime">
- Iniciando QuickTime...
- </string>
- <string name="LoginQuicktimeNotFound">
- No se ha encontrado QuickTime. Imposible iniciarlo.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime se ha iniciado adecuadamente.
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Esperando la conexión con la región...
- </string>
- <string name="LoginConnectingToRegion">
- Conectando con la región...
- </string>
- <string name="LoginDownloadingClothing">
- Descargando la ropa...
- </string>
- <string name="InvalidCertificate">
- El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.
- </string>
- <string name="CertInvalidHostname">
- El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.
- </string>
- <string name="CertExpired">
- Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.
- </string>
- <string name="CertKeyUsage">
- El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.
- </string>
- <string name="CertBasicConstraints">
- La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.
- </string>
- <string name="CertInvalidSignature">
- No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
- </string>
- <string name="LoginFailedNoNetwork">
- Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet.
- </string>
- <string name="LoginFailed">
- Error en el inicio de sesión.
- </string>
- <string name="Quit">
- Salir
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?lang=es-ES
- </string>
- <string name="AgentLostConnection">
- Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
- </string>
- <string name="SavingSettings">
- Guardando tus configuraciones...
- </string>
- <string name="LoggingOut">
- Cerrando sesión...
- </string>
- <string name="ShuttingDown">
- Cerrando...
- </string>
- <string name="YouHaveBeenDisconnected">
- Has sido desconectado de la región en la que estabas.
- </string>
- <string name="SentToInvalidRegion">
- Has sido enviado a una región no válida.
- </string>
- <string name="TestingDisconnect">
- Probando la desconexión del visor
- </string>
- <string name="TooltipPerson">
- Persona
- </string>
- <string name="TooltipNoName">
- (sin nombre)
- </string>
- <string name="TooltipOwner">
- Propietario:
- </string>
- <string name="TooltipPublic">
- Público
- </string>
- <string name="TooltipIsGroup">
- (Grupo)
- </string>
- <string name="TooltipForSaleL$">
- En venta: [AMOUNT] L$
- </string>
- <string name="TooltipFlagGroupBuild">
- Construir el grupo
- </string>
- <string name="TooltipFlagNoBuild">
- No construir
- </string>
- <string name="TooltipFlagNoEdit">
- Construir el grupo
- </string>
- <string name="TooltipFlagNotSafe">
- No seguro
- </string>
- <string name="TooltipFlagNoFly">
- No volar
- </string>
- <string name="TooltipFlagGroupScripts">
- Scripts el grupo
- </string>
- <string name="TooltipFlagNoScripts">
- No scripts
- </string>
- <string name="TooltipLand">
- Terreno:
- </string>
- <string name="TooltipMustSingleDrop">
- Aquí se puede arrastrar sólo un ítem
- </string>
- <string name="TooltipPrice" value="[AMOUNT] L$:"/>
- <string name="TooltipHttpUrl">
- Pulsa para ver esta página web
- </string>
- <string name="TooltipSLURL">
- Pulsa para ver la información de este lugar
- </string>
- <string name="TooltipAgentUrl">
- Pulsa para ver el perfil del Residente
- </string>
- <string name="TooltipAgentInspect">
- Obtén más información acerca de este residente.
- </string>
- <string name="TooltipAgentMute">
- Pulsa para silenciar a este Residente
- </string>
- <string name="TooltipAgentUnmute">
- Pulsa para quitar el silencio a este Residente
- </string>
- <string name="TooltipAgentIM">
- Pulsa para enviar un MI a este Residente
- </string>
- <string name="TooltipAgentPay">
- Pulsa para pagar a este Residente
- </string>
- <string name="TooltipAgentOfferTeleport">
- Pulsa para enviar una petición de teleporte a este Residente
- </string>
- <string name="TooltipAgentRequestFriend">
- Pulsa para enviar una petición de amistad a este Residente
- </string>
- <string name="TooltipGroupUrl">
- Pulsa para ver la descripción de este grupo
- </string>
- <string name="TooltipEventUrl">
- Pulsa para ver la descripción de este evento
- </string>
- <string name="TooltipClassifiedUrl">
- Pulsa para ver este clasificado
- </string>
- <string name="TooltipParcelUrl">
- Pulsa para ver la descripción de esta parcela
- </string>
- <string name="TooltipTeleportUrl">
- Pulsa para teleportarte a esta posición
- </string>
- <string name="TooltipObjectIMUrl">
- Pulsa para ver la descripción de este objeto
- </string>
- <string name="TooltipMapUrl">
- Pulsa para ver en el mapa esta localización
- </string>
- <string name="TooltipSLAPP">
- Pulsa para ejecutar el comando secondlife://
- </string>
- <string name="CurrentURL" value="URL actual: [CurrentURL]"/>
- <string name="SLurlLabelTeleport">
- Teleportarse a
- </string>
- <string name="SLurlLabelShowOnMap">
- Mostrarla en el mapa
- </string>
- <string name="SLappAgentMute">
- Silenciar
- </string>
- <string name="SLappAgentUnmute">
- Quitar el silencio
- </string>
- <string name="SLappAgentIM">
- MI
- </string>
- <string name="SLappAgentPay">
- Pagar
- </string>
- <string name="SLappAgentOfferTeleport">
- Ofrecer teleporte a
- </string>
- <string name="SLappAgentRequestFriend">
- Petición de amistad
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Cerrar (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Cerrar (Ctrl+W)
- </string>
- <string name="BUTTON_CLOSE_CHROME">
- Cerrar
- </string>
- <string name="BUTTON_RESTORE">
- Maximizar
- </string>
- <string name="BUTTON_MINIMIZE">
- Minimizar
- </string>
- <string name="BUTTON_TEAR_OFF">
- Separar la ventana
- </string>
- <string name="BUTTON_DOCK">
- Fijar
- </string>
- <string name="BUTTON_HELP">
- Ver la Ayuda
- </string>
- <string name="Searching">
- Buscando...
- </string>
- <string name="NoneFound">
- No se ha encontrado.
- </string>
- <string name="RetrievingData">
- Reintentando...
- </string>
- <string name="ReleaseNotes">
- Notas de la versión
- </string>
- <string name="RELEASE_NOTES_BASE_URL">
- http://wiki.secondlife.com/wiki/Release_Notes/
- </string>
- <string name="LoadingData">
- Cargando...
- </string>
- <string name="AvatarNameNobody">
- (nadie)
- </string>
- <string name="AvatarNameWaiting">
- (esperando)
- </string>
- <string name="GroupNameNone">
- (ninguno)
- </string>
- <string name="AvalineCaller">
- Avaline: [ORDER]
- </string>
- <string name="AssetErrorNone">
- No hay ningún error
- </string>
- <string name="AssetErrorRequestFailed">
- Petición de asset: fallida
- </string>
- <string name="AssetErrorNonexistentFile">
- Petición de asset: el archivo no existe
- </string>
- <string name="AssetErrorNotInDatabase">
- Petición de asset: no se encontró el asset en la base de datos
- </string>
- <string name="AssetErrorEOF">
- Fin del archivo
- </string>
- <string name="AssetErrorCannotOpenFile">
- No puede abrirse el archivo
- </string>
- <string name="AssetErrorFileNotFound">
- No se ha encontrado el archivo
- </string>
- <string name="AssetErrorTCPTimeout">
- Tiempo de transferencia del archivo
- </string>
- <string name="AssetErrorCircuitGone">
- Circuito desconectado
- </string>
- <string name="AssetErrorPriceMismatch">
- No concuerda el precio en el visor y en el servidor
- </string>
- <string name="AssetErrorUnknownStatus">
- Estado desconocido
- </string>
- <string name="texture">
- la textura
- </string>
- <string name="sound">
- el sonido
- </string>
- <string name="calling card">
- la tarjeta de visita
- </string>
- <string name="landmark">
- el hito
- </string>
- <string name="legacy script">
- el script antiguo
- </string>
- <string name="clothing">
- esa ropa
- </string>
- <string name="object">
- el objeto
- </string>
- <string name="note card">
- la nota
- </string>
- <string name="folder">
- la carpeta
- </string>
- <string name="root">
- la ruta
- </string>
- <string name="lsl2 script">
- ese script de LSL2
- </string>
- <string name="lsl bytecode">
- el código intermedio de LSL
- </string>
- <string name="tga texture">
- esa textura tga
- </string>
- <string name="body part">
- esa parte del cuerpo
- </string>
- <string name="snapshot">
- la foto
- </string>
- <string name="lost and found">
- Objetos Perdidos
- </string>
- <string name="targa image">
- esa imagen targa
- </string>
- <string name="trash">
- la Papelera
- </string>
- <string name="jpeg image">
- esa imagen jpeg
- </string>
- <string name="animation">
- la animación
- </string>
- <string name="gesture">
- el gesto
- </string>
- <string name="simstate">
- simstate
- </string>
- <string name="favorite">
- ese favorito
- </string>
- <string name="symbolic link">
- el enlace
- </string>
- <string name="symbolic folder link">
- enlace de la carpeta
- </string>
- <string name="AvatarAway">
- Ausente
- </string>
- <string name="AvatarBusy">
- Ocupado
- </string>
- <string name="AvatarMuted">
- Ignorado
- </string>
- <string name="anim_express_afraid">
- Susto
- </string>
- <string name="anim_express_anger">
- Enfado
- </string>
- <string name="anim_away">
- Ausente
- </string>
- <string name="anim_backflip">
- Salto mortal atrás
- </string>
- <string name="anim_express_laugh">
- Carcajada
- </string>
- <string name="anim_express_toothsmile">
- Gran sonrisa
- </string>
- <string name="anim_blowkiss">
- Mandar un beso
- </string>
- <string name="anim_express_bored">
- Aburrimiento
- </string>
- <string name="anim_bow">
- Reverencia
- </string>
- <string name="anim_clap">
- Aplauso
- </string>
- <string name="anim_courtbow">
- Reverencia floreada
- </string>
- <string name="anim_express_cry">
- Llanto
- </string>
- <string name="anim_dance1">
- Baile 1
- </string>
- <string name="anim_dance2">
- Baile 2
- </string>
- <string name="anim_dance3">
- Baile 3
- </string>
- <string name="anim_dance4">
- Baile 4
- </string>
- <string name="anim_dance5">
- Baile 5
- </string>
- <string name="anim_dance6">
- Baile 6
- </string>
- <string name="anim_dance7">
- Baile 7
- </string>
- <string name="anim_dance8">
- Baile 8
- </string>
- <string name="anim_express_disdain">
- Desdén
- </string>
- <string name="anim_drink">
- Beber
- </string>
- <string name="anim_express_embarrased">
- Azorarse
- </string>
- <string name="anim_angry_fingerwag">
- Negar con el dedo
- </string>
- <string name="anim_fist_pump">
- Éxito con el puño
- </string>
- <string name="anim_yoga_float">
- Yoga flotando
- </string>
- <string name="anim_express_frown">
- Fruncir el ceño
- </string>
- <string name="anim_impatient">
- Impaciente
- </string>
- <string name="anim_jumpforjoy">
- Salto de alegría
- </string>
- <string name="anim_kissmybutt">
- Bésame el culo
- </string>
- <string name="anim_express_kiss">
- Besar
- </string>
- <string name="anim_laugh_short">
- Reír
- </string>
- <string name="anim_musclebeach">
- Sacar músculo
- </string>
- <string name="anim_no_unhappy">
- No (con enfado)
- </string>
- <string name="anim_no_head">
- No
- </string>
- <string name="anim_nyanya">
- Ña-Ña-Ña
- </string>
- <string name="anim_punch_onetwo">
- Puñetazo uno-dos
- </string>
- <string name="anim_express_open_mouth">
- Abrir la boca
- </string>
- <string name="anim_peace">
- &apos;V&apos; con los dedos
- </string>
- <string name="anim_point_you">
- Señalar a otro/a
- </string>
- <string name="anim_point_me">
- Señalarse
- </string>
- <string name="anim_punch_l">
- Puñetazo izquierdo
- </string>
- <string name="anim_punch_r">
- Puñetazo derecho
- </string>
- <string name="anim_rps_countdown">
- PPT cuenta
- </string>
- <string name="anim_rps_paper">
- PPT papel
- </string>
- <string name="anim_rps_rock">
- PPT piedra
- </string>
- <string name="anim_rps_scissors">
- PPT tijera
- </string>
- <string name="anim_express_repulsed">
- Repulsa
- </string>
- <string name="anim_kick_roundhouse_r">
- Patada circular
- </string>
- <string name="anim_express_sad">
- Triste
- </string>
- <string name="anim_salute">
- Saludo militar
- </string>
- <string name="anim_shout">
- Gritar
- </string>
- <string name="anim_express_shrug">
- Encogerse de hombros
- </string>
- <string name="anim_express_smile">
- Sonreír
- </string>
- <string name="anim_smoke_idle">
- Fumar: en la mano
- </string>
- <string name="anim_smoke_inhale">
- Fumar
- </string>
- <string name="anim_smoke_throw_down">
- Fumar: tirar el cigarro
- </string>
- <string name="anim_express_surprise">
- Sorpresa
- </string>
- <string name="anim_sword_strike_r">
- Estocadas
- </string>
- <string name="anim_angry_tantrum">
- Berrinche
- </string>
- <string name="anim_express_tongue_out">
- Sacar la lengua
- </string>
- <string name="anim_hello">
- Agitar la mano
- </string>
- <string name="anim_whisper">
- Cuchichear
- </string>
- <string name="anim_whistle">
- Pitar
- </string>
- <string name="anim_express_wink">
- Guiño
- </string>
- <string name="anim_wink_hollywood">
- Guiño (Hollywood)
- </string>
- <string name="anim_express_worry">
- Preocuparse
- </string>
- <string name="anim_yes_happy">
- Sí (contento)
- </string>
- <string name="anim_yes_head">
- Sí
- </string>
- <string name="texture_loading">
- Cargando...
- </string>
- <string name="worldmap_offline">
- Sin conexión
- </string>
- <string name="worldmap_item_tooltip_format">
- [PRICE] L$ por [AREA] m²
- </string>
- <string name="worldmap_results_none_found">
- No se ha encontrado.
- </string>
- <string name="Ok">
- OK
- </string>
- <string name="Premature end of file">
- Fin prematuro del archivo
- </string>
- <string name="ST_NO_JOINT">
- No se puede encontrar ROOT o JOINT.
- </string>
- <string name="whisper">
- susurra:
- </string>
- <string name="shout">
- grita:
- </string>
- <string name="ringing">
- Conectando al chat de voz...
- </string>
- <string name="connected">
- Conectado
- </string>
- <string name="unavailable">
- La voz no está disponible en su localización actual
- </string>
- <string name="hang_up">
- Desconectado del chat de voz
- </string>
- <string name="reconnect_nearby">
- Vas a ser reconectado al chat de voz con los cercanos
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Cogerle a usted dólares Linden (L$)
- </string>
- <string name="ActOnControlInputs">
- Actuar en sus controles de entrada
- </string>
- <string name="RemapControlInputs">
- Reconfigurar sus controles de entrada
- </string>
- <string name="AnimateYourAvatar">
- Ejecutar animaciones en su avatar
- </string>
- <string name="AttachToYourAvatar">
- Anexarse a su avatar
- </string>
- <string name="ReleaseOwnership">
- Anular la propiedad y que pase a ser público
- </string>
- <string name="LinkAndDelink">
- Enlazar y desenlazar de otros objetos
- </string>
- <string name="AddAndRemoveJoints">
- Añadir y quitar uniones con otros objetos
- </string>
- <string name="ChangePermissions">
- Cambiar sus permisos
- </string>
- <string name="TrackYourCamera">
- Seguir su cámara
- </string>
- <string name="ControlYourCamera">
- Controlar su cámara
- </string>
- <string name="SIM_ACCESS_PG">
- General
- </string>
- <string name="SIM_ACCESS_MATURE">
- Moderado
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adulto
- </string>
- <string name="SIM_ACCESS_DOWN">
- Desconectado
- </string>
- <string name="SIM_ACCESS_MIN">
- Desconocido
- </string>
- <string name="land_type_unknown">
- (desconocido)
- </string>
- <string name="Estate / Full Region">
- Estado /Región completa
- </string>
- <string name="Estate / Homestead">
- Estado / Homestead
- </string>
- <string name="Mainland / Homestead">
- Continente / Homestead
- </string>
- <string name="Mainland / Full Region">
- Continente / Región completa
- </string>
- <string name="all_files">
- Todos los archivos
- </string>
- <string name="sound_files">
- Sonidos
- </string>
- <string name="animation_files">
- Animaciones
- </string>
- <string name="image_files">
- Imágenes
- </string>
- <string name="save_file_verb">
- Guardar
- </string>
- <string name="load_file_verb">
- Cargar
- </string>
- <string name="targa_image_files">
- Imágenes Targa
- </string>
- <string name="bitmap_image_files">
- Imágenes de mapa de bits
- </string>
- <string name="avi_movie_file">
- Archivo de película AVI
- </string>
- <string name="xaf_animation_file">
- Archivo de anim. XAF
- </string>
- <string name="xml_file">
- Archivo XML
- </string>
- <string name="raw_file">
- Archivo RAW
- </string>
- <string name="compressed_image_files">
- Imágenes comprimidas
- </string>
- <string name="load_files">
- Cargar archivos
- </string>
- <string name="choose_the_directory">
- Elegir directorio
- </string>
- <string name="AvatarSetNotAway">
- Salir del estado ausente
- </string>
- <string name="AvatarSetAway">
- Pasar al estado ausente
- </string>
- <string name="AvatarSetNotBusy">
- Salir del estado ocupado
- </string>
- <string name="AvatarSetBusy">
- Pasar al estado ocupado
- </string>
- <string name="shape">
- Forma
- </string>
- <string name="skin">
- Piel
- </string>
- <string name="hair">
- Pelo
- </string>
- <string name="eyes">
- Ojos
- </string>
- <string name="shirt">
- Camisa
- </string>
- <string name="pants">
- Pantalón
- </string>
- <string name="shoes">
- Zapatos
- </string>
- <string name="socks">
- Calcetines
- </string>
- <string name="jacket">
- Chaqueta
- </string>
- <string name="gloves">
- Guantes
- </string>
- <string name="undershirt">
- Camiseta
- </string>
- <string name="underpants">
- Ropa interior
- </string>
- <string name="skirt">
- Falda
- </string>
- <string name="alpha">
- Alfa
- </string>
- <string name="tattoo">
- Tatuaje
- </string>
- <string name="physics">
- Física
- </string>
- <string name="invalid">
- inválido/a
- </string>
- <string name="none">
- ninguno
- </string>
- <string name="shirt_not_worn">
- Camisa no puesta
- </string>
- <string name="pants_not_worn">
- Pantalones no puestos
- </string>
- <string name="shoes_not_worn">
- Zapatos no puestos
- </string>
- <string name="socks_not_worn">
- Calcetines no puestos
- </string>
- <string name="jacket_not_worn">
- Chaqueta no puesta
- </string>
- <string name="gloves_not_worn">
- Guantes no puestos
- </string>
- <string name="undershirt_not_worn">
- Camiseta no puesta
- </string>
- <string name="underpants_not_worn">
- Ropa interior no puesta
- </string>
- <string name="skirt_not_worn">
- Falda no puesta
- </string>
- <string name="alpha_not_worn">
- Alfa no puesta
- </string>
- <string name="tattoo_not_worn">
- Tatuaje no puesto
- </string>
- <string name="physics_not_worn">
- Física no puesta
- </string>
- <string name="invalid_not_worn">
- no válido/a
- </string>
- <string name="create_new_shape">
- Crear una anatomía nueva
- </string>
- <string name="create_new_skin">
- Crear una piel nueva
- </string>
- <string name="create_new_hair">
- Crear pelo nuevo
- </string>
- <string name="create_new_eyes">
- Crear ojos nuevos
- </string>
- <string name="create_new_shirt">
- Crear una camisa nueva
- </string>
- <string name="create_new_pants">
- Crear unos pantalones nuevos
- </string>
- <string name="create_new_shoes">
- Crear unos zapatos nuevos
- </string>
- <string name="create_new_socks">
- Crear unos calcetines nuevos
- </string>
- <string name="create_new_jacket">
- Crear una chaqueta nueva
- </string>
- <string name="create_new_gloves">
- Crear unos guantes nuevos
- </string>
- <string name="create_new_undershirt">
- Crear una camiseta nueva
- </string>
- <string name="create_new_underpants">
- Crear ropa interior nueva
- </string>
- <string name="create_new_skirt">
- Crear una falda nueva
- </string>
- <string name="create_new_alpha">
- Crear una capa alfa nueva
- </string>
- <string name="create_new_tattoo">
- Crear un tatuaje nuevo
- </string>
- <string name="create_new_physics">
- Crear nueva física
- </string>
- <string name="create_new_invalid">
- no válido/a
- </string>
- <string name="NewWearable">
- Nuevo [WEARABLE_ITEM]
- </string>
- <string name="next">
- Siguiente
- </string>
- <string name="ok">
- OK
- </string>
- <string name="GroupNotifyGroupNotice">
- Aviso de grupo
- </string>
- <string name="GroupNotifyGroupNotices">
- Avisos del grupo
- </string>
- <string name="GroupNotifySentBy">
- Enviado por
- </string>
- <string name="GroupNotifyAttached">
- Adjunto:
- </string>
- <string name="GroupNotifyViewPastNotices">
- Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
- </string>
- <string name="GroupNotifyOpenAttachment">
- Abrir el adjunto
- </string>
- <string name="GroupNotifySaveAttachment">
- Guardar el adjunto
- </string>
- <string name="TeleportOffer">
- Ofrecimiento de teleporte
- </string>
- <string name="StartUpNotifications">
- Llegaron avisos nuevos mientras estabas ausente...
- </string>
- <string name="OverflowInfoChannelString">
- Tienes [%d] aviso/s más
- </string>
- <string name="BodyPartsRightArm">
- Brazo der.
- </string>
- <string name="BodyPartsHead">
- Cabeza
- </string>
- <string name="BodyPartsLeftArm">
- Brazo izq.
- </string>
- <string name="BodyPartsLeftLeg">
- Pierna izq.
- </string>
- <string name="BodyPartsTorso">
- Torso
- </string>
- <string name="BodyPartsRightLeg">
- Pierna der.
- </string>
- <string name="GraphicsQualityLow">
- Bajo
- </string>
- <string name="GraphicsQualityMid">
- Medio
- </string>
- <string name="GraphicsQualityHigh">
- Alto
- </string>
- <string name="LeaveMouselook">
- Pulsa ESC para salir de la vista subjetiva
- </string>
- <string name="InventoryNoMatchingItems">
- ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
- </string>
- <string name="PlacesNoMatchingItems">
- ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
- </string>
- <string name="FavoritesNoMatchingItems">
- Arrastra aquí un hito para tenerlo en tus favoritos.
- </string>
- <string name="InventoryNoTexture">
- No tienes en tu inventario una copia de esta textura
- </string>
- <string name="no_transfer" value="(no transferible)"/>
- <string name="no_modify" value="(no modificable)"/>
- <string name="no_copy" value="(no copiable)"/>
- <string name="worn" value="(puesto)"/>
- <string name="link" value="(enlace)"/>
- <string name="broken_link" value="(enlace roto)&quot;"/>
- <string name="LoadingContents">
- Cargando el contenido...
- </string>
- <string name="NoContents">
- No hay contenido
- </string>
- <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
- <string name="ActiveGesture" value="[GESLABEL] (activo)"/>
- <string name="Chat Message" value="Chat:"/>
- <string name="Sound" value="Sonido :"/>
- <string name="Wait" value="--- Espera :"/>
- <string name="AnimFlagStop" value="Parar la animación:"/>
- <string name="AnimFlagStart" value="Empezar la animación:"/>
- <string name="Wave" value="Onda"/>
- <string name="GestureActionNone" value="Ninguno"/>
- <string name="HelloAvatar" value="¡Hola, avatar!"/>
- <string name="ViewAllGestures" value="Ver todos &gt;&gt;"/>
- <string name="GetMoreGestures" value="Obtener más &gt;&gt;"/>
- <string name="Animations" value="Animaciones,"/>
- <string name="Calling Cards" value="Tarjetas de visita,"/>
- <string name="Clothing" value="Ropa,"/>
- <string name="Gestures" value="Gestos,"/>
- <string name="Landmarks" value="Hitos,"/>
- <string name="Notecards" value="Notas,"/>
- <string name="Objects" value="Objetos,"/>
- <string name="Scripts" value="Scripts,"/>
- <string name="Sounds" value="Sonidos,"/>
- <string name="Textures" value="Texturas,"/>
- <string name="Snapshots" value="Fotos,"/>
- <string name="No Filters" value="No"/>
- <string name="Since Logoff" value="- Desde la desconexión"/>
- <string name="InvFolder My Inventory">
- Mi Inventario
- </string>
- <string name="InvFolder My Favorites">
- Mis Favoritos
- </string>
- <string name="InvFolder Library">
- Biblioteca
- </string>
- <string name="InvFolder Textures">
- Texturas
- </string>
- <string name="InvFolder Sounds">
- Sonidos
- </string>
- <string name="InvFolder Calling Cards">
- Tarjetas de visita
- </string>
- <string name="InvFolder Landmarks">
- Hitos
- </string>
- <string name="InvFolder Scripts">
- Scripts
- </string>
- <string name="InvFolder Clothing">
- Ropa
- </string>
- <string name="InvFolder Objects">
- Objetos
- </string>
- <string name="InvFolder Notecards">
- Notas
- </string>
- <string name="InvFolder New Folder">
- Carpeta nueva
- </string>
- <string name="InvFolder Inventory">
- Inventario
- </string>
- <string name="InvFolder Uncompressed Images">
- Imágenes sin comprimir
- </string>
- <string name="InvFolder Body Parts">
- Partes del cuerpo
- </string>
- <string name="InvFolder Trash">
- Papelera
- </string>
- <string name="InvFolder Photo Album">
- Álbum de fotos
- </string>
- <string name="InvFolder Lost And Found">
- Objetos Perdidos
- </string>
- <string name="InvFolder Uncompressed Sounds">
- Sonidos sin comprimir
- </string>
- <string name="InvFolder Animations">
- Animaciones
- </string>
- <string name="InvFolder Gestures">
- Gestos
- </string>
- <string name="InvFolder Favorite">
- Favoritos
- </string>
- <string name="InvFolder favorite">
- Favoritos
- </string>
- <string name="InvFolder Current Outfit">
- Vestuario actual
- </string>
- <string name="InvFolder Initial Outfits">
- Vestuario inicial
- </string>
- <string name="InvFolder My Outfits">
- Mis vestuarios
- </string>
- <string name="InvFolder Accessories">
- Accesorios
- </string>
- <string name="InvFolder Friends">
- Amigos
- </string>
- <string name="InvFolder All">
- Todas
- </string>
- <string name="Buy">
- Comprar
- </string>
- <string name="BuyforL$">
- Comprar por L$
- </string>
- <string name="Stone">
- Piedra
- </string>
- <string name="Metal">
- Metal
- </string>
- <string name="Glass">
- Cristal
- </string>
- <string name="Wood">
- Madera
- </string>
- <string name="Flesh">
- Carne
- </string>
- <string name="Plastic">
- Plástico
- </string>
- <string name="Rubber">
- Goma
- </string>
- <string name="Light">
- Claridad
- </string>
- <string name="KBShift">
- Mayúsculas
- </string>
- <string name="KBCtrl">
- Ctrl
- </string>
- <string name="Chest">
- Tórax
- </string>
- <string name="Skull">
- Cráneo
- </string>
- <string name="Left Shoulder">
- Hombro izquierdo
- </string>
- <string name="Right Shoulder">
- Hombro derecho
- </string>
- <string name="Left Hand">
- Mano izq.
- </string>
- <string name="Right Hand">
- Mano der.
- </string>
- <string name="Left Foot">
- Pie izq.
- </string>
- <string name="Right Foot">
- Pie der.
- </string>
- <string name="Spine">
- Columna
- </string>
- <string name="Pelvis">
- Pelvis
- </string>
- <string name="Mouth">
- Boca
- </string>
- <string name="Chin">
- Barbilla
- </string>
- <string name="Left Ear">
- Oreja izq.
- </string>
- <string name="Right Ear">
- Oreja der.
- </string>
- <string name="Left Eyeball">
- Ojo izq.
- </string>
- <string name="Right Eyeball">
- Ojo der.
- </string>
- <string name="Nose">
- Nariz
- </string>
- <string name="R Upper Arm">
- Brazo der.
- </string>
- <string name="R Forearm">
- Antebrazo der.
- </string>
- <string name="L Upper Arm">
- Brazo izq.
- </string>
- <string name="L Forearm">
- Antebrazo izq.
- </string>
- <string name="Right Hip">
- Cadera der.
- </string>
- <string name="R Upper Leg">
- Muslo der.
- </string>
- <string name="R Lower Leg">
- Pantorrilla der.
- </string>
- <string name="Left Hip">
- Cadera izq.
- </string>
- <string name="L Upper Leg">
- Muslo izq.
- </string>
- <string name="L Lower Leg">
- Pantorrilla izq.
- </string>
- <string name="Stomach">
- Abdomen
- </string>
- <string name="Left Pec">
- Pecho izquierdo
- </string>
- <string name="Right Pec">
- Pecho derecho
- </string>
- <string name="Invalid Attachment">
- Punto de colocación no válido
- </string>
- <string name="YearsMonthsOld">
- [AGEYEARS] [AGEMONTHS] de edad
- </string>
- <string name="YearsOld">
- [AGEYEARS] de edad
- </string>
- <string name="MonthsOld">
- [AGEMONTHS] de edad
- </string>
- <string name="WeeksOld">
- [AGEWEEKS] de edad
- </string>
- <string name="DaysOld">
- [AGEDAYS] de edad
- </string>
- <string name="TodayOld">
- Registrado hoy
- </string>
- <string name="AgeYearsA">
- [COUNT] año
- </string>
- <string name="AgeYearsB">
- [COUNT] años
- </string>
- <string name="AgeYearsC">
- [COUNT] años
- </string>
- <string name="AgeMonthsA">
- [COUNT] mes
- </string>
- <string name="AgeMonthsB">
- [COUNT] meses
- </string>
- <string name="AgeMonthsC">
- [COUNT] meses
- </string>
- <string name="AgeWeeksA">
- [COUNT] semana
- </string>
- <string name="AgeWeeksB">
- [COUNT] semanas
- </string>
- <string name="AgeWeeksC">
- [COUNT] semanas
- </string>
- <string name="AgeDaysA">
- [COUNT] día
- </string>
- <string name="AgeDaysB">
- [COUNT] días
- </string>
- <string name="AgeDaysC">
- [COUNT] días
- </string>
- <string name="GroupMembersA">
- [COUNT] miembro
- </string>
- <string name="GroupMembersB">
- [COUNT] miembros
- </string>
- <string name="GroupMembersC">
- [COUNT] miembros
- </string>
- <string name="AcctTypeResident">
- Residente
- </string>
- <string name="AcctTypeTrial">
- Prueba
- </string>
- <string name="AcctTypeCharterMember">
- Miembro fundador
- </string>
- <string name="AcctTypeEmployee">
- Empleado de Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Ha usado información sobre la forma de pago
- </string>
- <string name="PaymentInfoOnFile">
- Hay información archivada sobre la forma de pago
- </string>
- <string name="NoPaymentInfoOnFile">
- No hay información archivada sobre la forma de pago
- </string>
- <string name="AgeVerified">
- Edad verificada
- </string>
- <string name="NotAgeVerified">
- Edad no verificada
- </string>
- <string name="Center 2">
- Centro 2
- </string>
- <string name="Top Right">
- Arriba der.
- </string>
- <string name="Top">
- Arriba
- </string>
- <string name="Top Left">
- Arriba izq.
- </string>
- <string name="Center">
- Centro
- </string>
- <string name="Bottom Left">
- Abajo izq.
- </string>
- <string name="Bottom">
- Abajo
- </string>
- <string name="Bottom Right">
- Abajo der.
- </string>
- <string name="CompileQueueDownloadedCompiling">
- Descargado, compilándolo
- </string>
- <string name="CompileQueueScriptNotFound">
- No se encuentra el script en el servidor.
- </string>
- <string name="CompileQueueProblemDownloading">
- Problema al descargar
- </string>
- <string name="CompileQueueInsufficientPermDownload">
- Permisos insuficientes para descargar un script.
- </string>
- <string name="CompileQueueInsufficientPermFor">
- Permisos insuficientes para
- </string>
- <string name="CompileQueueUnknownFailure">
- Fallo desconocido en la descarga
- </string>
- <string name="CompileQueueTitle">
- Recompilando
- </string>
- <string name="CompileQueueStart">
- recompilar
- </string>
- <string name="ResetQueueTitle">
- Progreso del reinicio
- </string>
- <string name="ResetQueueStart">
- restaurar
- </string>
- <string name="RunQueueTitle">
- Configurar según se ejecuta
- </string>
- <string name="RunQueueStart">
- Configurando según se ejecuta
- </string>
- <string name="NotRunQueueTitle">
- Configurar sin ejecutar
- </string>
- <string name="NotRunQueueStart">
- Configurando sin ejecutarlo
- </string>
- <string name="CompileSuccessful">
- ¡Compilación correcta!
- </string>
- <string name="CompileSuccessfulSaving">
- Compilación correcta, guardando...
- </string>
- <string name="SaveComplete">
- Guardado.
- </string>
- <string name="ObjectOutOfRange">
- Script (objeto fuera de rango)
- </string>
- <string name="GodToolsObjectOwnedBy">
- El objeto [OBJECT] es propiedad de [OWNER]
- </string>
- <string name="GroupsNone">
- ninguno
- </string>
- <string name="Group" value="(grupo)"/>
- <string name="Unknown">
- (Desconocido)
- </string>
- <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
- <string name="NextStipendDay" value="El próximo día de pago es el"/>
- <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
- <string name="GroupColumn" value="Grupo"/>
- <string name="Balance">
- Saldo
- </string>
- <string name="Credits">
- Créditos
- </string>
- <string name="Debits">
- Débitos
- </string>
- <string name="Total">
- Total
- </string>
- <string name="NoGroupDataFound">
- No se encontraron datos del grupo
- </string>
- <string name="IMParentEstate">
- parent estate
- </string>
- <string name="IMMainland">
- continente
- </string>
- <string name="IMTeen">
- teen
- </string>
- <string name="RegionInfoError">
- error
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- todos los estados propiedad de [OWNER]
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- todos los estados que posees
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- todos los estados que administras para [OWNER]
- </string>
- <string name="RegionInfoAllowedResidents">
- Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
- </string>
- <string name="ScriptLimitsParcelScriptMemory">
- Memoria de los scripts de la parcela
- </string>
- <string name="ScriptLimitsParcelsOwned">
- Parcelas listadas: [PARCELS]
- </string>
- <string name="ScriptLimitsMemoryUsed">
- Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
- </string>
- <string name="ScriptLimitsMemoryUsedSimple">
- Memoria usada: [COUNT] kb
- </string>
- <string name="ScriptLimitsParcelScriptURLs">
- URLs de los scripts de la parcela
- </string>
- <string name="ScriptLimitsURLsUsed">
- URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
- </string>
- <string name="ScriptLimitsURLsUsedSimple">
- URLs usadas: [COUNT]
- </string>
- <string name="ScriptLimitsRequestError">
- Error al obtener la información
- </string>
- <string name="ScriptLimitsRequestNoParcelSelected">
- No hay una parcela seleccionada
- </string>
- <string name="ScriptLimitsRequestWrongRegion">
- Error: la información del script sólo está disponible en tu región actual
- </string>
- <string name="ScriptLimitsRequestWaiting">
- Obteniendo la información...
- </string>
- <string name="ScriptLimitsRequestDontOwnParcel">
- No tienes permiso para examinar esta parcela
- </string>
- <string name="SITTING_ON">
- Sentado en
- </string>
- <string name="ATTACH_CHEST">
- Tórax
- </string>
- <string name="ATTACH_HEAD">
- Cabeza
- </string>
- <string name="ATTACH_LSHOULDER">
- Hombro izquierdo
- </string>
- <string name="ATTACH_RSHOULDER">
- Hombro derecho
- </string>
- <string name="ATTACH_LHAND">
- Mano izq.
- </string>
- <string name="ATTACH_RHAND">
- Mano der.
- </string>
- <string name="ATTACH_LFOOT">
- Pie izq.
- </string>
- <string name="ATTACH_RFOOT">
- Pie der.
- </string>
- <string name="ATTACH_BACK">
- Anterior
- </string>
- <string name="ATTACH_PELVIS">
- Pelvis
- </string>
- <string name="ATTACH_MOUTH">
- Boca
- </string>
- <string name="ATTACH_CHIN">
- Barbilla
- </string>
- <string name="ATTACH_LEAR">
- Oreja izq.
- </string>
- <string name="ATTACH_REAR">
- Oreja der.
- </string>
- <string name="ATTACH_LEYE">
- Ojo izq.
- </string>
- <string name="ATTACH_REYE">
- Ojo der.
- </string>
- <string name="ATTACH_NOSE">
- Nariz
- </string>
- <string name="ATTACH_RUARM">
- Brazo der.
- </string>
- <string name="ATTACH_RLARM">
- Antebrazo der.
- </string>
- <string name="ATTACH_LUARM">
- Brazo izq.
- </string>
- <string name="ATTACH_LLARM">
- Antebrazo izq.
- </string>
- <string name="ATTACH_RHIP">
- Cadera der.
- </string>
- <string name="ATTACH_RULEG">
- Muslo der.
- </string>
- <string name="ATTACH_RLLEG">
- Pantorrilla der.
- </string>
- <string name="ATTACH_LHIP">
- Cadera izq.
- </string>
- <string name="ATTACH_LULEG">
- Muslo izq.
- </string>
- <string name="ATTACH_LLLEG">
- Pantorrilla izq.
- </string>
- <string name="ATTACH_BELLY">
- Vientre
- </string>
- <string name="ATTACH_RPEC">
- Pecho derecho
- </string>
- <string name="ATTACH_LPEC">
- Pecho izquierdo
- </string>
- <string name="ATTACH_HUD_CENTER_2">
- HUD: Centro 2
- </string>
- <string name="ATTACH_HUD_TOP_RIGHT">
- HUD: arriba der.
- </string>
- <string name="ATTACH_HUD_TOP_CENTER">
- HUD: arriba centro
- </string>
- <string name="ATTACH_HUD_TOP_LEFT">
- HUD: arriba izq.
- </string>
- <string name="ATTACH_HUD_CENTER_1">
- HUD: Centro 1
- </string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">
- HUD: abajo izq.
- </string>
- <string name="ATTACH_HUD_BOTTOM">
- HUD: abajo
- </string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">
- HUD: abajo der.
- </string>
- <string name="CursorPos">
- Línea [LINE], Columna [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] resultados
- </string>
- <string name="PanelContentsTooltip">
- Contenido del objeto
- </string>
- <string name="PanelContentsNewScript">
- Script nuevo
- </string>
- <string name="BusyModeResponseDefault">
- El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI.
- </string>
- <string name="MuteByName">
- (Por el nombre)
- </string>
- <string name="MuteAgent">
- (Residente)
- </string>
- <string name="MuteObject">
- (Objeto)
- </string>
- <string name="MuteGroup">
- (Grupo)
- </string>
- <string name="MuteExternal">
- (Externo)
- </string>
- <string name="RegionNoCovenant">
- No se ha aportado un contrato para este estado.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
- </string>
- <string name="covenant_last_modified" value="Última modificación: "/>
- <string name="none_text" value="(no hay)"/>
- <string name="never_text" value=" (nunca)"/>
- <string name="GroupOwned">
- Propiedad del grupo
- </string>
- <string name="Public">
- Público
- </string>
- <string name="ClassifiedClicksTxt">
- Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (se actualizará tras la publicación)
- </string>
- <string name="NoPicksClassifiedsText">
- No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
- </string>
- <string name="NoAvatarPicksClassifiedsText">
- El usuario no tiene clasificados ni destacados
- </string>
- <string name="PicksClassifiedsLoadingText">
- Cargando...
- </string>
- <string name="MultiPreviewTitle">
- Vista previa
- </string>
- <string name="MultiPropertiesTitle">
- Propiedades
- </string>
- <string name="InvOfferAnObjectNamed">
- Un objeto de nombre
- </string>
- <string name="InvOfferOwnedByGroup">
- propiedad del grupo
- </string>
- <string name="InvOfferOwnedByUnknownGroup">
- propiedad de un grupo desconocido
- </string>
- <string name="InvOfferOwnedBy">
- propiedad de
- </string>
- <string name="InvOfferOwnedByUnknownUser">
- propiedad de un usuario desconocido
- </string>
- <string name="InvOfferGaveYou">
- te ha dado
- </string>
- <string name="InvOfferDecline">
- Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
- </string>
- <string name="GroupMoneyTotal">
- Total
- </string>
- <string name="GroupMoneyBought">
- comprado
- </string>
- <string name="GroupMoneyPaidYou">
- pagado a ti
- </string>
- <string name="GroupMoneyPaidInto">
- pagado en
- </string>
- <string name="GroupMoneyBoughtPassTo">
- pase comprado a
- </string>
- <string name="GroupMoneyPaidFeeForEvent">
- cuotas pagadas para el evento
- </string>
- <string name="GroupMoneyPaidPrizeForEvent">
- precio pagado por el evento
- </string>
- <string name="GroupMoneyBalance">
- Saldo
- </string>
- <string name="GroupMoneyCredits">
- Créditos
- </string>
- <string name="GroupMoneyDebits">
- Débitos
- </string>
- <string name="ViewerObjectContents">
- Contenidos
- </string>
- <string name="AcquiredItems">
- Artículos adquiridos
- </string>
- <string name="Cancel">
- Cancelar
- </string>
- <string name="UploadingCosts">
- Subir [NAME] cuesta [AMOUNT] L$
- </string>
- <string name="BuyingCosts">
- Comprar esto cuesta [AMOUNT] L$
- </string>
- <string name="UnknownFileExtension">
- Extensión de archivo desconocida [.%s]
-Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
- </string>
- <string name="MuteObject2">
- Ignorar
- </string>
- <string name="AddLandmarkNavBarMenu">
- Guardarme este hito...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Editar este hito...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Mayús+
- </string>
- <string name="FileSaved">
- Archivo guardado
- </string>
- <string name="Receiving">
- Recibiendo
- </string>
- <string name="AM">
- AM
- </string>
- <string name="PM">
- PM
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Direction_Forward">
- Adelante
- </string>
- <string name="Direction_Left">
- Izquierda
- </string>
- <string name="Direction_Right">
- Derecha
- </string>
- <string name="Direction_Back">
- Atrás
- </string>
- <string name="Direction_North">
- Norte
- </string>
- <string name="Direction_South">
- Sur
- </string>
- <string name="Direction_West">
- Oeste
- </string>
- <string name="Direction_East">
- Este
- </string>
- <string name="Direction_Up">
- Arriba
- </string>
- <string name="Direction_Down">
- Abajo
- </string>
- <string name="Any Category">
- Cualquier categoría
- </string>
- <string name="Shopping">
- Compras
- </string>
- <string name="Land Rental">
- Terreno en alquiler
- </string>
- <string name="Property Rental">
- Propiedad en alquiler
- </string>
- <string name="Special Attraction">
- Atracción especial
- </string>
- <string name="New Products">
- Nuevos productos
- </string>
- <string name="Employment">
- Empleo
- </string>
- <string name="Wanted">
- Se busca
- </string>
- <string name="Service">
- Servicios
- </string>
- <string name="Personal">
- Personal
- </string>
- <string name="None">
- Ninguno
- </string>
- <string name="Linden Location">
- Localización Linden
- </string>
- <string name="Adult">
- Adulto
- </string>
- <string name="Arts&amp;Culture">
- Arte y Cultura
- </string>
- <string name="Business">
- Negocios
- </string>
- <string name="Educational">
- Educativo
- </string>
- <string name="Gaming">
- Juegos de azar
- </string>
- <string name="Hangout">
- Entretenimiento
- </string>
- <string name="Newcomer Friendly">
- Para recién llegados
- </string>
- <string name="Parks&amp;Nature">
- Parques y Naturaleza
- </string>
- <string name="Residential">
- Residencial
- </string>
- <string name="Stage">
- Artes escénicas
- </string>
- <string name="Other">
- Otra
- </string>
- <string name="Rental">
- Terreno en alquiler
- </string>
- <string name="Any">
- Cualquiera
- </string>
- <string name="You">
- Tú
- </string>
- <string name="Multiple Media">
- Múltiples medias
- </string>
- <string name="Play Media">
- Play/Pausa los media
- </string>
- <string name="MBCmdLineError">
- Ha habido un error analizando la línea de comando.
-Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
-Error:
- </string>
- <string name="MBCmdLineUsg">
- [APP_NAME] Uso de línea de comando:
- </string>
- <string name="MBUnableToAccessFile">
- [APP_NAME] no puede acceder a un archivo que necesita.
-
-Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
-Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
-Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
- </string>
- <string name="MBFatalError">
- Error fatal
- </string>
- <string name="MBRequiresAltiVec">
- [APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
- </string>
- <string name="MBAlreadyRunning">
- [APP_NAME] ya se está ejecutando.
-Revisa tu barra de tareas para encontrar una copia minimizada del programa.
-Si este mensaje persiste, reinicia tu ordenador.
- </string>
- <string name="MBFrozenCrashed">
- En su anterior ejecución, [APP_NAME] se congeló o se cayó.
-¿Quieres enviar un informe de caída?
- </string>
- <string name="MBAlert">
- Alerta
- </string>
- <string name="MBNoDirectX">
- [APP_NAME] no encuentra DirectX 9.0b o superior.
-[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
-
-¿Quieres continuar?
- </string>
- <string name="MBWarning">
- ¡Atención!
- </string>
- <string name="MBNoAutoUpdate">
- Las actualizaciones automáticas no están todavía implementadas para Linux.
-Por favor, descarga la última versión desde www.secondlife.com.
- </string>
- <string name="MBRegClassFailed">
- Fallo en RegisterClass
- </string>
- <string name="MBError">
- Error
- </string>
- <string name="MBFullScreenErr">
- No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
-Ejecutándose en una ventana.
- </string>
- <string name="MBDestroyWinFailed">
- Error Shutdown destruyendo la ventana (DestroyWindow() failed)
- </string>
- <string name="MBShutdownErr">
- Error Shutdown
- </string>
- <string name="MBDevContextErr">
- No se puede construir el &apos;GL device context&apos;
- </string>
- <string name="MBPixelFmtErr">
- No se puede encontrar un formato adecuado de píxel
- </string>
- <string name="MBPixelFmtDescErr">
- No se puede conseguir la descripción del formato de píxel
- </string>
- <string name="MBTrueColorWindow">
- Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
-Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
- </string>
- <string name="MBAlpha">
- [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
-Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
-Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
-Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
- </string>
- <string name="MBPixelFmtSetErr">
- No se puede configurar el formato de píxel
- </string>
- <string name="MBGLContextErr">
- No se puede crear el &apos;GL rendering context&apos;
- </string>
- <string name="MBGLContextActErr">
- No se puede activar el &apos;GL rendering context&apos;
- </string>
- <string name="MBVideoDrvErr">
- [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
-
-Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
- </string>
- <string name="5 O&apos;Clock Shadow">
- Barba del día
- </string>
- <string name="All White">
- Blanco del todo
- </string>
- <string name="Anime Eyes">
- Ojos de cómic
- </string>
- <string name="Arced">
- Arqueadas
- </string>
- <string name="Arm Length">
- Brazos: longitud
- </string>
- <string name="Attached">
- Cortos
- </string>
- <string name="Attached Earlobes">
- Lóbulos
- </string>
- <string name="Back Fringe">
- Nuca: largo
- </string>
- <string name="Baggy">
- Marcadas
- </string>
- <string name="Bangs">
- Bangs
- </string>
- <string name="Beady Eyes">
- Ojos pequeños
- </string>
- <string name="Belly Size">
- Barriga: tamaño
- </string>
- <string name="Big">
- Grande
- </string>
- <string name="Big Butt">
- Culo grande
- </string>
- <string name="Big Hair Back">
- Pelo: moño
- </string>
- <string name="Big Hair Front">
- Pelo: tupé
- </string>
- <string name="Big Hair Top">
- Pelo: melena alta
- </string>
- <string name="Big Head">
- Cabeza grande
- </string>
- <string name="Big Pectorals">
- Grandes pectorales
- </string>
- <string name="Big Spikes">
- Crestas grandes
- </string>
- <string name="Black">
- Negro
- </string>
- <string name="Blonde">
- Rubio
- </string>
- <string name="Blonde Hair">
- Pelo rubio
- </string>
- <string name="Blush">
- Colorete
- </string>
- <string name="Blush Color">
- Color del colorete
- </string>
- <string name="Blush Opacity">
- Opacidad del colorete
- </string>
- <string name="Body Definition">
- Definición del cuerpo
- </string>
- <string name="Body Fat">
- Cuerpo: gordura
- </string>
- <string name="Body Freckles">
- Pecas del cuerpo
- </string>
- <string name="Body Thick">
- Cuerpo grueso
- </string>
- <string name="Body Thickness">
- Cuerpo: grosor
- </string>
- <string name="Body Thin">
- Cuerpo delgado
- </string>
- <string name="Bow Legged">
- Abiertas
- </string>
- <string name="Breast Buoyancy">
- Busto: firmeza
- </string>
- <string name="Breast Cleavage">
- Busto: canalillo
- </string>
- <string name="Breast Size">
- Busto: tamaño
- </string>
- <string name="Bridge Width">
- Puente: ancho
- </string>
- <string name="Broad">
- Aumentar
- </string>
- <string name="Brow Size">
- Arco ciliar
- </string>
- <string name="Bug Eyes">
- Bug Eyes
- </string>
- <string name="Bugged Eyes">
- Ojos saltones
- </string>
- <string name="Bulbous">
- Bulbosa
- </string>
- <string name="Bulbous Nose">
- Nariz de porra
- </string>
- <string name="Breast Physics Mass">
- Masa del busto
- </string>
- <string name="Breast Physics Smoothing">
- Suavizado del busto
- </string>
- <string name="Breast Physics Gravity">
- Gravedad del busto
- </string>
- <string name="Breast Physics Drag">
- Aerodinámica del busto
- </string>
- <string name="Breast Physics InOut Max Effect">
- Efecto máx.
- </string>
- <string name="Breast Physics InOut Spring">
- Elasticidad
- </string>
- <string name="Breast Physics InOut Gain">
- Ganancia
- </string>
- <string name="Breast Physics InOut Damping">
- Amortiguación
- </string>
- <string name="Breast Physics UpDown Max Effect">
- Efecto máx.
- </string>
- <string name="Breast Physics UpDown Spring">
- Elasticidad
- </string>
- <string name="Breast Physics UpDown Gain">
- Ganancia
- </string>
- <string name="Breast Physics UpDown Damping">
- Amortiguación
- </string>
- <string name="Breast Physics LeftRight Max Effect">
- Efecto máx.
- </string>
- <string name="Breast Physics LeftRight Spring">
- Elasticidad
- </string>
- <string name="Breast Physics LeftRight Gain">
- Ganancia
- </string>
- <string name="Breast Physics LeftRight Damping">
- Amortiguación
- </string>
- <string name="Belly Physics Mass">
- Masa de la barriga
- </string>
- <string name="Belly Physics Smoothing">
- Suavizado de la barriga
- </string>
- <string name="Belly Physics Gravity">
- Gravedad de la barriga
- </string>
- <string name="Belly Physics Drag">
- Aerodinámica de la barriga
- </string>
- <string name="Belly Physics UpDown Max Effect">
- Efecto máx.
- </string>
- <string name="Belly Physics UpDown Spring">
- Elasticidad
- </string>
- <string name="Belly Physics UpDown Gain">
- Ganancia
- </string>
- <string name="Belly Physics UpDown Damping">
- Amortiguación
- </string>
- <string name="Butt Physics Mass">
- Masa del culo
- </string>
- <string name="Butt Physics Smoothing">
- Suavizado del culo
- </string>
- <string name="Butt Physics Gravity">
- Gravedad del culo
- </string>
- <string name="Butt Physics Drag">
- Aerodinámica del culo
- </string>
- <string name="Butt Physics UpDown Max Effect">
- Efecto máx.
- </string>
- <string name="Butt Physics UpDown Spring">
- Elasticidad
- </string>
- <string name="Butt Physics UpDown Gain">
- Ganancia
- </string>
- <string name="Butt Physics UpDown Damping">
- Amortiguación
- </string>
- <string name="Butt Physics LeftRight Max Effect">
- Efecto máx.
- </string>
- <string name="Butt Physics LeftRight Spring">
- Elasticidad
- </string>
- <string name="Butt Physics LeftRight Gain">
- Ganancia
- </string>
- <string name="Butt Physics LeftRight Damping">
- Amortiguación
- </string>
- <string name="Bushy Eyebrows">
- Cejijuntas
- </string>
- <string name="Bushy Hair">
- Pelo tupido
- </string>
- <string name="Butt Size">
- Culo: tamaño
- </string>
- <string name="Butt Gravity">
- Gravedad del culo
- </string>
- <string name="bustle skirt">
- Polisón
- </string>
- <string name="no bustle">
- Sin polisón
- </string>
- <string name="more bustle">
- Con polisón
- </string>
- <string name="Chaplin">
- Cortito
- </string>
- <string name="Cheek Bones">
- Pómulos
- </string>
- <string name="Chest Size">
- Tórax: tamaño
- </string>
- <string name="Chin Angle">
- Barbilla: ángulo
- </string>
- <string name="Chin Cleft">
- Barbilla: contorno
- </string>
- <string name="Chin Curtains">
- Barba en collar
- </string>
- <string name="Chin Depth">
- Barbilla: largo
- </string>
- <string name="Chin Heavy">
- Hacia la barbilla
- </string>
- <string name="Chin In">
- Barbilla retraída
- </string>
- <string name="Chin Out">
- Barbilla prominente
- </string>
- <string name="Chin-Neck">
- Papada
- </string>
- <string name="Clear">
- Transparente
- </string>
- <string name="Cleft">
- Remarcar
- </string>
- <string name="Close Set Eyes">
- Ojos juntos
- </string>
- <string name="Closed">
- Cerrar
- </string>
- <string name="Closed Back">
- Trasera cerrada
- </string>
- <string name="Closed Front">
- Frontal cerrado
- </string>
- <string name="Closed Left">
- Cerrada
- </string>
- <string name="Closed Right">
- Cerrada
- </string>
- <string name="Coin Purse">
- Poco abultada
- </string>
- <string name="Collar Back">
- Espalda
- </string>
- <string name="Collar Front">
- Escote
- </string>
- <string name="Corner Down">
- Hacia abajo
- </string>
- <string name="Corner Up">
- Hacia arriba
- </string>
- <string name="Creased">
- Caídos
- </string>
- <string name="Crooked Nose">
- Nariz torcida
- </string>
- <string name="Cuff Flare">
- Acampanado
- </string>
- <string name="Dark">
- Oscuridad
- </string>
- <string name="Dark Green">
- Verde oscuro
- </string>
- <string name="Darker">
- Más oscuros
- </string>
- <string name="Deep">
- Remarcar
- </string>
- <string name="Default Heels">
- Tacones por defecto
- </string>
- <string name="Dense">
- Densas
- </string>
- <string name="Double Chin">
- Mucha papada
- </string>
- <string name="Downturned">
- Poco
- </string>
- <string name="Duffle Bag">
- Muy abultada
- </string>
- <string name="Ear Angle">
- Orejas: ángulo
- </string>
- <string name="Ear Size">
- Orejas: tamaño
- </string>
- <string name="Ear Tips">
- Orejas: forma
- </string>
- <string name="Egg Head">
- Cabeza: ahuevada
- </string>
- <string name="Eye Bags">
- Ojos: bolsas
- </string>
- <string name="Eye Color">
- Ojos: color
- </string>
- <string name="Eye Depth">
- Ojos: profundidad
- </string>
- <string name="Eye Lightness">
- Ojos: brillo
- </string>
- <string name="Eye Opening">
- Ojos: apertura
- </string>
- <string name="Eye Pop">
- Ojos: simetría
- </string>
- <string name="Eye Size">
- Ojos: tamaño
- </string>
- <string name="Eye Spacing">
- Ojos: separación
- </string>
- <string name="Eyebrow Arc">
- Cejas: arco
- </string>
- <string name="Eyebrow Density">
- Cejas: densidad
- </string>
- <string name="Eyebrow Height">
- Cejas: altura
- </string>
- <string name="Eyebrow Points">
- Cejas: en V
- </string>
- <string name="Eyebrow Size">
- Cejas: tamaño
- </string>
- <string name="Eyelash Length">
- Pestañas: longitud
- </string>
- <string name="Eyeliner">
- Contorno de ojos
- </string>
- <string name="Eyeliner Color">
- Contorno de ojos: color
- </string>
- <string name="Eyes Bugged">
- Eyes Bugged
- </string>
- <string name="Face Shear">
- Cara: simetría
- </string>
- <string name="Facial Definition">
- Rasgos marcados
- </string>
- <string name="Far Set Eyes">
- Ojos separados
- </string>
- <string name="Fat Lips">
- Prominentes
- </string>
- <string name="Female">
- Mujer
- </string>
- <string name="Fingerless">
- Sin dedos
- </string>
- <string name="Fingers">
- Con dedos
- </string>
- <string name="Flared Cuffs">
- Campana
- </string>
- <string name="Flat">
- Redondeadas
- </string>
- <string name="Flat Butt">
- Culo plano
- </string>
- <string name="Flat Head">
- Cabeza plana
- </string>
- <string name="Flat Toe">
- Empeine bajo
- </string>
- <string name="Foot Size">
- Pie: tamaño
- </string>
- <string name="Forehead Angle">
- Frente: ángulo
- </string>
- <string name="Forehead Heavy">
- Hacia la frente
- </string>
- <string name="Freckles">
- Pecas
- </string>
- <string name="Front Fringe">
- Flequillo
- </string>
- <string name="Full Back">
- Sin cortar
- </string>
- <string name="Full Eyeliner">
- Contorno completo
- </string>
- <string name="Full Front">
- Sin cortar
- </string>
- <string name="Full Hair Sides">
- Pelo: volumen a los lados
- </string>
- <string name="Full Sides">
- Volumen total
- </string>
- <string name="Glossy">
- Con brillo
- </string>
- <string name="Glove Fingers">
- Guantes: dedos
- </string>
- <string name="Glove Length">
- Guantes: largo
- </string>
- <string name="Hair">
- Pelo
- </string>
- <string name="Hair Back">
- Pelo: nuca
- </string>
- <string name="Hair Front">
- Pelo: delante
- </string>
- <string name="Hair Sides">
- Pelo: lados
- </string>
- <string name="Hair Sweep">
- Peinado: dirección
- </string>
- <string name="Hair Thickess">
- Pelo: espesor
- </string>
- <string name="Hair Thickness">
- Pelo: espesor
- </string>
- <string name="Hair Tilt">
- Pelo: inclinación
- </string>
- <string name="Hair Tilted Left">
- A la izq.
- </string>
- <string name="Hair Tilted Right">
- A la der.
- </string>
- <string name="Hair Volume">
- Pelo: volumen
- </string>
- <string name="Hand Size">
- Manos: tamaño
- </string>
- <string name="Handlebars">
- Muy largo
- </string>
- <string name="Head Length">
- Cabeza: longitud
- </string>
- <string name="Head Shape">
- Cabeza: forma
- </string>
- <string name="Head Size">
- Cabeza: tamaño
- </string>
- <string name="Head Stretch">
- Cabeza: estiramiento
- </string>
- <string name="Heel Height">
- Tacón: altura
- </string>
- <string name="Heel Shape">
- Tacón: forma
- </string>
- <string name="Height">
- Altura
- </string>
- <string name="High">
- Subir
- </string>
- <string name="High Heels">
- Tacones altos
- </string>
- <string name="High Jaw">
- Mandíbula alta
- </string>
- <string name="High Platforms">
- Suela gorda
- </string>
- <string name="High and Tight">
- Pegada
- </string>
- <string name="Higher">
- Arrriba
- </string>
- <string name="Hip Length">
- Cadera: altura
- </string>
- <string name="Hip Width">
- Cadera: ancho
- </string>
- <string name="In">
- Pegadas
- </string>
- <string name="In Shdw Color">
- Línea de ojos: color
- </string>
- <string name="In Shdw Opacity">
- Línea de ojos: opacidad
- </string>
- <string name="Inner Eye Corner">
- Ojos: lagrimal
- </string>
- <string name="Inner Eye Shadow">
- Inner Eye Shadow
- </string>
- <string name="Inner Shadow">
- Línea de ojos
- </string>
- <string name="Jacket Length">
- Chaqueta: largo
- </string>
- <string name="Jacket Wrinkles">
- Chaqueta: arrugas
- </string>
- <string name="Jaw Angle">
- Mandíbula: ángulo
- </string>
- <string name="Jaw Jut">
- Maxilar inferior
- </string>
- <string name="Jaw Shape">
- Mandíbula: forma
- </string>
- <string name="Join">
- Más junto
- </string>
- <string name="Jowls">
- Mofletes
- </string>
- <string name="Knee Angle">
- Rodillas: ángulo
- </string>
- <string name="Knock Kneed">
- Zambas
- </string>
- <string name="Large">
- Aumentar
- </string>
- <string name="Large Hands">
- Manos grandes
- </string>
- <string name="Left Part">
- Raya: izq.
- </string>
- <string name="Leg Length">
- Piernas: longitud
- </string>
- <string name="Leg Muscles">
- Piernas: musculatura
- </string>
- <string name="Less">
- Menos
- </string>
- <string name="Less Body Fat">
- Menos gordura
- </string>
- <string name="Less Curtains">
- Menos tupida
- </string>
- <string name="Less Freckles">
- Menos pecas
- </string>
- <string name="Less Full">
- Menos grosor
- </string>
- <string name="Less Gravity">
- Más levantado
- </string>
- <string name="Less Love">
- Menos michelines
- </string>
- <string name="Less Muscles">
- Pocos músculos
- </string>
- <string name="Less Muscular">
- Poca musculatura
- </string>
- <string name="Less Rosy">
- Menos sonrosada
- </string>
- <string name="Less Round">
- Menos redondeada
- </string>
- <string name="Less Saddle">
- Menos cartucheras
- </string>
- <string name="Less Square">
- Menos cuadrada
- </string>
- <string name="Less Volume">
- Menos volumen
- </string>
- <string name="Less soul">
- Pequeña
- </string>
- <string name="Lighter">
- Más luminosos
- </string>
- <string name="Lip Cleft">
- Labio: hoyuelo
- </string>
- <string name="Lip Cleft Depth">
- Hoyuelo marcado
- </string>
- <string name="Lip Fullness">
- Labios: grosor
- </string>
- <string name="Lip Pinkness">
- Labios sonrosados
- </string>
- <string name="Lip Ratio">
- Labios: ratio
- </string>
- <string name="Lip Thickness">
- Labios: prominencia
- </string>
- <string name="Lip Width">
- Labios: ancho
- </string>
- <string name="Lipgloss">
- Brillo de labios
- </string>
- <string name="Lipstick">
- Barra de labios
- </string>
- <string name="Lipstick Color">
- Barra de labios: color
- </string>
- <string name="Long">
- Más
- </string>
- <string name="Long Head">
- Cabeza alargada
- </string>
- <string name="Long Hips">
- Cadera larga
- </string>
- <string name="Long Legs">
- Piernas largas
- </string>
- <string name="Long Neck">
- Cuello largo
- </string>
- <string name="Long Pigtails">
- Coletas largas
- </string>
- <string name="Long Ponytail">
- Cola de caballo larga
- </string>
- <string name="Long Torso">
- Torso largo
- </string>
- <string name="Long arms">
- Brazos largos
- </string>
- <string name="Loose Pants">
- Pantalón suelto
- </string>
- <string name="Loose Shirt">
- Camiseta suelta
- </string>
- <string name="Loose Sleeves">
- Puños anchos
- </string>
- <string name="Love Handles">
- Michelines
- </string>
- <string name="Low">
- Bajar
- </string>
- <string name="Low Heels">
- Tacones bajos
- </string>
- <string name="Low Jaw">
- Mandíbula baja
- </string>
- <string name="Low Platforms">
- Suela fina
- </string>
- <string name="Low and Loose">
- Suelta
- </string>
- <string name="Lower">
- Abajo
- </string>
- <string name="Lower Bridge">
- Puente: abajo
- </string>
- <string name="Lower Cheeks">
- Mejillas: abajo
- </string>
- <string name="Male">
- Varón
- </string>
- <string name="Middle Part">
- Raya: en medio
- </string>
- <string name="More">
- Más
- </string>
- <string name="More Blush">
- Más colorete
- </string>
- <string name="More Body Fat">
- Más gordura
- </string>
- <string name="More Curtains">
- Más tupida
- </string>
- <string name="More Eyeshadow">
- Más
- </string>
- <string name="More Freckles">
- Más pecas
- </string>
- <string name="More Full">
- Más grosor
- </string>
- <string name="More Gravity">
- Menos levantado
- </string>
- <string name="More Lipstick">
- Más barra de labios
- </string>
- <string name="More Love">
- Más michelines
- </string>
- <string name="More Lower Lip">
- Más el inferior
- </string>
- <string name="More Muscles">
- Más músculos
- </string>
- <string name="More Muscular">
- Más musculatura
- </string>
- <string name="More Rosy">
- Más sonrosada
- </string>
- <string name="More Round">
- Más redondeada
- </string>
- <string name="More Saddle">
- Más cartucheras
- </string>
- <string name="More Sloped">
- Más inclinada
- </string>
- <string name="More Square">
- Más cuadrada
- </string>
- <string name="More Upper Lip">
- Más el superior
- </string>
- <string name="More Vertical">
- Más recta
- </string>
- <string name="More Volume">
- Más volumen
- </string>
- <string name="More soul">
- Grande
- </string>
- <string name="Moustache">
- Bigote
- </string>
- <string name="Mouth Corner">
- Comisuras
- </string>
- <string name="Mouth Position">
- Boca: posición
- </string>
- <string name="Mowhawk">
- Rapado
- </string>
- <string name="Muscular">
- Muscular
- </string>
- <string name="Mutton Chops">
- Patillas largas
- </string>
- <string name="Nail Polish">
- Uñas pintadas
- </string>
- <string name="Nail Polish Color">
- Uñas pintadas: color
- </string>
- <string name="Narrow">
- Disminuir
- </string>
- <string name="Narrow Back">
- Rapada
- </string>
- <string name="Narrow Front">
- Entradas
- </string>
- <string name="Narrow Lips">
- Labios estrechos
- </string>
- <string name="Natural">
- Natural
- </string>
- <string name="Neck Length">
- Cuello: longitud
- </string>
- <string name="Neck Thickness">
- Cuello: grosor
- </string>
- <string name="No Blush">
- Sin colorete
- </string>
- <string name="No Eyeliner">
- Sin contorno
- </string>
- <string name="No Eyeshadow">
- Menos
- </string>
- <string name="No Lipgloss">
- Sin brillo
- </string>
- <string name="No Lipstick">
- Sin barra de labios
- </string>
- <string name="No Part">
- Sin raya
- </string>
- <string name="No Polish">
- Sin pintar
- </string>
- <string name="No Red">
- Nada
- </string>
- <string name="No Spikes">
- Sin crestas
- </string>
- <string name="No White">
- Sin blanco
- </string>
- <string name="No Wrinkles">
- Sin arrugas
- </string>
- <string name="Normal Lower">
- Normal Lower
- </string>
- <string name="Normal Upper">
- Normal Upper
- </string>
- <string name="Nose Left">
- Nariz a la izq.
- </string>
- <string name="Nose Right">
- Nariz a la der.
- </string>
- <string name="Nose Size">
- Nariz: tamaño
- </string>
- <string name="Nose Thickness">
- Nariz: grosor
- </string>
- <string name="Nose Tip Angle">
- Nariz: respingona
- </string>
- <string name="Nose Tip Shape">
- Nariz: punta
- </string>
- <string name="Nose Width">
- Nariz: ancho
- </string>
- <string name="Nostril Division">
- Ventana: altura
- </string>
- <string name="Nostril Width">
- Ventana: ancho
- </string>
- <string name="Opaque">
- Opaco
- </string>
- <string name="Open">
- Abrir
- </string>
- <string name="Open Back">
- Apertura trasera
- </string>
- <string name="Open Front">
- Apertura frontal
- </string>
- <string name="Open Left">
- Abierta
- </string>
- <string name="Open Right">
- Abierta
- </string>
- <string name="Orange">
- Anaranjado
- </string>
- <string name="Out">
- De soplillo
- </string>
- <string name="Out Shdw Color">
- Sombra de ojos: color
- </string>
- <string name="Out Shdw Opacity">
- Sombra de ojos: opacidad
- </string>
- <string name="Outer Eye Corner">
- Ojos: comisura
- </string>
- <string name="Outer Eye Shadow">
- Outer Eye Shadow
- </string>
- <string name="Outer Shadow">
- Sombra de ojos
- </string>
- <string name="Overbite">
- Retraído
- </string>
- <string name="Package">
- Pubis
- </string>
- <string name="Painted Nails">
- Pintadas
- </string>
- <string name="Pale">
- Pálida
- </string>
- <string name="Pants Crotch">
- Pantalón: cruz
- </string>
- <string name="Pants Fit">
- Ceñido
- </string>
- <string name="Pants Length">
- Pernera: largo
- </string>
- <string name="Pants Waist">
- Caja
- </string>
- <string name="Pants Wrinkles">
- Pantalón: arrugas
- </string>
- <string name="Part">
- Raya
- </string>
- <string name="Part Bangs">
- Flequillo partido
- </string>
- <string name="Pectorals">
- Pectorales
- </string>
- <string name="Pigment">
- Tono
- </string>
- <string name="Pigtails">
- Coletas
- </string>
- <string name="Pink">
- Rosa
- </string>
- <string name="Pinker">
- Más sonrosados
- </string>
- <string name="Platform Height">
- Suela: altura
- </string>
- <string name="Platform Width">
- Suela: ancho
- </string>
- <string name="Pointy">
- En punta
- </string>
- <string name="Pointy Heels">
- De aguja
- </string>
- <string name="Ponytail">
- Cola de caballo
- </string>
- <string name="Poofy Skirt">
- Con vuelo
- </string>
- <string name="Pop Left Eye">
- Izquierdo más grande
- </string>
- <string name="Pop Right Eye">
- Derecho más grande
- </string>
- <string name="Puffy">
- Hinchadas
- </string>
- <string name="Puffy Eyelids">
- Ojeras
- </string>
- <string name="Rainbow Color">
- Irisación
- </string>
- <string name="Red Hair">
- Pelirrojo
- </string>
- <string name="Regular">
- Regular
- </string>
- <string name="Right Part">
- Raya: der.
- </string>
- <string name="Rosy Complexion">
- Tez sonrosada
- </string>
- <string name="Round">
- Redondear
- </string>
- <string name="Ruddiness">
- Rubicundez
- </string>
- <string name="Ruddy">
- Rojiza
- </string>
- <string name="Rumpled Hair">
- Pelo encrespado
- </string>
- <string name="Saddle Bags">
- Cartucheras
- </string>
- <string name="Scrawny Leg">
- Piernas flacas
- </string>
- <string name="Separate">
- Más ancho
- </string>
- <string name="Shallow">
- Sin marcar
- </string>
- <string name="Shear Back">
- Nuca: corte
- </string>
- <string name="Shear Face">
- Shear Face
- </string>
- <string name="Shear Front">
- Shear Front
- </string>
- <string name="Shear Left Up">
- Arriba - izq.
- </string>
- <string name="Shear Right Up">
- Arriba - der.
- </string>
- <string name="Sheared Back">
- Rapada
- </string>
- <string name="Sheared Front">
- Rapada
- </string>
- <string name="Shift Left">
- A la izq.
- </string>
- <string name="Shift Mouth">
- Boca: ladeada
- </string>
- <string name="Shift Right">
- A la der.
- </string>
- <string name="Shirt Bottom">
- Alto de cintura
- </string>
- <string name="Shirt Fit">
- Ceñido
- </string>
- <string name="Shirt Wrinkles">
- Camisa: arrugas
- </string>
- <string name="Shoe Height">
- Caña: altura
- </string>
- <string name="Short">
- Menos
- </string>
- <string name="Short Arms">
- Brazos cortos
- </string>
- <string name="Short Legs">
- Piernas cortas
- </string>
- <string name="Short Neck">
- Cuello corto
- </string>
- <string name="Short Pigtails">
- Coletas cortas
- </string>
- <string name="Short Ponytail">
- Cola de caballo corta
- </string>
- <string name="Short Sideburns">
- Patillas cortas
- </string>
- <string name="Short Torso">
- Torso corto
- </string>
- <string name="Short hips">
- Cadera corta
- </string>
- <string name="Shoulders">
- Hombros
- </string>
- <string name="Side Fringe">
- Lados: franja
- </string>
- <string name="Sideburns">
- Patillas
- </string>
- <string name="Sides Hair">
- Pelo: lados
- </string>
- <string name="Sides Hair Down">
- Bajar lados del pelo
- </string>
- <string name="Sides Hair Up">
- Subir lados del pelo
- </string>
- <string name="Skinny Neck">
- Cuello estrecho
- </string>
- <string name="Skirt Fit">
- Falda: vuelo
- </string>
- <string name="Skirt Length">
- Falda: largo
- </string>
- <string name="Slanted Forehead">
- Slanted Forehead
- </string>
- <string name="Sleeve Length">
- Largo de manga
- </string>
- <string name="Sleeve Looseness">
- Ancho de puños
- </string>
- <string name="Slit Back">
- Raja trasera
- </string>
- <string name="Slit Front">
- Raja frontal
- </string>
- <string name="Slit Left">
- Raja a la izq.
- </string>
- <string name="Slit Right">
- Raja a la der.
- </string>
- <string name="Small">
- Disminuir
- </string>
- <string name="Small Hands">
- Manos pequeñas
- </string>
- <string name="Small Head">
- Cabeza pequeña
- </string>
- <string name="Smooth">
- Leves
- </string>
- <string name="Smooth Hair">
- Pelo liso
- </string>
- <string name="Socks Length">
- Calcetines: largo
- </string>
- <string name="Soulpatch">
- Perilla
- </string>
- <string name="Sparse">
- Depiladas
- </string>
- <string name="Spiked Hair">
- Crestas
- </string>
- <string name="Square">
- Cuadrada
- </string>
- <string name="Square Toe">
- Punta cuadrada
- </string>
- <string name="Squash Head">
- Cabeza aplastada
- </string>
- <string name="Stretch Head">
- Cabeza estirada
- </string>
- <string name="Sunken">
- Chupadas
- </string>
- <string name="Sunken Chest">
- Estrecho de pecho
- </string>
- <string name="Sunken Eyes">
- Ojos hundidos
- </string>
- <string name="Sweep Back">
- Sweep Back
- </string>
- <string name="Sweep Forward">
- Sweep Forward
- </string>
- <string name="Tall">
- Más
- </string>
- <string name="Taper Back">
- Cubierta trasera
- </string>
- <string name="Taper Front">
- Cubierta frontal
- </string>
- <string name="Thick Heels">
- Tacones grandes
- </string>
- <string name="Thick Neck">
- Cuello ancho
- </string>
- <string name="Thick Toe">
- Empeine alto
- </string>
- <string name="Thin">
- Delgadas
- </string>
- <string name="Thin Eyebrows">
- Cejas finas
- </string>
- <string name="Thin Lips">
- Hacia dentro
- </string>
- <string name="Thin Nose">
- Nariz fina
- </string>
- <string name="Tight Chin">
- Poca papada
- </string>
- <string name="Tight Cuffs">
- Sin campana
- </string>
- <string name="Tight Pants">
- Pantalón ceñido
- </string>
- <string name="Tight Shirt">
- Camisa ceñida
- </string>
- <string name="Tight Skirt">
- Falda ceñida
- </string>
- <string name="Tight Sleeves">
- Puños ceñidos
- </string>
- <string name="Toe Shape">
- Punta: forma
- </string>
- <string name="Toe Thickness">
- Empeine
- </string>
- <string name="Torso Length">
- Torso: longitud
- </string>
- <string name="Torso Muscles">
- Torso: musculatura
- </string>
- <string name="Torso Scrawny">
- Torso flacucho
- </string>
- <string name="Unattached">
- Largos
- </string>
- <string name="Uncreased">
- Abiertos
- </string>
- <string name="Underbite">
- Prognatismo
- </string>
- <string name="Unnatural">
- No natural
- </string>
- <string name="Upper Bridge">
- Puente: arriba
- </string>
- <string name="Upper Cheeks">
- Mejillas: arriba
- </string>
- <string name="Upper Chin Cleft">
- Barbilla: prominencia
- </string>
- <string name="Upper Eyelid Fold">
- Párpados
- </string>
- <string name="Upturned">
- Mucho
- </string>
- <string name="Very Red">
- Del todo
- </string>
- <string name="Waist Height">
- Cintura
- </string>
- <string name="Well-Fed">
- Mofletes
- </string>
- <string name="White Hair">
- Pelo blanco
- </string>
- <string name="Wide">
- Aumentar
- </string>
- <string name="Wide Back">
- Completa
- </string>
- <string name="Wide Front">
- Completa
- </string>
- <string name="Wide Lips">
- Labios anchos
- </string>
- <string name="Wild">
- Total
- </string>
- <string name="Wrinkles">
- Arrugas
- </string>
- <string name="LocationCtrlAddLandmarkTooltip">
- Añadir a mis hitos
- </string>
- <string name="LocationCtrlEditLandmarkTooltip">
- Editar mis hitos
- </string>
- <string name="LocationCtrlInfoBtnTooltip">
- Ver más información de esta localización
- </string>
- <string name="LocationCtrlComboBtnTooltip">
- Historial de mis localizaciones
- </string>
- <string name="LocationCtrlAdultIconTooltip">
- Región Adulta
- </string>
- <string name="LocationCtrlModerateIconTooltip">
- Región Moderada
- </string>
- <string name="LocationCtrlGeneralIconTooltip">
- Región General
- </string>
- <string name="UpdaterWindowTitle">
- Actualizar [APP_NAME]
- </string>
- <string name="UpdaterNowUpdating">
- Actualizando [APP_NAME]...
- </string>
- <string name="UpdaterNowInstalling">
- Instalando [APP_NAME]...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- Descargando la actualización...
- </string>
- <string name="UpdaterProgressBarText">
- Descargando la actualización
- </string>
- <string name="UpdaterFailDownloadTitle">
- Fallo en la descarga de la actualización
- </string>
- <string name="UpdaterFailUpdateDescriptive">
- Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
- </string>
- <string name="UpdaterFailInstallTitle">
- Fallo al instalar la actualización
- </string>
- <string name="UpdaterFailStartTitle">
- Fallo al iniciar el visor
- </string>
- <string name="ItemsComingInTooFastFrom">
- [APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
- </string>
- <string name="ItemsComingInTooFast">
- [APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
- </string>
- <string name="IM_logging_string">
- -- Activado el registro de los mensajes instantáneos --
- </string>
- <string name="IM_typing_start_string">
- [NAME] está escribiendo...
- </string>
- <string name="Unnamed">
- (sin nombre)
- </string>
- <string name="IM_moderated_chat_label">
- (Moderado: por defecto, desactivada la voz)
- </string>
- <string name="IM_unavailable_text_label">
- Para esta llamada no está disponible el chat de texto.
- </string>
- <string name="IM_muted_text_label">
- Un moderador del grupo ha desactivado tu chat de texto.
- </string>
- <string name="IM_default_text_label">
- Pulsa aquí para enviar un mensaje instantáneo.
- </string>
- <string name="IM_to_label">
- A
- </string>
- <string name="IM_moderator_label">
- (Moderador)
- </string>
- <string name="Saved_message">
- (Guardado [LONG_TIMESTAMP])
- </string>
- <string name="answered_call">
- Han respondido a tu llamada
- </string>
- <string name="you_started_call">
- Has iniciado una llamada de voz
- </string>
- <string name="you_joined_call">
- Has entrado en la llamada de voz
- </string>
- <string name="name_started_call">
- [NAME] inició una llamada de voz
- </string>
- <string name="ringing-im">
- Haciendo la llamada de voz...
- </string>
- <string name="connected-im">
- Conectado, pulsa Colgar para salir
- </string>
- <string name="hang_up-im">
- Se colgó la llamada de voz
- </string>
- <string name="conference-title-incoming">
- Conferencia con [AGENT_NAME]
- </string>
- <string name="inventory_item_offered-im">
- Ofrecido el item del inventario
- </string>
- <string name="no_session_message">
- (La sesión de MI no existe)
- </string>
- <string name="only_user_message">
- Usted es el único usuario en esta sesión.
- </string>
- <string name="offline_message">
- [NAME] está desconectado.
- </string>
- <string name="invite_message">
- Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
- </string>
- <string name="muted_message">
- Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
- </string>
- <string name="generic">
- Error en lo solicitado, por favor, inténtalo más tarde.
- </string>
- <string name="generic_request_error">
- Error al hacer lo solicitado; por favor, inténtelo más tarde.
- </string>
- <string name="insufficient_perms_error">
- Usted no tiene permisos suficientes.
- </string>
- <string name="session_does_not_exist_error">
- La sesión ya acabó
- </string>
- <string name="no_ability_error">
- Usted no tiene esa capacidad.
- </string>
- <string name="no_ability">
- Usted no tiene esa capacidad.
- </string>
- <string name="not_a_mod_error">
- Usted no es un moderador de la sesión.
- </string>
- <string name="muted">
- Un moderador del grupo ha desactivado tu chat de texto.
- </string>
- <string name="muted_error">
- Un moderador del grupo le ha desactivado el chat de texto.
- </string>
- <string name="add_session_event">
- No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
- </string>
- <string name="message">
- No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
- </string>
- <string name="message_session_event">
- No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
- </string>
- <string name="mute">
- Error moderando.
- </string>
- <string name="removed">
- Se te ha sacado del grupo.
- </string>
- <string name="removed_from_group">
- Ha sido eliminado del grupo.
- </string>
- <string name="close_on_no_ability">
- Usted ya no tendrá más la capacidad de estar en la sesión de chat.
- </string>
- <string name="unread_chat_single">
- [SOURCES] ha dicho algo nuevo
- </string>
- <string name="unread_chat_multiple">
- [SOURCES] ha dicho algo nuevo
- </string>
- <string name="session_initialization_timed_out_error">
- Se ha agotado el tiempo del inicio de sesión
- </string>
- <string name="voice_morphing_url">
- http://secondlife.com/landing/voicemorphing
- </string>
- <string name="paid_you_ldollars">
- [NAME] te ha pagado [AMOUNT] L$ [REASON].
- </string>
- <string name="paid_you_ldollars_no_reason">
- [NAME] te ha pagado [AMOUNT] L$.
- </string>
- <string name="you_paid_ldollars">
- Has pagado [AMOUNT] L$ a [NAME] por [REASON].
- </string>
- <string name="you_paid_ldollars_no_info">
- Has pagado[AMOUNT] L$
- </string>
- <string name="you_paid_ldollars_no_reason">
- Has pagado [AMOUNT] L$ a [NAME].
- </string>
- <string name="you_paid_ldollars_no_name">
- Has pagado [AMOUNT] L$ por [REASON].
- </string>
- <string name="for item">
- para [ITEM]
- </string>
- <string name="for a parcel of land">
- para una parcela de terreno
- </string>
- <string name="for a land access pass">
- para un pase de acceso a terrenos
- </string>
- <string name="for deeding land">
- for deeding land
- </string>
- <string name="to create a group">
- para crear un grupo
- </string>
- <string name="to join a group">
- para entrar a un grupo
- </string>
- <string name="to upload">
- to upload
- </string>
- <string name="to publish a classified ad">
- para publicar un anuncio clasificado
- </string>
- <string name="giving">
- Dando [AMOUNT] L$
- </string>
- <string name="uploading_costs">
- Subir esto cuesta [AMOUNT] L$
- </string>
- <string name="this_costs">
- Esto cuesta [AMOUNT] L$
- </string>
- <string name="buying_selected_land">
- Compra del terreno seleccionado por [AMOUNT] L$
- </string>
- <string name="this_object_costs">
- Este objeto cuesta [AMOUNT] L$
- </string>
- <string name="group_role_everyone">
- Todos
- </string>
- <string name="group_role_officers">
- Oficiales
- </string>
- <string name="group_role_owners">
- Propietarios
- </string>
- <string name="group_member_status_online">
- Conectado/a
- </string>
- <string name="uploading_abuse_report">
- Subiendo...
-
-Denuncia de infracción
- </string>
- <string name="New Shape">
- Anatomía nueva
- </string>
- <string name="New Skin">
- Piel nueva
- </string>
- <string name="New Hair">
- Pelo nuevo
- </string>
- <string name="New Eyes">
- Ojos nuevos
- </string>
- <string name="New Shirt">
- Camisa nueva
- </string>
- <string name="New Pants">
- Pantalón nuevo
- </string>
- <string name="New Shoes">
- Zapatos nuevos
- </string>
- <string name="New Socks">
- Calcetines nuevos
- </string>
- <string name="New Jacket">
- Chaqueta nueva
- </string>
- <string name="New Gloves">
- Guantes nuevos
- </string>
- <string name="New Undershirt">
- Camiseta nueva
- </string>
- <string name="New Underpants">
- Ropa interior nueva
- </string>
- <string name="New Skirt">
- Falda nueva
- </string>
- <string name="New Alpha">
- Nueva Alfa
- </string>
- <string name="New Tattoo">
- Tatuaje nuevo
- </string>
- <string name="New Physics">
- Nueva física
- </string>
- <string name="Invalid Wearable">
- No se puede poner
- </string>
- <string name="New Gesture">
- Gesto nuevo
- </string>
- <string name="New Script">
- Script nuevo
- </string>
- <string name="New Note">
- Nota nueva
- </string>
- <string name="New Folder">
- Carpeta nueva
- </string>
- <string name="Contents">
- Contenidos
- </string>
- <string name="Gesture">
- Gestos
- </string>
- <string name="Male Gestures">
- Gestos de hombre
- </string>
- <string name="Female Gestures">
- Gestos de mujer
- </string>
- <string name="Other Gestures">
- Otros gestos
- </string>
- <string name="Speech Gestures">
- Gestos al hablar
- </string>
- <string name="Common Gestures">
- Gestos corrientes
- </string>
- <string name="Male - Excuse me">
- Varón - Disculpa
- </string>
- <string name="Male - Get lost">
- Varón – Déjame en paz
- </string>
- <string name="Male - Blow kiss">
- Varón - Lanzar un beso
- </string>
- <string name="Male - Boo">
- Varón - Abucheo
- </string>
- <string name="Male - Bored">
- Varón - Aburrido
- </string>
- <string name="Male - Hey">
- Varón – ¡Eh!
- </string>
- <string name="Male - Laugh">
- Varón - Risa
- </string>
- <string name="Male - Repulsed">
- Varón - Rechazo
- </string>
- <string name="Male - Shrug">
- Varón - Encogimiento de hombros
- </string>
- <string name="Male - Stick tougue out">
- Varón - Sacando la lengua
- </string>
- <string name="Male - Wow">
- Varón - Admiración
- </string>
- <string name="Female - Chuckle">
- Mujer - Risa suave
- </string>
- <string name="Female - Cry">
- Mujer - Llorar
- </string>
- <string name="Female - Embarrassed">
- Mujer - Ruborizada
- </string>
- <string name="Female - Excuse me">
- Mujer - Disculpa
- </string>
- <string name="Female - Get lost">
- Mujer – Déjame en paz
- </string>
- <string name="Female - Blow kiss">
- Mujer - Lanzar un beso
- </string>
- <string name="Female - Boo">
- Mujer - Abucheo
- </string>
- <string name="Female - Bored">
- Mujer - Aburrida
- </string>
- <string name="Female - Hey">
- Mujer - ¡Eh!
- </string>
- <string name="Female - Hey baby">
- Mujer - ¡Eh, encanto!
- </string>
- <string name="Female - Laugh">
- Mujer - Risa
- </string>
- <string name="Female - Looking good">
- Mujer - Buen aspecto
- </string>
- <string name="Female - Over here">
- Mujer - Por aquí
- </string>
- <string name="Female - Please">
- Mujer - Por favor
- </string>
- <string name="Female - Repulsed">
- Mujer - Rechazo
- </string>
- <string name="Female - Shrug">
- Mujer - Encogimiento de hombros
- </string>
- <string name="Female - Stick tougue out">
- Mujer - Sacando la lengua
- </string>
- <string name="Female - Wow">
- Mujer - Admiración
- </string>
- <string name="AvatarBirthDateFormat">
- [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
- </string>
- <string name="DefaultMimeType">
- ninguno/ninguno
- </string>
- <string name="texture_load_dimensions_error">
- No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
- </string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">
- Parece que hay algún problema que ha escapado a nuestros controles.
-
- Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
- Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
- </string>
- <string name="dateTimeWeekdaysNames">
- Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
- </string>
- <string name="dateTimeWeekdaysShortNames">
- Dom:Lun:Mar:Mié:Jue:Vie:Sáb
- </string>
- <string name="dateTimeMonthNames">
- Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
- </string>
- <string name="dateTimeMonthShortNames">
- Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
- </string>
- <string name="dateTimeDayFormat">
- [MDAY]
- </string>
- <string name="dateTimeAM">
- AM
- </string>
- <string name="dateTimePM">
- PM
- </string>
- <string name="LocalEstimateUSD">
- [AMOUNT] US$
- </string>
- <string name="Membership">
- Membresía
- </string>
- <string name="Roles">
- Roles
- </string>
- <string name="Group Identity">
- Indentidad de grupo
- </string>
- <string name="Parcel Management">
- Gestión de la parcela
- </string>
- <string name="Parcel Identity">
- Identidad de la parcela
- </string>
- <string name="Parcel Settings">
- Configuración de la parcela
- </string>
- <string name="Parcel Powers">
- Poder de la parcela
- </string>
- <string name="Parcel Access">
- Acceso a la parcela
- </string>
- <string name="Parcel Content">
- Contenido de la parcela
- </string>
- <string name="Object Management">
- Manejo de objetos
- </string>
- <string name="Accounting">
- Contabilidad
- </string>
- <string name="Notices">
- Avisos
- </string>
- <string name="Chat" value="Chat :">
- Chat
- </string>
- <string name="DeleteItems">
- ¿Deseas eliminar los elementos seleccionados?
- </string>
- <string name="DeleteItem">
- ¿Deseas eliminar el elemento seleccionado?
- </string>
- <string name="EmptyOutfitText">
- No hay elementos en este vestuario
- </string>
- <string name="ExternalEditorNotSet">
- Selecciona un editor mediante la configuración de ExternalEditor.
- </string>
- <string name="ExternalEditorNotFound">
- No se encuentra el editor externo especificado.
-Inténtalo incluyendo la ruta de acceso al editor entre comillas
-(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).
- </string>
- <string name="ExternalEditorCommandParseError">
- Error al analizar el comando de editor externo.
- </string>
- <string name="ExternalEditorFailedToRun">
- Error al ejecutar el editor externo.
- </string>
- <string name="Esc">
- Esc
- </string>
- <string name="Space">
- Space
- </string>
- <string name="Enter">
- Enter
- </string>
- <string name="Tab">
- Tab
- </string>
- <string name="Ins">
- Ins
- </string>
- <string name="Del">
- Del
- </string>
- <string name="Backsp">
- Backsp
- </string>
- <string name="Shift">
- Shift
- </string>
- <string name="Ctrl">
- Ctrl
- </string>
- <string name="Alt">
- Alt
- </string>
- <string name="CapsLock">
- CapsLock
- </string>
- <string name="Home">
- Base
- </string>
- <string name="End">
- End
- </string>
- <string name="PgUp">
- PgUp
- </string>
- <string name="PgDn">
- PgDn
- </string>
- <string name="F1">
- F1
- </string>
- <string name="F2">
- F2
- </string>
- <string name="F3">
- F3
- </string>
- <string name="F4">
- F4
- </string>
- <string name="F5">
- F5
- </string>
- <string name="F6">
- F6
- </string>
- <string name="F7">
- F7
- </string>
- <string name="F8">
- F8
- </string>
- <string name="F9">
- F9
- </string>
- <string name="F10">
- F10
- </string>
- <string name="F11">
- F11
- </string>
- <string name="F12">
- F12
- </string>
- <string name="Add">
- Añadir
- </string>
- <string name="Subtract">
- Restar
- </string>
- <string name="Multiply">
- Multiplicar
- </string>
- <string name="Divide">
- Dividir
- </string>
- <string name="PAD_DIVIDE">
- PAD_DIVIDE
- </string>
- <string name="PAD_LEFT">
- PAD_LEFT
- </string>
- <string name="PAD_RIGHT">
- PAD_RIGHT
- </string>
- <string name="PAD_DOWN">
- PAD_DOWN
- </string>
- <string name="PAD_UP">
- PAD_UP
- </string>
- <string name="PAD_HOME">
- PAD_HOME
- </string>
- <string name="PAD_END">
- PAD_END
- </string>
- <string name="PAD_PGUP">
- PAD_PGUP
- </string>
- <string name="PAD_PGDN">
- PAD_PGDN
- </string>
- <string name="PAD_CENTER">
- PAD_CENTER
- </string>
- <string name="PAD_INS">
- PAD_INS
- </string>
- <string name="PAD_DEL">
- PAD_DEL
- </string>
- <string name="PAD_Enter">
- PAD_Enter
- </string>
- <string name="PAD_BUTTON0">
- PAD_BUTTON0
- </string>
- <string name="PAD_BUTTON1">
- PAD_BUTTON1
- </string>
- <string name="PAD_BUTTON2">
- PAD_BUTTON2
- </string>
- <string name="PAD_BUTTON3">
- PAD_BUTTON3
- </string>
- <string name="PAD_BUTTON4">
- PAD_BUTTON4
- </string>
- <string name="PAD_BUTTON5">
- PAD_BUTTON5
- </string>
- <string name="PAD_BUTTON6">
- PAD_BUTTON6
- </string>
- <string name="PAD_BUTTON7">
- PAD_BUTTON7
- </string>
- <string name="PAD_BUTTON8">
- PAD_BUTTON8
- </string>
- <string name="PAD_BUTTON9">
- PAD_BUTTON9
- </string>
- <string name="PAD_BUTTON10">
- PAD_BUTTON10
- </string>
- <string name="PAD_BUTTON11">
- PAD_BUTTON11
- </string>
- <string name="PAD_BUTTON12">
- PAD_BUTTON12
- </string>
- <string name="PAD_BUTTON13">
- PAD_BUTTON13
- </string>
- <string name="PAD_BUTTON14">
- PAD_BUTTON14
- </string>
- <string name="PAD_BUTTON15">
- PAD_BUTTON15
- </string>
- <string name="-">
- -
- </string>
- <string name="=">
- =
- </string>
- <string name="`">
- `
- </string>
- <string name=";">
- ;
- </string>
- <string name="[">
- [
- </string>
- <string name="]">
- ]
- </string>
- <string name="\">
- \
- </string>
- <string name="0">
- 0
- </string>
- <string name="1">
- 1
- </string>
- <string name="2">
- 2
- </string>
- <string name="3">
- 3
- </string>
- <string name="4">
- 4
- </string>
- <string name="5">
- 5
- </string>
- <string name="6">
- 6
- </string>
- <string name="7">
- 7
- </string>
- <string name="8">
- 8
- </string>
- <string name="9">
- 9
- </string>
- <string name="A">
- A
- </string>
- <string name="B">
- B
- </string>
- <string name="C">
- C
- </string>
- <string name="D">
- D
- </string>
- <string name="E">
- E
- </string>
- <string name="F">
- F
- </string>
- <string name="G">
- G
- </string>
- <string name="H">
- H
- </string>
- <string name="I">
- I
- </string>
- <string name="J">
- J
- </string>
- <string name="K">
- K
- </string>
- <string name="L">
- L
- </string>
- <string name="M">
- M
- </string>
- <string name="N">
- N
- </string>
- <string name="O">
- O
- </string>
- <string name="P">
- P
- </string>
- <string name="Q">
- Q
- </string>
- <string name="R">
- R
- </string>
- <string name="S">
- S
- </string>
- <string name="T">
- T
- </string>
- <string name="U">
- U
- </string>
- <string name="V">
- V
- </string>
- <string name="W">
- W
- </string>
- <string name="X">
- X
- </string>
- <string name="Y">
- Y
- </string>
- <string name="Z">
- Z
- </string>
- <string name="BeaconParticle">
- Viendo balizas de partículas (azules)
- </string>
- <string name="BeaconPhysical">
- Viendo balizas de objetos materiales (verdes)
- </string>
- <string name="BeaconScripted">
- Viendo balizas de objetos con script (rojas)
- </string>
- <string name="BeaconScriptedTouch">
- Viendo el objeto con script con balizas de función táctil (rojas)
- </string>
- <string name="BeaconSound">
- Viendo balizas de sonido (amarillas)
- </string>
- <string name="BeaconMedia">
- Viendo balizas de medios (blancas)
- </string>
- <string name="ParticleHiding">
- Ocultando las partículas
- </string>
-</strings>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal de Soporte de Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Identificando el hardware...
+ </string>
+ <string name="StartupLoading">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Limpiando la caché...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Iniciando la caché de las texturas...
+ </string>
+ <string name="StartupInitializingVFS">
+ Iniciando VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Restaurando...
+ </string>
+ <string name="ProgressChangingResolution">
+ Cambiando la resolución...
+ </string>
+ <string name="LoginInProgress">
+ Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Iniciando la sesión...
+ </string>
+ <string name="LoginAuthenticating">
+ Autenticando
+ </string>
+ <string name="LoginMaintenance">
+ Realizando el mantenimiento de la cuenta...
+ </string>
+ <string name="LoginAttempt">
+ Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Cargando el mundo...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Iniciando el navegador web incorporado...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Iniciando multimedia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Cargando las fuentes...
+ </string>
+ <string name="LoginVerifyingCache">
+ Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Procesando la respuesta...
+ </string>
+ <string name="LoginInitializingWorld">
+ Iniciando el mundo...
+ </string>
+ <string name="LoginDecodingImages">
+ Decodificando las imágenes...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Iniciando QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ No se ha encontrado QuickTime. Imposible iniciarlo.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime se ha iniciado adecuadamente.
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Esperando la conexión con la región...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Conectando con la región...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Descargando la ropa...
+ </string>
+ <string name="InvalidCertificate">
+ El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertInvalidHostname">
+ El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.
+ </string>
+ <string name="CertExpired">
+ Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.
+ </string>
+ <string name="CertKeyUsage">
+ El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertBasicConstraints">
+ La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertInvalidSignature">
+ No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet.
+ </string>
+ <string name="LoginFailed">
+ Error en el inicio de sesión.
+ </string>
+ <string name="Quit">
+ Salir
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=es-ES
+ </string>
+ <string name="AgentLostConnection">
+ Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
+ </string>
+ <string name="SavingSettings">
+ Guardando tus configuraciones...
+ </string>
+ <string name="LoggingOut">
+ Cerrando sesión...
+ </string>
+ <string name="ShuttingDown">
+ Cerrando...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Has sido desconectado de la región en la que estabas.
+ </string>
+ <string name="SentToInvalidRegion">
+ Has sido enviado a una región no válida.
+ </string>
+ <string name="TestingDisconnect">
+ Probando la desconexión del visor
+ </string>
+ <string name="TooltipPerson">
+ Persona
+ </string>
+ <string name="TooltipNoName">
+ (sin nombre)
+ </string>
+ <string name="TooltipOwner">
+ Propietario:
+ </string>
+ <string name="TooltipPublic">
+ Público
+ </string>
+ <string name="TooltipIsGroup">
+ (Grupo)
+ </string>
+ <string name="TooltipForSaleL$">
+ En venta: [AMOUNT] L$
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Construir el grupo
+ </string>
+ <string name="TooltipFlagNoBuild">
+ No construir
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Construir el grupo
+ </string>
+ <string name="TooltipFlagNotSafe">
+ No seguro
+ </string>
+ <string name="TooltipFlagNoFly">
+ No volar
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Scripts el grupo
+ </string>
+ <string name="TooltipFlagNoScripts">
+ No scripts
+ </string>
+ <string name="TooltipLand">
+ Terreno:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Aquí se puede arrastrar sólo un ítem
+ </string>
+ <string name="TooltipPrice" value="[AMOUNT] L$:"/>
+ <string name="TooltipHttpUrl">
+ Pulsa para ver esta página web
+ </string>
+ <string name="TooltipSLURL">
+ Pulsa para ver la información de este lugar
+ </string>
+ <string name="TooltipAgentUrl">
+ Pulsa para ver el perfil del Residente
+ </string>
+ <string name="TooltipAgentInspect">
+ Obtén más información acerca de este residente.
+ </string>
+ <string name="TooltipAgentMute">
+ Pulsa para silenciar a este Residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Pulsa para quitar el silencio a este Residente
+ </string>
+ <string name="TooltipAgentIM">
+ Pulsa para enviar un MI a este Residente
+ </string>
+ <string name="TooltipAgentPay">
+ Pulsa para pagar a este Residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Pulsa para enviar una petición de teleporte a este Residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Pulsa para enviar una petición de amistad a este Residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Pulsa para ver la descripción de este grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Pulsa para ver la descripción de este evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Pulsa para ver este clasificado
+ </string>
+ <string name="TooltipParcelUrl">
+ Pulsa para ver la descripción de esta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Pulsa para teleportarte a esta posición
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Pulsa para ver la descripción de este objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Pulsa para ver en el mapa esta localización
+ </string>
+ <string name="TooltipSLAPP">
+ Pulsa para ejecutar el comando secondlife://
+ </string>
+ <string name="CurrentURL" value="URL actual: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleportarse a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrarla en el mapa
+ </string>
+ <string name="SLappAgentMute">
+ Silenciar
+ </string>
+ <string name="SLappAgentUnmute">
+ Quitar el silencio
+ </string>
+ <string name="SLappAgentIM">
+ MI
+ </string>
+ <string name="SLappAgentPay">
+ Pagar
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Ofrecer teleporte a
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Petición de amistad
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Cerrar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Cerrar (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Cerrar
+ </string>
+ <string name="BUTTON_RESTORE">
+ Maximizar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar la ventana
+ </string>
+ <string name="BUTTON_DOCK">
+ Fijar
+ </string>
+ <string name="BUTTON_HELP">
+ Ver la Ayuda
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ No se ha encontrado.
+ </string>
+ <string name="RetrievingData">
+ Reintentando...
+ </string>
+ <string name="ReleaseNotes">
+ Notas de la versión
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL">
+ http://wiki.secondlife.com/wiki/Release_Notes/
+ </string>
+ <string name="LoadingData">
+ Cargando...
+ </string>
+ <string name="AvatarNameNobody">
+ (nadie)
+ </string>
+ <string name="AvatarNameWaiting">
+ (esperando)
+ </string>
+ <string name="GroupNameNone">
+ (ninguno)
+ </string>
+ <string name="AvalineCaller">
+ Avaline: [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ No hay ningún error
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Petición de asset: fallida
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Petición de asset: el archivo no existe
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Petición de asset: no se encontró el asset en la base de datos
+ </string>
+ <string name="AssetErrorEOF">
+ Fin del archivo
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ No puede abrirse el archivo
+ </string>
+ <string name="AssetErrorFileNotFound">
+ No se ha encontrado el archivo
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Tiempo de transferencia del archivo
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuito desconectado
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ No concuerda el precio en el visor y en el servidor
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Estado desconocido
+ </string>
+ <string name="texture">
+ la textura
+ </string>
+ <string name="sound">
+ el sonido
+ </string>
+ <string name="calling card">
+ la tarjeta de visita
+ </string>
+ <string name="landmark">
+ el hito
+ </string>
+ <string name="legacy script">
+ el script antiguo
+ </string>
+ <string name="clothing">
+ esa ropa
+ </string>
+ <string name="object">
+ el objeto
+ </string>
+ <string name="note card">
+ la nota
+ </string>
+ <string name="folder">
+ la carpeta
+ </string>
+ <string name="root">
+ la ruta
+ </string>
+ <string name="lsl2 script">
+ ese script de LSL2
+ </string>
+ <string name="lsl bytecode">
+ el código intermedio de LSL
+ </string>
+ <string name="tga texture">
+ esa textura tga
+ </string>
+ <string name="body part">
+ esa parte del cuerpo
+ </string>
+ <string name="snapshot">
+ la foto
+ </string>
+ <string name="lost and found">
+ Objetos Perdidos
+ </string>
+ <string name="targa image">
+ esa imagen targa
+ </string>
+ <string name="trash">
+ la Papelera
+ </string>
+ <string name="jpeg image">
+ esa imagen jpeg
+ </string>
+ <string name="animation">
+ la animación
+ </string>
+ <string name="gesture">
+ el gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ ese favorito
+ </string>
+ <string name="symbolic link">
+ el enlace
+ </string>
+ <string name="symbolic folder link">
+ enlace de la carpeta
+ </string>
+ <string name="AvatarAway">
+ Ausente
+ </string>
+ <string name="AvatarBusy">
+ Ocupado
+ </string>
+ <string name="AvatarMuted">
+ Ignorado
+ </string>
+ <string name="anim_express_afraid">
+ Susto
+ </string>
+ <string name="anim_express_anger">
+ Enfado
+ </string>
+ <string name="anim_away">
+ Ausente
+ </string>
+ <string name="anim_backflip">
+ Salto mortal atrás
+ </string>
+ <string name="anim_express_laugh">
+ Carcajada
+ </string>
+ <string name="anim_express_toothsmile">
+ Gran sonrisa
+ </string>
+ <string name="anim_blowkiss">
+ Mandar un beso
+ </string>
+ <string name="anim_express_bored">
+ Aburrimiento
+ </string>
+ <string name="anim_bow">
+ Reverencia
+ </string>
+ <string name="anim_clap">
+ Aplauso
+ </string>
+ <string name="anim_courtbow">
+ Reverencia floreada
+ </string>
+ <string name="anim_express_cry">
+ Llanto
+ </string>
+ <string name="anim_dance1">
+ Baile 1
+ </string>
+ <string name="anim_dance2">
+ Baile 2
+ </string>
+ <string name="anim_dance3">
+ Baile 3
+ </string>
+ <string name="anim_dance4">
+ Baile 4
+ </string>
+ <string name="anim_dance5">
+ Baile 5
+ </string>
+ <string name="anim_dance6">
+ Baile 6
+ </string>
+ <string name="anim_dance7">
+ Baile 7
+ </string>
+ <string name="anim_dance8">
+ Baile 8
+ </string>
+ <string name="anim_express_disdain">
+ Desdén
+ </string>
+ <string name="anim_drink">
+ Beber
+ </string>
+ <string name="anim_express_embarrased">
+ Azorarse
+ </string>
+ <string name="anim_angry_fingerwag">
+ Negar con el dedo
+ </string>
+ <string name="anim_fist_pump">
+ Éxito con el puño
+ </string>
+ <string name="anim_yoga_float">
+ Yoga flotando
+ </string>
+ <string name="anim_express_frown">
+ Fruncir el ceño
+ </string>
+ <string name="anim_impatient">
+ Impaciente
+ </string>
+ <string name="anim_jumpforjoy">
+ Salto de alegría
+ </string>
+ <string name="anim_kissmybutt">
+ Bésame el culo
+ </string>
+ <string name="anim_express_kiss">
+ Besar
+ </string>
+ <string name="anim_laugh_short">
+ Reír
+ </string>
+ <string name="anim_musclebeach">
+ Sacar músculo
+ </string>
+ <string name="anim_no_unhappy">
+ No (con enfado)
+ </string>
+ <string name="anim_no_head">
+ No
+ </string>
+ <string name="anim_nyanya">
+ Ña-Ña-Ña
+ </string>
+ <string name="anim_punch_onetwo">
+ Puñetazo uno-dos
+ </string>
+ <string name="anim_express_open_mouth">
+ Abrir la boca
+ </string>
+ <string name="anim_peace">
+ &apos;V&apos; con los dedos
+ </string>
+ <string name="anim_point_you">
+ Señalar a otro/a
+ </string>
+ <string name="anim_point_me">
+ Señalarse
+ </string>
+ <string name="anim_punch_l">
+ Puñetazo izquierdo
+ </string>
+ <string name="anim_punch_r">
+ Puñetazo derecho
+ </string>
+ <string name="anim_rps_countdown">
+ PPT cuenta
+ </string>
+ <string name="anim_rps_paper">
+ PPT papel
+ </string>
+ <string name="anim_rps_rock">
+ PPT piedra
+ </string>
+ <string name="anim_rps_scissors">
+ PPT tijera
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsa
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Patada circular
+ </string>
+ <string name="anim_express_sad">
+ Triste
+ </string>
+ <string name="anim_salute">
+ Saludo militar
+ </string>
+ <string name="anim_shout">
+ Gritar
+ </string>
+ <string name="anim_express_shrug">
+ Encogerse de hombros
+ </string>
+ <string name="anim_express_smile">
+ Sonreír
+ </string>
+ <string name="anim_smoke_idle">
+ Fumar: en la mano
+ </string>
+ <string name="anim_smoke_inhale">
+ Fumar
+ </string>
+ <string name="anim_smoke_throw_down">
+ Fumar: tirar el cigarro
+ </string>
+ <string name="anim_express_surprise">
+ Sorpresa
+ </string>
+ <string name="anim_sword_strike_r">
+ Estocadas
+ </string>
+ <string name="anim_angry_tantrum">
+ Berrinche
+ </string>
+ <string name="anim_express_tongue_out">
+ Sacar la lengua
+ </string>
+ <string name="anim_hello">
+ Agitar la mano
+ </string>
+ <string name="anim_whisper">
+ Cuchichear
+ </string>
+ <string name="anim_whistle">
+ Pitar
+ </string>
+ <string name="anim_express_wink">
+ Guiño
+ </string>
+ <string name="anim_wink_hollywood">
+ Guiño (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Preocuparse
+ </string>
+ <string name="anim_yes_happy">
+ Sí (contento)
+ </string>
+ <string name="anim_yes_head">
+ Sí
+ </string>
+ <string name="texture_loading">
+ Cargando...
+ </string>
+ <string name="worldmap_offline">
+ Sin conexión
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [PRICE] L$ por [AREA] m²
+ </string>
+ <string name="worldmap_results_none_found">
+ No se ha encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fin prematuro del archivo
+ </string>
+ <string name="ST_NO_JOINT">
+ No se puede encontrar ROOT o JOINT.
+ </string>
+ <string name="whisper">
+ susurra:
+ </string>
+ <string name="shout">
+ grita:
+ </string>
+ <string name="ringing">
+ Conectando al chat de voz...
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ La voz no está disponible en su localización actual
+ </string>
+ <string name="hang_up">
+ Desconectado del chat de voz
+ </string>
+ <string name="reconnect_nearby">
+ Vas a ser reconectado al chat de voz con los cercanos
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Cogerle a usted dólares Linden (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Actuar en sus controles de entrada
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurar sus controles de entrada
+ </string>
+ <string name="AnimateYourAvatar">
+ Ejecutar animaciones en su avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexarse a su avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Anular la propiedad y que pase a ser público
+ </string>
+ <string name="LinkAndDelink">
+ Enlazar y desenlazar de otros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Añadir y quitar uniones con otros objetos
+ </string>
+ <string name="ChangePermissions">
+ Cambiar sus permisos
+ </string>
+ <string name="TrackYourCamera">
+ Seguir su cámara
+ </string>
+ <string name="ControlYourCamera">
+ Controlar su cámara
+ </string>
+ <string name="SIM_ACCESS_PG">
+ General
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderado
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adulto
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Desconectado
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Desconocido
+ </string>
+ <string name="land_type_unknown">
+ (desconocido)
+ </string>
+ <string name="Estate / Full Region">
+ Estado /Región completa
+ </string>
+ <string name="Estate / Homestead">
+ Estado / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Región completa
+ </string>
+ <string name="all_files">
+ Todos los archivos
+ </string>
+ <string name="sound_files">
+ Sonidos
+ </string>
+ <string name="animation_files">
+ Animaciones
+ </string>
+ <string name="image_files">
+ Imágenes
+ </string>
+ <string name="save_file_verb">
+ Guardar
+ </string>
+ <string name="load_file_verb">
+ Cargar
+ </string>
+ <string name="targa_image_files">
+ Imágenes Targa
+ </string>
+ <string name="bitmap_image_files">
+ Imágenes de mapa de bits
+ </string>
+ <string name="avi_movie_file">
+ Archivo de película AVI
+ </string>
+ <string name="xaf_animation_file">
+ Archivo de anim. XAF
+ </string>
+ <string name="xml_file">
+ Archivo XML
+ </string>
+ <string name="raw_file">
+ Archivo RAW
+ </string>
+ <string name="compressed_image_files">
+ Imágenes comprimidas
+ </string>
+ <string name="load_files">
+ Cargar archivos
+ </string>
+ <string name="choose_the_directory">
+ Elegir directorio
+ </string>
+ <string name="AvatarSetNotAway">
+ Salir del estado ausente
+ </string>
+ <string name="AvatarSetAway">
+ Pasar al estado ausente
+ </string>
+ <string name="AvatarSetNotBusy">
+ Salir del estado ocupado
+ </string>
+ <string name="AvatarSetBusy">
+ Pasar al estado ocupado
+ </string>
+ <string name="shape">
+ Forma
+ </string>
+ <string name="skin">
+ Piel
+ </string>
+ <string name="hair">
+ Pelo
+ </string>
+ <string name="eyes">
+ Ojos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Pantalón
+ </string>
+ <string name="shoes">
+ Zapatos
+ </string>
+ <string name="socks">
+ Calcetines
+ </string>
+ <string name="jacket">
+ Chaqueta
+ </string>
+ <string name="gloves">
+ Guantes
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Ropa interior
+ </string>
+ <string name="skirt">
+ Falda
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Tatuaje
+ </string>
+ <string name="physics">
+ Física
+ </string>
+ <string name="invalid">
+ inválido/a
+ </string>
+ <string name="none">
+ ninguno
+ </string>
+ <string name="shirt_not_worn">
+ Camisa no puesta
+ </string>
+ <string name="pants_not_worn">
+ Pantalones no puestos
+ </string>
+ <string name="shoes_not_worn">
+ Zapatos no puestos
+ </string>
+ <string name="socks_not_worn">
+ Calcetines no puestos
+ </string>
+ <string name="jacket_not_worn">
+ Chaqueta no puesta
+ </string>
+ <string name="gloves_not_worn">
+ Guantes no puestos
+ </string>
+ <string name="undershirt_not_worn">
+ Camiseta no puesta
+ </string>
+ <string name="underpants_not_worn">
+ Ropa interior no puesta
+ </string>
+ <string name="skirt_not_worn">
+ Falda no puesta
+ </string>
+ <string name="alpha_not_worn">
+ Alfa no puesta
+ </string>
+ <string name="tattoo_not_worn">
+ Tatuaje no puesto
+ </string>
+ <string name="physics_not_worn">
+ Física no puesta
+ </string>
+ <string name="invalid_not_worn">
+ no válido/a
+ </string>
+ <string name="create_new_shape">
+ Crear una anatomía nueva
+ </string>
+ <string name="create_new_skin">
+ Crear una piel nueva
+ </string>
+ <string name="create_new_hair">
+ Crear pelo nuevo
+ </string>
+ <string name="create_new_eyes">
+ Crear ojos nuevos
+ </string>
+ <string name="create_new_shirt">
+ Crear una camisa nueva
+ </string>
+ <string name="create_new_pants">
+ Crear unos pantalones nuevos
+ </string>
+ <string name="create_new_shoes">
+ Crear unos zapatos nuevos
+ </string>
+ <string name="create_new_socks">
+ Crear unos calcetines nuevos
+ </string>
+ <string name="create_new_jacket">
+ Crear una chaqueta nueva
+ </string>
+ <string name="create_new_gloves">
+ Crear unos guantes nuevos
+ </string>
+ <string name="create_new_undershirt">
+ Crear una camiseta nueva
+ </string>
+ <string name="create_new_underpants">
+ Crear ropa interior nueva
+ </string>
+ <string name="create_new_skirt">
+ Crear una falda nueva
+ </string>
+ <string name="create_new_alpha">
+ Crear una capa alfa nueva
+ </string>
+ <string name="create_new_tattoo">
+ Crear un tatuaje nuevo
+ </string>
+ <string name="create_new_physics">
+ Crear nueva física
+ </string>
+ <string name="create_new_invalid">
+ no válido/a
+ </string>
+ <string name="NewWearable">
+ Nuevo [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Siguiente
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Aviso de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Avisos del grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Adjunto:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir el adjunto
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Guardar el adjunto
+ </string>
+ <string name="TeleportOffer">
+ Ofrecimiento de teleporte
+ </string>
+ <string name="StartUpNotifications">
+ Llegaron avisos nuevos mientras estabas ausente...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Tienes [%d] aviso/s más
+ </string>
+ <string name="BodyPartsRightArm">
+ Brazo der.
+ </string>
+ <string name="BodyPartsHead">
+ Cabeza
+ </string>
+ <string name="BodyPartsLeftArm">
+ Brazo izq.
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Pierna izq.
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </string>
+ <string name="BodyPartsRightLeg">
+ Pierna der.
+ </string>
+ <string name="GraphicsQualityLow">
+ Bajo
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pulsa ESC para salir de la vista subjetiva
+ </string>
+ <string name="InventoryNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Arrastra aquí un hito para tenerlo en tus favoritos.
+ </string>
+ <string name="InventoryNoTexture">
+ No tienes en tu inventario una copia de esta textura
+ </string>
+ <string name="no_transfer" value="(no transferible)"/>
+ <string name="no_modify" value="(no modificable)"/>
+ <string name="no_copy" value="(no copiable)"/>
+ <string name="worn" value="(puesto)"/>
+ <string name="link" value="(enlace)"/>
+ <string name="broken_link" value="(enlace roto)&quot;"/>
+ <string name="LoadingContents">
+ Cargando el contenido...
+ </string>
+ <string name="NoContents">
+ No hay contenido
+ </string>
+ <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (activo)"/>
+ <string name="Chat Message" value="Chat:"/>
+ <string name="Sound" value="Sonido :"/>
+ <string name="Wait" value="--- Espera :"/>
+ <string name="AnimFlagStop" value="Parar la animación:"/>
+ <string name="AnimFlagStart" value="Empezar la animación:"/>
+ <string name="Wave" value="Onda"/>
+ <string name="GestureActionNone" value="Ninguno"/>
+ <string name="HelloAvatar" value="¡Hola, avatar!"/>
+ <string name="ViewAllGestures" value="Ver todos &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Obtener más &gt;&gt;"/>
+ <string name="Animations" value="Animaciones,"/>
+ <string name="Calling Cards" value="Tarjetas de visita,"/>
+ <string name="Clothing" value="Ropa,"/>
+ <string name="Gestures" value="Gestos,"/>
+ <string name="Landmarks" value="Hitos,"/>
+ <string name="Notecards" value="Notas,"/>
+ <string name="Objects" value="Objetos,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sonidos,"/>
+ <string name="Textures" value="Texturas,"/>
+ <string name="Snapshots" value="Fotos,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- Desde la desconexión"/>
+ <string name="InvFolder My Inventory">
+ Mi Inventario
+ </string>
+ <string name="InvFolder My Favorites">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sonidos
+ </string>
+ <string name="InvFolder Calling Cards">
+ Tarjetas de visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Hitos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Ropa
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Notas
+ </string>
+ <string name="InvFolder New Folder">
+ Carpeta nueva
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imágenes sin comprimir
+ </string>
+ <string name="InvFolder Body Parts">
+ Partes del cuerpo
+ </string>
+ <string name="InvFolder Trash">
+ Papelera
+ </string>
+ <string name="InvFolder Photo Album">
+ Álbum de fotos
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objetos Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sonidos sin comprimir
+ </string>
+ <string name="InvFolder Animations">
+ Animaciones
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder Favorite">
+ Favoritos
+ </string>
+ <string name="InvFolder favorite">
+ Favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Vestuario actual
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Vestuario inicial
+ </string>
+ <string name="InvFolder My Outfits">
+ Mis vestuarios
+ </string>
+ <string name="InvFolder Accessories">
+ Accesorios
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Todas
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Piedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cristal
+ </string>
+ <string name="Wood">
+ Madera
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Goma
+ </string>
+ <string name="Light">
+ Claridad
+ </string>
+ <string name="KBShift">
+ Mayúsculas
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Tórax
+ </string>
+ <string name="Skull">
+ Cráneo
+ </string>
+ <string name="Left Shoulder">
+ Hombro izquierdo
+ </string>
+ <string name="Right Shoulder">
+ Hombro derecho
+ </string>
+ <string name="Left Hand">
+ Mano izq.
+ </string>
+ <string name="Right Hand">
+ Mano der.
+ </string>
+ <string name="Left Foot">
+ Pie izq.
+ </string>
+ <string name="Right Foot">
+ Pie der.
+ </string>
+ <string name="Spine">
+ Columna
+ </string>
+ <string name="Pelvis">
+ Pelvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Barbilla
+ </string>
+ <string name="Left Ear">
+ Oreja izq.
+ </string>
+ <string name="Right Ear">
+ Oreja der.
+ </string>
+ <string name="Left Eyeball">
+ Ojo izq.
+ </string>
+ <string name="Right Eyeball">
+ Ojo der.
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Brazo der.
+ </string>
+ <string name="R Forearm">
+ Antebrazo der.
+ </string>
+ <string name="L Upper Arm">
+ Brazo izq.
+ </string>
+ <string name="L Forearm">
+ Antebrazo izq.
+ </string>
+ <string name="Right Hip">
+ Cadera der.
+ </string>
+ <string name="R Upper Leg">
+ Muslo der.
+ </string>
+ <string name="R Lower Leg">
+ Pantorrilla der.
+ </string>
+ <string name="Left Hip">
+ Cadera izq.
+ </string>
+ <string name="L Upper Leg">
+ Muslo izq.
+ </string>
+ <string name="L Lower Leg">
+ Pantorrilla izq.
+ </string>
+ <string name="Stomach">
+ Abdomen
+ </string>
+ <string name="Left Pec">
+ Pecho izquierdo
+ </string>
+ <string name="Right Pec">
+ Pecho derecho
+ </string>
+ <string name="Invalid Attachment">
+ Punto de colocación no válido
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de edad
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de edad
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de edad
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de edad
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de edad
+ </string>
+ <string name="TodayOld">
+ Registrado hoy
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] año
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] años
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] años
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mes
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] día
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] días
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] días
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] miembro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] miembros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] miembros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prueba
+ </string>
+ <string name="AcctTypeCharterMember">
+ Miembro fundador
+ </string>
+ <string name="AcctTypeEmployee">
+ Empleado de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Ha usado información sobre la forma de pago
+ </string>
+ <string name="PaymentInfoOnFile">
+ Hay información archivada sobre la forma de pago
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No hay información archivada sobre la forma de pago
+ </string>
+ <string name="AgeVerified">
+ Edad verificada
+ </string>
+ <string name="NotAgeVerified">
+ Edad no verificada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Arriba der.
+ </string>
+ <string name="Top">
+ Arriba
+ </string>
+ <string name="Top Left">
+ Arriba izq.
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Abajo izq.
+ </string>
+ <string name="Bottom">
+ Abajo
+ </string>
+ <string name="Bottom Right">
+ Abajo der.
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Descargado, compilándolo
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ No se encuentra el script en el servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema al descargar
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permisos insuficientes para descargar un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permisos insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Fallo desconocido en la descarga
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilando
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Progreso del reinicio
+ </string>
+ <string name="ResetQueueStart">
+ restaurar
+ </string>
+ <string name="RunQueueTitle">
+ Configurar según se ejecuta
+ </string>
+ <string name="RunQueueStart">
+ Configurando según se ejecuta
+ </string>
+ <string name="NotRunQueueTitle">
+ Configurar sin ejecutar
+ </string>
+ <string name="NotRunQueueStart">
+ Configurando sin ejecutarlo
+ </string>
+ <string name="CompileSuccessful">
+ ¡Compilación correcta!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilación correcta, guardando...
+ </string>
+ <string name="SaveComplete">
+ Guardado.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fuera de rango)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ El objeto [OBJECT] es propiedad de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ninguno
+ </string>
+ <string name="Group" value="(grupo)"/>
+ <string name="Unknown">
+ (Desconocido)
+ </string>
+ <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
+ <string name="NextStipendDay" value="El próximo día de pago es el"/>
+ <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
+ <string name="GroupColumn" value="Grupo"/>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ No se encontraron datos del grupo
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todos los estados propiedad de [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todos los estados que posees
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todos los estados que administras para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memoria de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcelas listadas: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memoria usada: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URLs de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs usadas: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Error al obtener la información
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ No hay una parcela seleccionada
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Error: la información del script sólo está disponible en tu región actual
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Obteniendo la información...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ No tienes permiso para examinar esta parcela
+ </string>
+ <string name="SITTING_ON">
+ Sentado en
+ </string>
+ <string name="ATTACH_CHEST">
+ Tórax
+ </string>
+ <string name="ATTACH_HEAD">
+ Cabeza
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Hombro izquierdo
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Hombro derecho
+ </string>
+ <string name="ATTACH_LHAND">
+ Mano izq.
+ </string>
+ <string name="ATTACH_RHAND">
+ Mano der.
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pie izq.
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pie der.
+ </string>
+ <string name="ATTACH_BACK">
+ Anterior
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Boca
+ </string>
+ <string name="ATTACH_CHIN">
+ Barbilla
+ </string>
+ <string name="ATTACH_LEAR">
+ Oreja izq.
+ </string>
+ <string name="ATTACH_REAR">
+ Oreja der.
+ </string>
+ <string name="ATTACH_LEYE">
+ Ojo izq.
+ </string>
+ <string name="ATTACH_REYE">
+ Ojo der.
+ </string>
+ <string name="ATTACH_NOSE">
+ Nariz
+ </string>
+ <string name="ATTACH_RUARM">
+ Brazo der.
+ </string>
+ <string name="ATTACH_RLARM">
+ Antebrazo der.
+ </string>
+ <string name="ATTACH_LUARM">
+ Brazo izq.
+ </string>
+ <string name="ATTACH_LLARM">
+ Antebrazo izq.
+ </string>
+ <string name="ATTACH_RHIP">
+ Cadera der.
+ </string>
+ <string name="ATTACH_RULEG">
+ Muslo der.
+ </string>
+ <string name="ATTACH_RLLEG">
+ Pantorrilla der.
+ </string>
+ <string name="ATTACH_LHIP">
+ Cadera izq.
+ </string>
+ <string name="ATTACH_LULEG">
+ Muslo izq.
+ </string>
+ <string name="ATTACH_LLLEG">
+ Pantorrilla izq.
+ </string>
+ <string name="ATTACH_BELLY">
+ Vientre
+ </string>
+ <string name="ATTACH_RPEC">
+ Pecho derecho
+ </string>
+ <string name="ATTACH_LPEC">
+ Pecho izquierdo
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD: Centro 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD: arriba der.
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD: arriba centro
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD: arriba izq.
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD: Centro 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD: abajo izq.
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD: abajo
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD: abajo der.
+ </string>
+ <string name="CursorPos">
+ Línea [LINE], Columna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] resultados
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenido del objeto
+ </string>
+ <string name="PanelContentsNewScript">
+ Script nuevo
+ </string>
+ <string name="BusyModeResponseDefault">
+ El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI.
+ </string>
+ <string name="MuteByName">
+ (Por el nombre)
+ </string>
+ <string name="MuteAgent">
+ (Residente)
+ </string>
+ <string name="MuteObject">
+ (Objeto)
+ </string>
+ <string name="MuteGroup">
+ (Grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
+ </string>
+ <string name="RegionNoCovenant">
+ No se ha aportado un contrato para este estado.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
+ </string>
+ <string name="covenant_last_modified" value="Última modificación: "/>
+ <string name="none_text" value="(no hay)"/>
+ <string name="never_text" value=" (nunca)"/>
+ <string name="GroupOwned">
+ Propiedad del grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (se actualizará tras la publicación)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ El usuario no tiene clasificados ni destacados
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Cargando...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vista previa
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propiedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objeto de nombre
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ propiedad del grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ propiedad de un grupo desconocido
+ </string>
+ <string name="InvOfferOwnedBy">
+ propiedad de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ propiedad de un usuario desconocido
+ </string>
+ <string name="InvOfferGaveYou">
+ te ha dado
+ </string>
+ <string name="InvOfferDecline">
+ Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprado
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagado a ti
+ </string>
+ <string name="GroupMoneyPaidInto">
+ pagado en
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ pase comprado a
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ cuotas pagadas para el evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ precio pagado por el evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="ViewerObjectContents">
+ Contenidos
+ </string>
+ <string name="AcquiredItems">
+ Artículos adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Subir [NAME] cuesta [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Comprar esto cuesta [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Extensión de archivo desconocida [.%s]
+Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
+ </string>
+ <string name="MuteObject2">
+ Ignorar
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Guardarme este hito...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar este hito...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Mayús+
+ </string>
+ <string name="FileSaved">
+ Archivo guardado
+ </string>
+ <string name="Receiving">
+ Recibiendo
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Adelante
+ </string>
+ <string name="Direction_Left">
+ Izquierda
+ </string>
+ <string name="Direction_Right">
+ Derecha
+ </string>
+ <string name="Direction_Back">
+ Atrás
+ </string>
+ <string name="Direction_North">
+ Norte
+ </string>
+ <string name="Direction_South">
+ Sur
+ </string>
+ <string name="Direction_West">
+ Oeste
+ </string>
+ <string name="Direction_East">
+ Este
+ </string>
+ <string name="Direction_Up">
+ Arriba
+ </string>
+ <string name="Direction_Down">
+ Abajo
+ </string>
+ <string name="Any Category">
+ Cualquier categoría
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Property Rental">
+ Propiedad en alquiler
+ </string>
+ <string name="Special Attraction">
+ Atracción especial
+ </string>
+ <string name="New Products">
+ Nuevos productos
+ </string>
+ <string name="Employment">
+ Empleo
+ </string>
+ <string name="Wanted">
+ Se busca
+ </string>
+ <string name="Service">
+ Servicios
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ Ninguno
+ </string>
+ <string name="Linden Location">
+ Localización Linden
+ </string>
+ <string name="Adult">
+ Adulto
+ </string>
+ <string name="Arts&amp;Culture">
+ Arte y Cultura
+ </string>
+ <string name="Business">
+ Negocios
+ </string>
+ <string name="Educational">
+ Educativo
+ </string>
+ <string name="Gaming">
+ Juegos de azar
+ </string>
+ <string name="Hangout">
+ Entretenimiento
+ </string>
+ <string name="Newcomer Friendly">
+ Para recién llegados
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques y Naturaleza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Artes escénicas
+ </string>
+ <string name="Other">
+ Otra
+ </string>
+ <string name="Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Any">
+ Cualquiera
+ </string>
+ <string name="You">
+ Tú
+ </string>
+ <string name="Multiple Media">
+ Múltiples medias
+ </string>
+ <string name="Play Media">
+ Play/Pausa los media
+ </string>
+ <string name="MBCmdLineError">
+ Ha habido un error analizando la línea de comando.
+Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
+Error:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de línea de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] no puede acceder a un archivo que necesita.
+
+Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
+Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
+Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
+ </string>
+ <string name="MBFatalError">
+ Error fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] ya se está ejecutando.
+Revisa tu barra de tareas para encontrar una copia minimizada del programa.
+Si este mensaje persiste, reinicia tu ordenador.
+ </string>
+ <string name="MBFrozenCrashed">
+ En su anterior ejecución, [APP_NAME] se congeló o se cayó.
+¿Quieres enviar un informe de caída?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] no encuentra DirectX 9.0b o superior.
+[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
+
+¿Quieres continuar?
+ </string>
+ <string name="MBWarning">
+ ¡Atención!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Las actualizaciones automáticas no están todavía implementadas para Linux.
+Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Fallo en RegisterClass
+ </string>
+ <string name="MBError">
+ Error
+ </string>
+ <string name="MBFullScreenErr">
+ No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
+Ejecutándose en una ventana.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Error Shutdown destruyendo la ventana (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Error Shutdown
+ </string>
+ <string name="MBDevContextErr">
+ No se puede construir el &apos;GL device context&apos;
+ </string>
+ <string name="MBPixelFmtErr">
+ No se puede encontrar un formato adecuado de píxel
+ </string>
+ <string name="MBPixelFmtDescErr">
+ No se puede conseguir la descripción del formato de píxel
+ </string>
+ <string name="MBTrueColorWindow">
+ Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
+Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
+Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
+Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ No se puede configurar el formato de píxel
+ </string>
+ <string name="MBGLContextErr">
+ No se puede crear el &apos;GL rendering context&apos;
+ </string>
+ <string name="MBGLContextActErr">
+ No se puede activar el &apos;GL rendering context&apos;
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
+
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Barba del día
+ </string>
+ <string name="All White">
+ Blanco del todo
+ </string>
+ <string name="Anime Eyes">
+ Ojos de cómic
+ </string>
+ <string name="Arced">
+ Arqueadas
+ </string>
+ <string name="Arm Length">
+ Brazos: longitud
+ </string>
+ <string name="Attached">
+ Cortos
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos
+ </string>
+ <string name="Back Fringe">
+ Nuca: largo
+ </string>
+ <string name="Baggy">
+ Marcadas
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Ojos pequeños
+ </string>
+ <string name="Belly Size">
+ Barriga: tamaño
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Culo grande
+ </string>
+ <string name="Big Hair Back">
+ Pelo: moño
+ </string>
+ <string name="Big Hair Front">
+ Pelo: tupé
+ </string>
+ <string name="Big Hair Top">
+ Pelo: melena alta
+ </string>
+ <string name="Big Head">
+ Cabeza grande
+ </string>
+ <string name="Big Pectorals">
+ Grandes pectorales
+ </string>
+ <string name="Big Spikes">
+ Crestas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Rubio
+ </string>
+ <string name="Blonde Hair">
+ Pelo rubio
+ </string>
+ <string name="Blush">
+ Colorete
+ </string>
+ <string name="Blush Color">
+ Color del colorete
+ </string>
+ <string name="Blush Opacity">
+ Opacidad del colorete
+ </string>
+ <string name="Body Definition">
+ Definición del cuerpo
+ </string>
+ <string name="Body Fat">
+ Cuerpo: gordura
+ </string>
+ <string name="Body Freckles">
+ Pecas del cuerpo
+ </string>
+ <string name="Body Thick">
+ Cuerpo grueso
+ </string>
+ <string name="Body Thickness">
+ Cuerpo: grosor
+ </string>
+ <string name="Body Thin">
+ Cuerpo delgado
+ </string>
+ <string name="Bow Legged">
+ Abiertas
+ </string>
+ <string name="Breast Buoyancy">
+ Busto: firmeza
+ </string>
+ <string name="Breast Cleavage">
+ Busto: canalillo
+ </string>
+ <string name="Breast Size">
+ Busto: tamaño
+ </string>
+ <string name="Bridge Width">
+ Puente: ancho
+ </string>
+ <string name="Broad">
+ Aumentar
+ </string>
+ <string name="Brow Size">
+ Arco ciliar
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Ojos saltones
+ </string>
+ <string name="Bulbous">
+ Bulbosa
+ </string>
+ <string name="Bulbous Nose">
+ Nariz de porra
+ </string>
+ <string name="Breast Physics Mass">
+ Masa del busto
+ </string>
+ <string name="Breast Physics Smoothing">
+ Suavizado del busto
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravedad del busto
+ </string>
+ <string name="Breast Physics Drag">
+ Aerodinámica del busto
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Amortiguación
+ </string>
+ <string name="Belly Physics Mass">
+ Masa de la barriga
+ </string>
+ <string name="Belly Physics Smoothing">
+ Suavizado de la barriga
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravedad de la barriga
+ </string>
+ <string name="Belly Physics Drag">
+ Aerodinámica de la barriga
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics Mass">
+ Masa del culo
+ </string>
+ <string name="Butt Physics Smoothing">
+ Suavizado del culo
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravedad del culo
+ </string>
+ <string name="Butt Physics Drag">
+ Aerodinámica del culo
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortiguación
+ </string>
+ <string name="Bushy Eyebrows">
+ Cejijuntas
+ </string>
+ <string name="Bushy Hair">
+ Pelo tupido
+ </string>
+ <string name="Butt Size">
+ Culo: tamaño
+ </string>
+ <string name="Butt Gravity">
+ Gravedad del culo
+ </string>
+ <string name="bustle skirt">
+ Polisón
+ </string>
+ <string name="no bustle">
+ Sin polisón
+ </string>
+ <string name="more bustle">
+ Con polisón
+ </string>
+ <string name="Chaplin">
+ Cortito
+ </string>
+ <string name="Cheek Bones">
+ Pómulos
+ </string>
+ <string name="Chest Size">
+ Tórax: tamaño
+ </string>
+ <string name="Chin Angle">
+ Barbilla: ángulo
+ </string>
+ <string name="Chin Cleft">
+ Barbilla: contorno
+ </string>
+ <string name="Chin Curtains">
+ Barba en collar
+ </string>
+ <string name="Chin Depth">
+ Barbilla: largo
+ </string>
+ <string name="Chin Heavy">
+ Hacia la barbilla
+ </string>
+ <string name="Chin In">
+ Barbilla retraída
+ </string>
+ <string name="Chin Out">
+ Barbilla prominente
+ </string>
+ <string name="Chin-Neck">
+ Papada
+ </string>
+ <string name="Clear">
+ Transparente
+ </string>
+ <string name="Cleft">
+ Remarcar
+ </string>
+ <string name="Close Set Eyes">
+ Ojos juntos
+ </string>
+ <string name="Closed">
+ Cerrar
+ </string>
+ <string name="Closed Back">
+ Trasera cerrada
+ </string>
+ <string name="Closed Front">
+ Frontal cerrado
+ </string>
+ <string name="Closed Left">
+ Cerrada
+ </string>
+ <string name="Closed Right">
+ Cerrada
+ </string>
+ <string name="Coin Purse">
+ Poco abultada
+ </string>
+ <string name="Collar Back">
+ Espalda
+ </string>
+ <string name="Collar Front">
+ Escote
+ </string>
+ <string name="Corner Down">
+ Hacia abajo
+ </string>
+ <string name="Corner Up">
+ Hacia arriba
+ </string>
+ <string name="Creased">
+ Caídos
+ </string>
+ <string name="Crooked Nose">
+ Nariz torcida
+ </string>
+ <string name="Cuff Flare">
+ Acampanado
+ </string>
+ <string name="Dark">
+ Oscuridad
+ </string>
+ <string name="Dark Green">
+ Verde oscuro
+ </string>
+ <string name="Darker">
+ Más oscuros
+ </string>
+ <string name="Deep">
+ Remarcar
+ </string>
+ <string name="Default Heels">
+ Tacones por defecto
+ </string>
+ <string name="Dense">
+ Densas
+ </string>
+ <string name="Double Chin">
+ Mucha papada
+ </string>
+ <string name="Downturned">
+ Poco
+ </string>
+ <string name="Duffle Bag">
+ Muy abultada
+ </string>
+ <string name="Ear Angle">
+ Orejas: ángulo
+ </string>
+ <string name="Ear Size">
+ Orejas: tamaño
+ </string>
+ <string name="Ear Tips">
+ Orejas: forma
+ </string>
+ <string name="Egg Head">
+ Cabeza: ahuevada
+ </string>
+ <string name="Eye Bags">
+ Ojos: bolsas
+ </string>
+ <string name="Eye Color">
+ Ojos: color
+ </string>
+ <string name="Eye Depth">
+ Ojos: profundidad
+ </string>
+ <string name="Eye Lightness">
+ Ojos: brillo
+ </string>
+ <string name="Eye Opening">
+ Ojos: apertura
+ </string>
+ <string name="Eye Pop">
+ Ojos: simetría
+ </string>
+ <string name="Eye Size">
+ Ojos: tamaño
+ </string>
+ <string name="Eye Spacing">
+ Ojos: separación
+ </string>
+ <string name="Eyebrow Arc">
+ Cejas: arco
+ </string>
+ <string name="Eyebrow Density">
+ Cejas: densidad
+ </string>
+ <string name="Eyebrow Height">
+ Cejas: altura
+ </string>
+ <string name="Eyebrow Points">
+ Cejas: en V
+ </string>
+ <string name="Eyebrow Size">
+ Cejas: tamaño
+ </string>
+ <string name="Eyelash Length">
+ Pestañas: longitud
+ </string>
+ <string name="Eyeliner">
+ Contorno de ojos
+ </string>
+ <string name="Eyeliner Color">
+ Contorno de ojos: color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Cara: simetría
+ </string>
+ <string name="Facial Definition">
+ Rasgos marcados
+ </string>
+ <string name="Far Set Eyes">
+ Ojos separados
+ </string>
+ <string name="Fat Lips">
+ Prominentes
+ </string>
+ <string name="Female">
+ Mujer
+ </string>
+ <string name="Fingerless">
+ Sin dedos
+ </string>
+ <string name="Fingers">
+ Con dedos
+ </string>
+ <string name="Flared Cuffs">
+ Campana
+ </string>
+ <string name="Flat">
+ Redondeadas
+ </string>
+ <string name="Flat Butt">
+ Culo plano
+ </string>
+ <string name="Flat Head">
+ Cabeza plana
+ </string>
+ <string name="Flat Toe">
+ Empeine bajo
+ </string>
+ <string name="Foot Size">
+ Pie: tamaño
+ </string>
+ <string name="Forehead Angle">
+ Frente: ángulo
+ </string>
+ <string name="Forehead Heavy">
+ Hacia la frente
+ </string>
+ <string name="Freckles">
+ Pecas
+ </string>
+ <string name="Front Fringe">
+ Flequillo
+ </string>
+ <string name="Full Back">
+ Sin cortar
+ </string>
+ <string name="Full Eyeliner">
+ Contorno completo
+ </string>
+ <string name="Full Front">
+ Sin cortar
+ </string>
+ <string name="Full Hair Sides">
+ Pelo: volumen a los lados
+ </string>
+ <string name="Full Sides">
+ Volumen total
+ </string>
+ <string name="Glossy">
+ Con brillo
+ </string>
+ <string name="Glove Fingers">
+ Guantes: dedos
+ </string>
+ <string name="Glove Length">
+ Guantes: largo
+ </string>
+ <string name="Hair">
+ Pelo
+ </string>
+ <string name="Hair Back">
+ Pelo: nuca
+ </string>
+ <string name="Hair Front">
+ Pelo: delante
+ </string>
+ <string name="Hair Sides">
+ Pelo: lados
+ </string>
+ <string name="Hair Sweep">
+ Peinado: dirección
+ </string>
+ <string name="Hair Thickess">
+ Pelo: espesor
+ </string>
+ <string name="Hair Thickness">
+ Pelo: espesor
+ </string>
+ <string name="Hair Tilt">
+ Pelo: inclinación
+ </string>
+ <string name="Hair Tilted Left">
+ A la izq.
+ </string>
+ <string name="Hair Tilted Right">
+ A la der.
+ </string>
+ <string name="Hair Volume">
+ Pelo: volumen
+ </string>
+ <string name="Hand Size">
+ Manos: tamaño
+ </string>
+ <string name="Handlebars">
+ Muy largo
+ </string>
+ <string name="Head Length">
+ Cabeza: longitud
+ </string>
+ <string name="Head Shape">
+ Cabeza: forma
+ </string>
+ <string name="Head Size">
+ Cabeza: tamaño
+ </string>
+ <string name="Head Stretch">
+ Cabeza: estiramiento
+ </string>
+ <string name="Heel Height">
+ Tacón: altura
+ </string>
+ <string name="Heel Shape">
+ Tacón: forma
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Subir
+ </string>
+ <string name="High Heels">
+ Tacones altos
+ </string>
+ <string name="High Jaw">
+ Mandíbula alta
+ </string>
+ <string name="High Platforms">
+ Suela gorda
+ </string>
+ <string name="High and Tight">
+ Pegada
+ </string>
+ <string name="Higher">
+ Arrriba
+ </string>
+ <string name="Hip Length">
+ Cadera: altura
+ </string>
+ <string name="Hip Width">
+ Cadera: ancho
+ </string>
+ <string name="In">
+ Pegadas
+ </string>
+ <string name="In Shdw Color">
+ Línea de ojos: color
+ </string>
+ <string name="In Shdw Opacity">
+ Línea de ojos: opacidad
+ </string>
+ <string name="Inner Eye Corner">
+ Ojos: lagrimal
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Línea de ojos
+ </string>
+ <string name="Jacket Length">
+ Chaqueta: largo
+ </string>
+ <string name="Jacket Wrinkles">
+ Chaqueta: arrugas
+ </string>
+ <string name="Jaw Angle">
+ Mandíbula: ángulo
+ </string>
+ <string name="Jaw Jut">
+ Maxilar inferior
+ </string>
+ <string name="Jaw Shape">
+ Mandíbula: forma
+ </string>
+ <string name="Join">
+ Más junto
+ </string>
+ <string name="Jowls">
+ Mofletes
+ </string>
+ <string name="Knee Angle">
+ Rodillas: ángulo
+ </string>
+ <string name="Knock Kneed">
+ Zambas
+ </string>
+ <string name="Large">
+ Aumentar
+ </string>
+ <string name="Large Hands">
+ Manos grandes
+ </string>
+ <string name="Left Part">
+ Raya: izq.
+ </string>
+ <string name="Leg Length">
+ Piernas: longitud
+ </string>
+ <string name="Leg Muscles">
+ Piernas: musculatura
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos tupida
+ </string>
+ <string name="Less Freckles">
+ Menos pecas
+ </string>
+ <string name="Less Full">
+ Menos grosor
+ </string>
+ <string name="Less Gravity">
+ Más levantado
+ </string>
+ <string name="Less Love">
+ Menos michelines
+ </string>
+ <string name="Less Muscles">
+ Pocos músculos
+ </string>
+ <string name="Less Muscular">
+ Poca musculatura
+ </string>
+ <string name="Less Rosy">
+ Menos sonrosada
+ </string>
+ <string name="Less Round">
+ Menos redondeada
+ </string>
+ <string name="Less Saddle">
+ Menos cartucheras
+ </string>
+ <string name="Less Square">
+ Menos cuadrada
+ </string>
+ <string name="Less Volume">
+ Menos volumen
+ </string>
+ <string name="Less soul">
+ Pequeña
+ </string>
+ <string name="Lighter">
+ Más luminosos
+ </string>
+ <string name="Lip Cleft">
+ Labio: hoyuelo
+ </string>
+ <string name="Lip Cleft Depth">
+ Hoyuelo marcado
+ </string>
+ <string name="Lip Fullness">
+ Labios: grosor
+ </string>
+ <string name="Lip Pinkness">
+ Labios sonrosados
+ </string>
+ <string name="Lip Ratio">
+ Labios: ratio
+ </string>
+ <string name="Lip Thickness">
+ Labios: prominencia
+ </string>
+ <string name="Lip Width">
+ Labios: ancho
+ </string>
+ <string name="Lipgloss">
+ Brillo de labios
+ </string>
+ <string name="Lipstick">
+ Barra de labios
+ </string>
+ <string name="Lipstick Color">
+ Barra de labios: color
+ </string>
+ <string name="Long">
+ Más
+ </string>
+ <string name="Long Head">
+ Cabeza alargada
+ </string>
+ <string name="Long Hips">
+ Cadera larga
+ </string>
+ <string name="Long Legs">
+ Piernas largas
+ </string>
+ <string name="Long Neck">
+ Cuello largo
+ </string>
+ <string name="Long Pigtails">
+ Coletas largas
+ </string>
+ <string name="Long Ponytail">
+ Cola de caballo larga
+ </string>
+ <string name="Long Torso">
+ Torso largo
+ </string>
+ <string name="Long arms">
+ Brazos largos
+ </string>
+ <string name="Loose Pants">
+ Pantalón suelto
+ </string>
+ <string name="Loose Shirt">
+ Camiseta suelta
+ </string>
+ <string name="Loose Sleeves">
+ Puños anchos
+ </string>
+ <string name="Love Handles">
+ Michelines
+ </string>
+ <string name="Low">
+ Bajar
+ </string>
+ <string name="Low Heels">
+ Tacones bajos
+ </string>
+ <string name="Low Jaw">
+ Mandíbula baja
+ </string>
+ <string name="Low Platforms">
+ Suela fina
+ </string>
+ <string name="Low and Loose">
+ Suelta
+ </string>
+ <string name="Lower">
+ Abajo
+ </string>
+ <string name="Lower Bridge">
+ Puente: abajo
+ </string>
+ <string name="Lower Cheeks">
+ Mejillas: abajo
+ </string>
+ <string name="Male">
+ Varón
+ </string>
+ <string name="Middle Part">
+ Raya: en medio
+ </string>
+ <string name="More">
+ Más
+ </string>
+ <string name="More Blush">
+ Más colorete
+ </string>
+ <string name="More Body Fat">
+ Más gordura
+ </string>
+ <string name="More Curtains">
+ Más tupida
+ </string>
+ <string name="More Eyeshadow">
+ Más
+ </string>
+ <string name="More Freckles">
+ Más pecas
+ </string>
+ <string name="More Full">
+ Más grosor
+ </string>
+ <string name="More Gravity">
+ Menos levantado
+ </string>
+ <string name="More Lipstick">
+ Más barra de labios
+ </string>
+ <string name="More Love">
+ Más michelines
+ </string>
+ <string name="More Lower Lip">
+ Más el inferior
+ </string>
+ <string name="More Muscles">
+ Más músculos
+ </string>
+ <string name="More Muscular">
+ Más musculatura
+ </string>
+ <string name="More Rosy">
+ Más sonrosada
+ </string>
+ <string name="More Round">
+ Más redondeada
+ </string>
+ <string name="More Saddle">
+ Más cartucheras
+ </string>
+ <string name="More Sloped">
+ Más inclinada
+ </string>
+ <string name="More Square">
+ Más cuadrada
+ </string>
+ <string name="More Upper Lip">
+ Más el superior
+ </string>
+ <string name="More Vertical">
+ Más recta
+ </string>
+ <string name="More Volume">
+ Más volumen
+ </string>
+ <string name="More soul">
+ Grande
+ </string>
+ <string name="Moustache">
+ Bigote
+ </string>
+ <string name="Mouth Corner">
+ Comisuras
+ </string>
+ <string name="Mouth Position">
+ Boca: posición
+ </string>
+ <string name="Mowhawk">
+ Rapado
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Patillas largas
+ </string>
+ <string name="Nail Polish">
+ Uñas pintadas
+ </string>
+ <string name="Nail Polish Color">
+ Uñas pintadas: color
+ </string>
+ <string name="Narrow">
+ Disminuir
+ </string>
+ <string name="Narrow Back">
+ Rapada
+ </string>
+ <string name="Narrow Front">
+ Entradas
+ </string>
+ <string name="Narrow Lips">
+ Labios estrechos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Cuello: longitud
+ </string>
+ <string name="Neck Thickness">
+ Cuello: grosor
+ </string>
+ <string name="No Blush">
+ Sin colorete
+ </string>
+ <string name="No Eyeliner">
+ Sin contorno
+ </string>
+ <string name="No Eyeshadow">
+ Menos
+ </string>
+ <string name="No Lipgloss">
+ Sin brillo
+ </string>
+ <string name="No Lipstick">
+ Sin barra de labios
+ </string>
+ <string name="No Part">
+ Sin raya
+ </string>
+ <string name="No Polish">
+ Sin pintar
+ </string>
+ <string name="No Red">
+ Nada
+ </string>
+ <string name="No Spikes">
+ Sin crestas
+ </string>
+ <string name="No White">
+ Sin blanco
+ </string>
+ <string name="No Wrinkles">
+ Sin arrugas
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nariz a la izq.
+ </string>
+ <string name="Nose Right">
+ Nariz a la der.
+ </string>
+ <string name="Nose Size">
+ Nariz: tamaño
+ </string>
+ <string name="Nose Thickness">
+ Nariz: grosor
+ </string>
+ <string name="Nose Tip Angle">
+ Nariz: respingona
+ </string>
+ <string name="Nose Tip Shape">
+ Nariz: punta
+ </string>
+ <string name="Nose Width">
+ Nariz: ancho
+ </string>
+ <string name="Nostril Division">
+ Ventana: altura
+ </string>
+ <string name="Nostril Width">
+ Ventana: ancho
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Apertura trasera
+ </string>
+ <string name="Open Front">
+ Apertura frontal
+ </string>
+ <string name="Open Left">
+ Abierta
+ </string>
+ <string name="Open Right">
+ Abierta
+ </string>
+ <string name="Orange">
+ Anaranjado
+ </string>
+ <string name="Out">
+ De soplillo
+ </string>
+ <string name="Out Shdw Color">
+ Sombra de ojos: color
+ </string>
+ <string name="Out Shdw Opacity">
+ Sombra de ojos: opacidad
+ </string>
+ <string name="Outer Eye Corner">
+ Ojos: comisura
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Sombra de ojos
+ </string>
+ <string name="Overbite">
+ Retraído
+ </string>
+ <string name="Package">
+ Pubis
+ </string>
+ <string name="Painted Nails">
+ Pintadas
+ </string>
+ <string name="Pale">
+ Pálida
+ </string>
+ <string name="Pants Crotch">
+ Pantalón: cruz
+ </string>
+ <string name="Pants Fit">
+ Ceñido
+ </string>
+ <string name="Pants Length">
+ Pernera: largo
+ </string>
+ <string name="Pants Waist">
+ Caja
+ </string>
+ <string name="Pants Wrinkles">
+ Pantalón: arrugas
+ </string>
+ <string name="Part">
+ Raya
+ </string>
+ <string name="Part Bangs">
+ Flequillo partido
+ </string>
+ <string name="Pectorals">
+ Pectorales
+ </string>
+ <string name="Pigment">
+ Tono
+ </string>
+ <string name="Pigtails">
+ Coletas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Más sonrosados
+ </string>
+ <string name="Platform Height">
+ Suela: altura
+ </string>
+ <string name="Platform Width">
+ Suela: ancho
+ </string>
+ <string name="Pointy">
+ En punta
+ </string>
+ <string name="Pointy Heels">
+ De aguja
+ </string>
+ <string name="Ponytail">
+ Cola de caballo
+ </string>
+ <string name="Poofy Skirt">
+ Con vuelo
+ </string>
+ <string name="Pop Left Eye">
+ Izquierdo más grande
+ </string>
+ <string name="Pop Right Eye">
+ Derecho más grande
+ </string>
+ <string name="Puffy">
+ Hinchadas
+ </string>
+ <string name="Puffy Eyelids">
+ Ojeras
+ </string>
+ <string name="Rainbow Color">
+ Irisación
+ </string>
+ <string name="Red Hair">
+ Pelirrojo
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Right Part">
+ Raya: der.
+ </string>
+ <string name="Rosy Complexion">
+ Tez sonrosada
+ </string>
+ <string name="Round">
+ Redondear
+ </string>
+ <string name="Ruddiness">
+ Rubicundez
+ </string>
+ <string name="Ruddy">
+ Rojiza
+ </string>
+ <string name="Rumpled Hair">
+ Pelo encrespado
+ </string>
+ <string name="Saddle Bags">
+ Cartucheras
+ </string>
+ <string name="Scrawny Leg">
+ Piernas flacas
+ </string>
+ <string name="Separate">
+ Más ancho
+ </string>
+ <string name="Shallow">
+ Sin marcar
+ </string>
+ <string name="Shear Back">
+ Nuca: corte
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left Up">
+ Arriba - izq.
+ </string>
+ <string name="Shear Right Up">
+ Arriba - der.
+ </string>
+ <string name="Sheared Back">
+ Rapada
+ </string>
+ <string name="Sheared Front">
+ Rapada
+ </string>
+ <string name="Shift Left">
+ A la izq.
+ </string>
+ <string name="Shift Mouth">
+ Boca: ladeada
+ </string>
+ <string name="Shift Right">
+ A la der.
+ </string>
+ <string name="Shirt Bottom">
+ Alto de cintura
+ </string>
+ <string name="Shirt Fit">
+ Ceñido
+ </string>
+ <string name="Shirt Wrinkles">
+ Camisa: arrugas
+ </string>
+ <string name="Shoe Height">
+ Caña: altura
+ </string>
+ <string name="Short">
+ Menos
+ </string>
+ <string name="Short Arms">
+ Brazos cortos
+ </string>
+ <string name="Short Legs">
+ Piernas cortas
+ </string>
+ <string name="Short Neck">
+ Cuello corto
+ </string>
+ <string name="Short Pigtails">
+ Coletas cortas
+ </string>
+ <string name="Short Ponytail">
+ Cola de caballo corta
+ </string>
+ <string name="Short Sideburns">
+ Patillas cortas
+ </string>
+ <string name="Short Torso">
+ Torso corto
+ </string>
+ <string name="Short hips">
+ Cadera corta
+ </string>
+ <string name="Shoulders">
+ Hombros
+ </string>
+ <string name="Side Fringe">
+ Lados: franja
+ </string>
+ <string name="Sideburns">
+ Patillas
+ </string>
+ <string name="Sides Hair">
+ Pelo: lados
+ </string>
+ <string name="Sides Hair Down">
+ Bajar lados del pelo
+ </string>
+ <string name="Sides Hair Up">
+ Subir lados del pelo
+ </string>
+ <string name="Skinny Neck">
+ Cuello estrecho
+ </string>
+ <string name="Skirt Fit">
+ Falda: vuelo
+ </string>
+ <string name="Skirt Length">
+ Falda: largo
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Largo de manga
+ </string>
+ <string name="Sleeve Looseness">
+ Ancho de puños
+ </string>
+ <string name="Slit Back">
+ Raja trasera
+ </string>
+ <string name="Slit Front">
+ Raja frontal
+ </string>
+ <string name="Slit Left">
+ Raja a la izq.
+ </string>
+ <string name="Slit Right">
+ Raja a la der.
+ </string>
+ <string name="Small">
+ Disminuir
+ </string>
+ <string name="Small Hands">
+ Manos pequeñas
+ </string>
+ <string name="Small Head">
+ Cabeza pequeña
+ </string>
+ <string name="Smooth">
+ Leves
+ </string>
+ <string name="Smooth Hair">
+ Pelo liso
+ </string>
+ <string name="Socks Length">
+ Calcetines: largo
+ </string>
+ <string name="Soulpatch">
+ Perilla
+ </string>
+ <string name="Sparse">
+ Depiladas
+ </string>
+ <string name="Spiked Hair">
+ Crestas
+ </string>
+ <string name="Square">
+ Cuadrada
+ </string>
+ <string name="Square Toe">
+ Punta cuadrada
+ </string>
+ <string name="Squash Head">
+ Cabeza aplastada
+ </string>
+ <string name="Stretch Head">
+ Cabeza estirada
+ </string>
+ <string name="Sunken">
+ Chupadas
+ </string>
+ <string name="Sunken Chest">
+ Estrecho de pecho
+ </string>
+ <string name="Sunken Eyes">
+ Ojos hundidos
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Más
+ </string>
+ <string name="Taper Back">
+ Cubierta trasera
+ </string>
+ <string name="Taper Front">
+ Cubierta frontal
+ </string>
+ <string name="Thick Heels">
+ Tacones grandes
+ </string>
+ <string name="Thick Neck">
+ Cuello ancho
+ </string>
+ <string name="Thick Toe">
+ Empeine alto
+ </string>
+ <string name="Thin">
+ Delgadas
+ </string>
+ <string name="Thin Eyebrows">
+ Cejas finas
+ </string>
+ <string name="Thin Lips">
+ Hacia dentro
+ </string>
+ <string name="Thin Nose">
+ Nariz fina
+ </string>
+ <string name="Tight Chin">
+ Poca papada
+ </string>
+ <string name="Tight Cuffs">
+ Sin campana
+ </string>
+ <string name="Tight Pants">
+ Pantalón ceñido
+ </string>
+ <string name="Tight Shirt">
+ Camisa ceñida
+ </string>
+ <string name="Tight Skirt">
+ Falda ceñida
+ </string>
+ <string name="Tight Sleeves">
+ Puños ceñidos
+ </string>
+ <string name="Toe Shape">
+ Punta: forma
+ </string>
+ <string name="Toe Thickness">
+ Empeine
+ </string>
+ <string name="Torso Length">
+ Torso: longitud
+ </string>
+ <string name="Torso Muscles">
+ Torso: musculatura
+ </string>
+ <string name="Torso Scrawny">
+ Torso flacucho
+ </string>
+ <string name="Unattached">
+ Largos
+ </string>
+ <string name="Uncreased">
+ Abiertos
+ </string>
+ <string name="Underbite">
+ Prognatismo
+ </string>
+ <string name="Unnatural">
+ No natural
+ </string>
+ <string name="Upper Bridge">
+ Puente: arriba
+ </string>
+ <string name="Upper Cheeks">
+ Mejillas: arriba
+ </string>
+ <string name="Upper Chin Cleft">
+ Barbilla: prominencia
+ </string>
+ <string name="Upper Eyelid Fold">
+ Párpados
+ </string>
+ <string name="Upturned">
+ Mucho
+ </string>
+ <string name="Very Red">
+ Del todo
+ </string>
+ <string name="Waist Height">
+ Cintura
+ </string>
+ <string name="Well-Fed">
+ Mofletes
+ </string>
+ <string name="White Hair">
+ Pelo blanco
+ </string>
+ <string name="Wide">
+ Aumentar
+ </string>
+ <string name="Wide Back">
+ Completa
+ </string>
+ <string name="Wide Front">
+ Completa
+ </string>
+ <string name="Wide Lips">
+ Labios anchos
+ </string>
+ <string name="Wild">
+ Total
+ </string>
+ <string name="Wrinkles">
+ Arrugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Añadir a mis hitos
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar mis hitos
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver más información de esta localización
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historial de mis localizaciones
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Región Adulta
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Región Moderada
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Región General
+ </string>
+ <string name="UpdaterWindowTitle">
+ Actualizar [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ Actualizando [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Descargando la actualización...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Descargando la actualización
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Fallo en la descarga de la actualización
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Fallo al instalar la actualización
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Fallo al iniciar el visor
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="IM_logging_string">
+ -- Activado el registro de los mensajes instantáneos --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está escribiendo...
+ </string>
+ <string name="Unnamed">
+ (sin nombre)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: por defecto, desactivada la voz)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Para esta llamada no está disponible el chat de texto.
+ </string>
+ <string name="IM_muted_text_label">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="IM_default_text_label">
+ Pulsa aquí para enviar un mensaje instantáneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
+ </string>
+ <string name="Saved_message">
+ (Guardado [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Han respondido a tu llamada
+ </string>
+ <string name="you_started_call">
+ Has iniciado una llamada de voz
+ </string>
+ <string name="you_joined_call">
+ Has entrado en la llamada de voz
+ </string>
+ <string name="name_started_call">
+ [NAME] inició una llamada de voz
+ </string>
+ <string name="ringing-im">
+ Haciendo la llamada de voz...
+ </string>
+ <string name="connected-im">
+ Conectado, pulsa Colgar para salir
+ </string>
+ <string name="hang_up-im">
+ Se colgó la llamada de voz
+ </string>
+ <string name="conference-title-incoming">
+ Conferencia con [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Ofrecido el item del inventario
+ </string>
+ <string name="no_session_message">
+ (La sesión de MI no existe)
+ </string>
+ <string name="only_user_message">
+ Usted es el único usuario en esta sesión.
+ </string>
+ <string name="offline_message">
+ [NAME] está desconectado.
+ </string>
+ <string name="invite_message">
+ Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
+ </string>
+ <string name="muted_message">
+ Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
+ </string>
+ <string name="generic">
+ Error en lo solicitado, por favor, inténtalo más tarde.
+ </string>
+ <string name="generic_request_error">
+ Error al hacer lo solicitado; por favor, inténtelo más tarde.
+ </string>
+ <string name="insufficient_perms_error">
+ Usted no tiene permisos suficientes.
+ </string>
+ <string name="session_does_not_exist_error">
+ La sesión ya acabó
+ </string>
+ <string name="no_ability_error">
+ Usted no tiene esa capacidad.
+ </string>
+ <string name="no_ability">
+ Usted no tiene esa capacidad.
+ </string>
+ <string name="not_a_mod_error">
+ Usted no es un moderador de la sesión.
+ </string>
+ <string name="muted">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="muted_error">
+ Un moderador del grupo le ha desactivado el chat de texto.
+ </string>
+ <string name="add_session_event">
+ No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="message">
+ No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
+ </string>
+ <string name="mute">
+ Error moderando.
+ </string>
+ <string name="removed">
+ Se te ha sacado del grupo.
+ </string>
+ <string name="removed_from_group">
+ Ha sido eliminado del grupo.
+ </string>
+ <string name="close_on_no_ability">
+ Usted ya no tendrá más la capacidad de estar en la sesión de chat.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Se ha agotado el tiempo del inicio de sesión
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] te ha pagado [AMOUNT] L$ [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] te ha pagado [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars">
+ Has pagado [AMOUNT] L$ a [NAME] por [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Has pagado[AMOUNT] L$
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Has pagado [AMOUNT] L$ a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Has pagado [AMOUNT] L$ por [REASON].
+ </string>
+ <string name="for item">
+ para [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ para una parcela de terreno
+ </string>
+ <string name="for a land access pass">
+ para un pase de acceso a terrenos
+ </string>
+ <string name="for deeding land">
+ for deeding land
+ </string>
+ <string name="to create a group">
+ para crear un grupo
+ </string>
+ <string name="to join a group">
+ para entrar a un grupo
+ </string>
+ <string name="to upload">
+ to upload
+ </string>
+ <string name="to publish a classified ad">
+ para publicar un anuncio clasificado
+ </string>
+ <string name="giving">
+ Dando [AMOUNT] L$
+ </string>
+ <string name="uploading_costs">
+ Subir esto cuesta [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Esto cuesta [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Compra del terreno seleccionado por [AMOUNT] L$
+ </string>
+ <string name="this_object_costs">
+ Este objeto cuesta [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Todos
+ </string>
+ <string name="group_role_officers">
+ Oficiales
+ </string>
+ <string name="group_role_owners">
+ Propietarios
+ </string>
+ <string name="group_member_status_online">
+ Conectado/a
+ </string>
+ <string name="uploading_abuse_report">
+ Subiendo...
+
+Denuncia de infracción
+ </string>
+ <string name="New Shape">
+ Anatomía nueva
+ </string>
+ <string name="New Skin">
+ Piel nueva
+ </string>
+ <string name="New Hair">
+ Pelo nuevo
+ </string>
+ <string name="New Eyes">
+ Ojos nuevos
+ </string>
+ <string name="New Shirt">
+ Camisa nueva
+ </string>
+ <string name="New Pants">
+ Pantalón nuevo
+ </string>
+ <string name="New Shoes">
+ Zapatos nuevos
+ </string>
+ <string name="New Socks">
+ Calcetines nuevos
+ </string>
+ <string name="New Jacket">
+ Chaqueta nueva
+ </string>
+ <string name="New Gloves">
+ Guantes nuevos
+ </string>
+ <string name="New Undershirt">
+ Camiseta nueva
+ </string>
+ <string name="New Underpants">
+ Ropa interior nueva
+ </string>
+ <string name="New Skirt">
+ Falda nueva
+ </string>
+ <string name="New Alpha">
+ Nueva Alfa
+ </string>
+ <string name="New Tattoo">
+ Tatuaje nuevo
+ </string>
+ <string name="New Physics">
+ Nueva física
+ </string>
+ <string name="Invalid Wearable">
+ No se puede poner
+ </string>
+ <string name="New Gesture">
+ Gesto nuevo
+ </string>
+ <string name="New Script">
+ Script nuevo
+ </string>
+ <string name="New Note">
+ Nota nueva
+ </string>
+ <string name="New Folder">
+ Carpeta nueva
+ </string>
+ <string name="Contents">
+ Contenidos
+ </string>
+ <string name="Gesture">
+ Gestos
+ </string>
+ <string name="Male Gestures">
+ Gestos de hombre
+ </string>
+ <string name="Female Gestures">
+ Gestos de mujer
+ </string>
+ <string name="Other Gestures">
+ Otros gestos
+ </string>
+ <string name="Speech Gestures">
+ Gestos al hablar
+ </string>
+ <string name="Common Gestures">
+ Gestos corrientes
+ </string>
+ <string name="Male - Excuse me">
+ Varón - Disculpa
+ </string>
+ <string name="Male - Get lost">
+ Varón – Déjame en paz
+ </string>
+ <string name="Male - Blow kiss">
+ Varón - Lanzar un beso
+ </string>
+ <string name="Male - Boo">
+ Varón - Abucheo
+ </string>
+ <string name="Male - Bored">
+ Varón - Aburrido
+ </string>
+ <string name="Male - Hey">
+ Varón – ¡Eh!
+ </string>
+ <string name="Male - Laugh">
+ Varón - Risa
+ </string>
+ <string name="Male - Repulsed">
+ Varón - Rechazo
+ </string>
+ <string name="Male - Shrug">
+ Varón - Encogimiento de hombros
+ </string>
+ <string name="Male - Stick tougue out">
+ Varón - Sacando la lengua
+ </string>
+ <string name="Male - Wow">
+ Varón - Admiración
+ </string>
+ <string name="Female - Chuckle">
+ Mujer - Risa suave
+ </string>
+ <string name="Female - Cry">
+ Mujer - Llorar
+ </string>
+ <string name="Female - Embarrassed">
+ Mujer - Ruborizada
+ </string>
+ <string name="Female - Excuse me">
+ Mujer - Disculpa
+ </string>
+ <string name="Female - Get lost">
+ Mujer – Déjame en paz
+ </string>
+ <string name="Female - Blow kiss">
+ Mujer - Lanzar un beso
+ </string>
+ <string name="Female - Boo">
+ Mujer - Abucheo
+ </string>
+ <string name="Female - Bored">
+ Mujer - Aburrida
+ </string>
+ <string name="Female - Hey">
+ Mujer - ¡Eh!
+ </string>
+ <string name="Female - Hey baby">
+ Mujer - ¡Eh, encanto!
+ </string>
+ <string name="Female - Laugh">
+ Mujer - Risa
+ </string>
+ <string name="Female - Looking good">
+ Mujer - Buen aspecto
+ </string>
+ <string name="Female - Over here">
+ Mujer - Por aquí
+ </string>
+ <string name="Female - Please">
+ Mujer - Por favor
+ </string>
+ <string name="Female - Repulsed">
+ Mujer - Rechazo
+ </string>
+ <string name="Female - Shrug">
+ Mujer - Encogimiento de hombros
+ </string>
+ <string name="Female - Stick tougue out">
+ Mujer - Sacando la lengua
+ </string>
+ <string name="Female - Wow">
+ Mujer - Admiración
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ninguno/ninguno
+ </string>
+ <string name="texture_load_dimensions_error">
+ No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Parece que hay algún problema que ha escapado a nuestros controles.
+
+ Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
+ Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Dom:Lun:Mar:Mié:Jue:Vie:Sáb
+ </string>
+ <string name="dateTimeMonthNames">
+ Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Membership">
+ Membresía
+ </string>
+ <string name="Roles">
+ Roles
+ </string>
+ <string name="Group Identity">
+ Indentidad de grupo
+ </string>
+ <string name="Parcel Management">
+ Gestión de la parcela
+ </string>
+ <string name="Parcel Identity">
+ Identidad de la parcela
+ </string>
+ <string name="Parcel Settings">
+ Configuración de la parcela
+ </string>
+ <string name="Parcel Powers">
+ Poder de la parcela
+ </string>
+ <string name="Parcel Access">
+ Acceso a la parcela
+ </string>
+ <string name="Parcel Content">
+ Contenido de la parcela
+ </string>
+ <string name="Object Management">
+ Manejo de objetos
+ </string>
+ <string name="Accounting">
+ Contabilidad
+ </string>
+ <string name="Notices">
+ Avisos
+ </string>
+ <string name="Chat" value="Chat :">
+ Chat
+ </string>
+ <string name="DeleteItems">
+ ¿Deseas eliminar los elementos seleccionados?
+ </string>
+ <string name="DeleteItem">
+ ¿Deseas eliminar el elemento seleccionado?
+ </string>
+ <string name="EmptyOutfitText">
+ No hay elementos en este vestuario
+ </string>
+ <string name="ExternalEditorNotSet">
+ Selecciona un editor mediante la configuración de ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ No se encuentra el editor externo especificado.
+Inténtalo incluyendo la ruta de acceso al editor entre comillas
+(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error al analizar el comando de editor externo.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Error al ejecutar el editor externo.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Base
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Añadir
+ </string>
+ <string name="Subtract">
+ Restar
+ </string>
+ <string name="Multiply">
+ Multiplicar
+ </string>
+ <string name="Divide">
+ Dividir
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Viendo balizas de partículas (azules)
+ </string>
+ <string name="BeaconPhysical">
+ Viendo balizas de objetos materiales (verdes)
+ </string>
+ <string name="BeaconScripted">
+ Viendo balizas de objetos con script (rojas)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viendo el objeto con script con balizas de función táctil (rojas)
+ </string>
+ <string name="BeaconSound">
+ Viendo balizas de sonido (amarillas)
+ </string>
+ <string name="BeaconMedia">
+ Viendo balizas de medios (blancas)
+ </string>
+ <string name="ParticleHiding">
+ Ocultando las partículas
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index a33c0344f7..bef41bb1ba 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -411,11 +411,11 @@ texture :
<text name="replace_texture_help">
Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer. Sélectionnez l&apos;image miniature pour choisir une texture différente.
</text>
- <check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
- <text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105">
+ <check_box label="Échelle automatique" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
+ <text name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut.">
Taille :
</text>
- <spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
+ <spinner name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<text name="pixels">
pixels
diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml
index a4b0675fe4..948a3b973d 100644
--- a/indra/newview/skins/default/xui/fr/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml
@@ -1,43 +1,36 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="ENVOYER LA PHOTO PAR E-MAIL">
- <text name="to_label" width="135">
- E-mail du destinataire :
- </text>
- <line_editor left="143" name="to_form" width="130" left_delta="146"/>
- <text name="from_label">
- Votre e-mail :
- </text>
- <line_editor left="143" name="from_form" width="130" left_delta="146"/>
- <text name="name_label">
- Votre nom :
- </text>
- <line_editor left="143" name="name_form" width="130" left_delta="146"/>
- <text name="subject_label">
- Objet :
- </text>
- <line_editor left="143" name="subject_form" width="130" left_delta="146"/>
- <line_editor label="Saisir ici votre objet" name="subject_form"/>
- <text name="msg_label">
- Message :
- </text>
- <check_box label="Publier sur le web" name="allow_publish_check" tool_tip="Publiez cette carte postale sur le web."/>
- <check_box label="Contenu adulte" name="mature_check" tool_tip="Cette carte postale est à caractère adulte."/>
- <button label="?" name="publish_help_btn"/>
- <text_editor name="msg_form">
- Saisir ici votre message
- </text_editor>
- <text name="fine_print">
- Si le destinataire s&apos;inscrit sur [SECOND_LIFE], vous recevrez un bonus.
- </text>
- <button label="Annuler" name="cancel_btn"/>
- <button label="Envoyer" name="send_btn"/>
- <string name="default_subject">
- Carte postale de [SECOND_LIFE].
- </string>
- <string name="default_message">
- Ouvrez-moi !
- </string>
- <string name="upload_message">
- Envoi en cours...
- </string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="ENVOYER LA PHOTO PAR E-MAIL">
+ <text name="to_label">
+ E-mail du destinataire :
+ </text>
+ <text name="from_label">
+ Votre e-mail :
+ </text>
+ <text name="name_label">
+ Votre nom :
+ </text>
+ <text name="subject_label">
+ Objet :
+ </text>
+ <line_editor label="Saisir ici votre objet" name="subject_form"/>
+ <text name="msg_label">
+ Message :
+ </text>
+ <text_editor name="msg_form">
+ Saisir ici votre message
+ </text_editor>
+ <text name="fine_print">
+ Si le destinataire s&apos;inscrit sur [SECOND_LIFE], vous recevrez un bonus.
+ </text>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Envoyer" name="send_btn"/>
+ <string name="default_subject">
+ Carte postale de [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Ouvrez-moi !
+ </string>
+ <string name="upload_message">
+ Envoi en cours...
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
index b14aecafbb..a9407abfde 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Description :
</text>
- <button label="Jouer dans Second Life" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/>
- <button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="125"/>
+ <button label="Jouer dans Second Life" label_selected="Stop" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/>
+ <button label="Jouer localement" label_selected="Stop" left="160" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="120"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index b5ffc8f9c7..b835cc6d87 100644
--- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -5,13 +5,13 @@
<text name="info_parcel_label">
Parcelle :
</text>
- <text name="info_parcel" left="70">
+ <text name="info_parcel">
NOM DE LA PARCELLE
</text>
<text name="info_size_label">
Taille :
</text>
- <text name="info_size" left="70">
+ <text name="info_size">
[AREA] m²
</text>
<text bottom_delta="-60" name="info_action">
@@ -38,27 +38,27 @@
<text name="sell_to_text">
Vendez votre terrain à n&apos;importe qui ou uniquement à un acheteur spécifique.
</text>
- <combo_box bottom_delta="-32" name="sell_to">
+ <combo_box name="sell_to">
<combo_box.item label="- Sélectionnez -" name="--selectone--"/>
<combo_box.item label="Tout le monde" name="Anyone"/>
<combo_box.item label="Personne spécifique :" name="Specificuser:"/>
</combo_box>
- <button label="Sélectionner" name="sell_to_select_agent" width="100"/>
+ <button label="Sélectionner" name="sell_to_select_agent"/>
<text name="sell_objects_label">
3. Vendre les objets avec ce terrain ?
</text>
<text name="sell_objects_text">
Les objets transférables se trouvant sur la parcelle changeront de propriétaire.
</text>
- <radio_group bottom_delta="-54" name="sell_objects" right="430">
+ <radio_group name="sell_objects">
<radio_item label="Non, rester le propriétaire des objets" name="no"/>
<radio_item label="Oui, vendre les objets avec le terrain" name="yes"/>
</radio_group>
- <button label="Afficher les objets" name="show_objects" right="420" width="120"/>
- <text bottom_delta="-30" name="nag_message_label">
+ <button label="Afficher les objets" name="show_objects"/>
+ <text name="nag_message_label" font="SansSerif">
Rappel : Toutes les ventes sont définitives.
</text>
- <button label="Indiquer le terrain à vendre" name="sell_btn" width="165"/>
+ <button label="Indiquer le terrain à vendre" name="sell_btn"/>
<button label="Annuler" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml
index f3b30f7048..3940c43a3d 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml
@@ -142,10 +142,10 @@ consente [AMOUNT2] oggetti
<text name="estate_name_text">
(sconosciuto)
</text>
- <text name="estate_owner_label" right="575" width="120">
+ <text name="estate_owner_label">
Proprietario della regione:
</text>
- <text left="580" name="estate_owner_text" width="155">
+ <text name="estate_owner_text">
(sconosciuto)
</text>
<text name="resellable_changeable_label">
diff --git a/indra/newview/skins/default/xui/it/floater_sell_land.xml b/indra/newview/skins/default/xui/it/floater_sell_land.xml
index 0f8d24ebbd..106ae0373c 100644
--- a/indra/newview/skins/default/xui/it/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_sell_land.xml
@@ -55,7 +55,7 @@
<radio_item label="Si, vendi gli oggetti con la terra" name="yes"/>
</radio_group>
<button label="Mostra oggetti" name="show_objects"/>
- <text name="nag_message_label">
+ <text name="nag_message_label" font="SansSerifSmallBold" left="9">
RICORDA: Tutte le vendite sono definitive.
</text>
<button label="Imposta terreno come in vendita" name="sell_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml
index 939c5e83a0..7d062db23b 100644
--- a/indra/newview/skins/default/xui/it/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml
@@ -39,13 +39,13 @@
<text name="id_text">
ID oggetto:
</text>
- <line_editor font="SansSerifSmall" left="90" name="id_editor" width="280"/>
- <button label="Mostra segnali luminosi" name="show_beacon_btn" width="150"/>
+ <line_editor font="SansSerifSmall" name="id_editor"/>
+ <button label="Mostra segnali luminosi" name="show_beacon_btn"/>
<text name="obj_name_text">
Nome dell&apos;oggetto:
</text>
- <line_editor font="SansSerifSmall" left="90" name="object_name_editor" width="280"/>
- <button label="Filtro" name="filter_object_btn" width="150"/>
+ <line_editor font="SansSerifSmall" name="object_name_editor"/>
+ <button label="Filtro" name="filter_object_btn"/>
<text name="owner_name_text">
Proprietario:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_water.xml b/indra/newview/skins/default/xui/it/floater_water.xml
index c6ab646fbf..b25f0a6266 100644
--- a/indra/newview/skins/default/xui/it/floater_water.xml
+++ b/indra/newview/skins/default/xui/it/floater_water.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Water Floater" title="EDITOR AVANZATO DELL&apos;ACQUA">
- <text name="KeyFramePresetsText" width="224">
+ <text name="KeyFramePresetsText" width="245">
Impostazioni predeterminate dell&apos;acqua:
</text>
- <combo_box left_delta="230" name="WaterPresetsCombo" width="150"/>
+ <combo_box left_delta="245" name="WaterPresetsCombo" width="150"/>
<button label="Nuovo" label_selected="Nuovo" name="WaterNewPreset"/>
<button label="Salva" label_selected="Salva" name="WaterSavePreset"/>
<button label="Cancella" label_selected="Cancella" name="WaterDeletePreset"/>
diff --git a/indra/newview/skins/default/xui/it/floater_windlight_options.xml b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
index 1f6f0fab58..6828d05be0 100644
--- a/indra/newview/skins/default/xui/it/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="WindLight floater" title="EDITOR AVANZATO DEL CIELO">
- <text name="KeyFramePresetsText">
+ <text name="KeyFramePresetsText" width="105">
Cieli predefiniti:
</text>
+ <combo_box left_delta="105" name="WLPresetsCombo"/>
<button label="Nuovo" label_selected="Nuovo" name="WLNewPreset"/>
<button label="Salva" label_selected="Salva" left_delta="72" name="WLSavePreset"/>
<button label="Elimina" label_selected="Elimina" left_delta="72" name="WLDeletePreset"/>
diff --git a/indra/newview/skins/default/xui/it/panel_group_notices.xml b/indra/newview/skins/default/xui/it/panel_group_notices.xml
index 2e2f0dc7b0..524f7d2822 100644
--- a/indra/newview/skins/default/xui/it/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_notices.xml
@@ -25,18 +25,15 @@ Massimo 200 per gruppo al giorno
<text name="lbl">
Crea una notice
</text>
- <text left="20" name="lbl3">
+ <text name="lbl3">
Oggetto:
</text>
- <line_editor left_delta="61" name="create_subject" width="251"/>
- <text left="15" name="lbl4" width="60">
+ <text name="lbl4">
Messaggio:
</text>
- <text_editor left_delta="66" name="create_message" width="330"/>
- <text name="lbl5" width="68">
+ <text name="lbl5">
Allega:
</text>
- <line_editor left_delta="74" name="create_inventory_name" width="190"/>
<text name="string">
Trascina e rilascia qui l&apos;oggetto da allegare:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
index 5ed7b23679..f11b2415ee 100644
--- a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
@@ -22,7 +22,7 @@
<text name="media_setting_note">
Nota: I residenti possono annullare questa impostazione
</text>
- <check_box initial_value="false" label="Messa in scala automatica dell&apos;elemento multimediale sulla faccia dell&apos;oggetto" name="auto_scale"/>
+ <check_box initial_value="false" label="Messa in scala automatica dell&apos;elemento multimediale sulla &#10;faccia dell&apos;oggetto" name="auto_scale"/>
<text name="size_label">
Dimensioni:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_about.xml b/indra/newview/skins/default/xui/nl/floater_about.xml
index f543ebbbe3..4e22d865fe 100644
--- a/indra/newview/skins/default/xui/nl/floater_about.xml
+++ b/indra/newview/skins/default/xui/nl/floater_about.xml
@@ -8,7 +8,7 @@
Gemaakt met [COMPILER] versie [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- U bent op [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] gelegen op [HOSTNAME] ([HOSTIP])
+ U bent op [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] gelegen op &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_notices.xml b/indra/newview/skins/default/xui/nl/panel_group_notices.xml
index 134261197a..a1929bb5e1 100644
--- a/indra/newview/skins/default/xui/nl/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/nl/panel_group_notices.xml
@@ -30,16 +30,13 @@
<text name="lbl2">
U kunt een enkel item aan een bericht toevoegen door het van uw inventaris naar dit paneel te slepen. Bevestigde items moeten kopieerbaar en overdraagbaar zijn en u kunt geen mappen versturen.
</text>
- <text bottom_delta="-79" halign="right" left="10" name="lbl3" width="60">
+ <text name="lbl3">
Onderwerp:
</text>
- <line_editor name="create_subject" width="331" left_delta="71"/>
- <text bottom_delta="-18" halign="right" left="10" name="lbl4" width="60">
+ <text name="lbl4">
Bericht:
</text>
- <text_editor name="create_message" bottom_delta="-90" height="104" left_delta="71" width="330"/>
- <line_editor name="create_inventory_name" width="190" left_delta="71"/>
- <text name="lbl5" left="10">
+ <text name="lbl5">
Bevestig:
</text>
<button label="Verwijder bevestiging" label_selected="Verwijder bevestiging" name="remove_attachment"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
index 6ce6914771..d276b1f63a 100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Opis:
</text>
- <button label="Uruchom in-world" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Uruchom animację by widzieli ją pozostali Rezydenci" width="131"/>
- <button label="Używaj lokalnie" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Uruchom animację widoczną tylko przez Ciebie" width="125"/>
+ <button label="Uruchom in-world" label_selected="Stop" name="Anim play btn" tool_tip="Uruchom animację by widzieli ją pozostali Rezydenci" width="131"/>
+ <button label="Używaj lokalnie" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Uruchom animację widoczną tylko przez Ciebie" width="120"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_notices.xml b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
index 5b62d13880..a3b0998de3 100644
--- a/indra/newview/skins/default/xui/pl/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
@@ -47,7 +47,7 @@ Limit dzienny ogłoszeń dla grupy wynosi 200.
Ogłoszenia zachowane
</text>
<text name="lbl2">
- W celu wysłania nowego ogłoszenia kliknij przycisk +
+ W celu wysłania nowego ogłoszenia kliknij + Stwórz ogłoszenie
</text>
<text name="lbl3">
Temat:
diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
index da3142b54e..7e95c4942f 100644
--- a/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Ochrona" name="Media Settings Security">
<check_box initial_value="false" label="Dostęp dozwolony tylko dla wybranych URL" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Wejścia na stronę WWW, które się nie powiodły są zaznaczone:
+ Wejścia na stronę WWW, które się nie powiodły są
+zaznaczone:
</text>
<button label="Dodaj" name="whitelist_add"/>
<button label="Usuń" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index a2f9b4176e..5af2fed142 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -9,7 +9,7 @@
</text>
<check_box label="Pokaż mój profil w wynikach wyszukiwarki" name="online_searchresults"/>
<check_box label="Mój status online jest dostępny tylko dla znajomych i grup do których należę" name="online_visibility"/>
- <check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla znajomych i grup do których należę" name="voice_call_friends_only_check"/>
+ <check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla &#10;znajomych i grup do których należę" name="voice_call_friends_only_check" top_pad="15"/>
<check_box label="Wyłącz mikrofon po zakończeniu rozmowy głosowej" name="auto_disengage_mic_check"/>
<check_box label="Pokaż moje ulubione landmarki przy logowaniu (w rozwijanym menu &apos;Rozpocznij w&apos;)" name="favorites_on_login_check"/>
<text name="Logs:">
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index ac365f1702..a9da2a18af 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -7,7 +7,7 @@
Construído com [COMPILER] versão [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em [HOSTNAME]&lt;/nolink&gt;([HOSTIP])
+ Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
diff --git a/indra/newview/skins/default/xui/pt/floater_build_options.xml b/indra/newview/skins/default/xui/pt/floater_build_options.xml
index 71a1483dde..666e185819 100644
--- a/indra/newview/skins/default/xui/pt/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_build_options.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPÇÕES DE GRADE">
- <spinner label="Unidade da grade (metros)" label_width="122" name="GridResolution" width="180"/>
- <spinner label="Ext. da Grade (metros)" label_width="122" name="GridDrawSize" width="180"/>
+ <spinner label="Unidade da grade (metros)" name="GridResolution"/>
+ <spinner label="Ext. da Grade (metros)" name="GridDrawSize"/>
<check_box label="Encaixar em sub-unidades" name="GridSubUnit"/>
<check_box label="Ver corte transversal" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Opacidade da grade">
Opacidade:
</text>
- <slider label="Opacidade da grade" name="GridOpacity" width="220"/>
+ <slider label="Opacidade da grade" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
index 5c5ee3b7a0..258c95cc7d 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
@@ -127,25 +127,25 @@ contribuídas para cobrir este lote antes da aquisição se completar.
<text name="region_name_label">
Região:
</text>
- <text left="560" name="region_name_text">
+ <text name="region_name_text">
(desconhecido)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text left="560" name="region_type_text">
+ <text name="region_type_text">
(desconhecido)
</text>
<text name="estate_name_label">
Propriedade:
</text>
- <text left="560" name="estate_name_text">
+ <text name="estate_name_text">
(desconhecido)
</text>
- <text name="estate_owner_label" right="565" width="105">
+ <text name="estate_owner_label">
Dono da propriedade:
</text>
- <text left="560" name="estate_owner_text">
+ <text name="estate_owner_text">
(desconhecido)
</text>
<text name="resellable_changeable_label">
@@ -160,11 +160,11 @@ contribuídas para cobrir este lote antes da aquisição se completar.
<text name="covenant_text">
Você deve concordar com o Corretor da Propriedade:
</text>
- <text left="470" name="covenant_timestamp_text"/>
+ <text name="covenant_timestamp_text"/>
<text_editor name="covenant_editor">
Carregando...
</text_editor>
- <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant"/>
+ <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant" left="-330"/>
<text name="info_parcel_label">
Lote:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_image_preview.xml b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
index 3582923ed0..362a553d64 100644
--- a/indra/newview/skins/default/xui/pt/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
@@ -10,7 +10,7 @@
Prévia da
imagem como:
</text>
- <combo_box label="Tipo de Roupas" left="100" name="clothing_type_combo" width="186">
+ <combo_box label="Tipo de Roupas" name="clothing_type_combo">
<item label="Imagem" name="Image" value="Imagem"/>
<item label="Cabelo" name="Hair" value="Cabelo"/>
<item label="Cabeça de mulher" name="FemaleHead" value="Cabeça de mulher"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
index b66159354f..b650b7945c 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Descrição:
</text>
- <button label="Tocar inworld" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Tocar essa animação de forma que outros possam ver" width="131"/>
- <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Tocar essa animação de forma que apenas você possa ver" width="125"/>
+ <button label="Tocar inworld" label_selected="Parar" name="Anim play btn" tool_tip="Tocar essa animação de forma que outros possam ver" width="131"/>
+ <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Tocar essa animação de forma que apenas você possa ver" width="120"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
index 80bdbb0fb4..b134dfeefa 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
@@ -1,75 +1,74 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gesture_preview">
- <floater.string name="step_anim">
- Executar animação:
- </floater.string>
- <floater.string name="step_sound">
- Executar som:
- </floater.string>
- <floater.string name="step_chat">
- Executar bate-papo:
- </floater.string>
- <floater.string name="step_wait">
- Pausa
- </floater.string>
- <floater.string name="stop_txt">
- Parar
- </floater.string>
- <floater.string name="preview_txt">
- Prévia
- </floater.string>
- <floater.string name="none_text">
- -- Nenhum --
- </floater.string>
- <floater.string name="Title">
- Gesto: [NAME]
- </floater.string>
- <text name="desc_label">
- Descrição:
- </text>
- <text name="trigger_label">
- Gatilho:
- </text>
- <text name="replace_text" tool_tip="Substituir a(s) palavra(s) de gatilho por estas palavras. Por exemplo, o gatilho &apos;oi&apos; substituído por &apos;olá&apos;, mudará a conversa de &apos;Eu digo oi&apos; para &apos;Eu digo olá&apos; e também executando o gesto!">
- Trocar por:
- </text>
- <line_editor name="replace_editor" tool_tip="Substituir a(s) palavra(s) gatilho por estas palavras. Por exemplo, o gatilho &apos;oi&apos; substituído por &apos;olá&apos;, mudará a conversa de &apos;Eu digo oi&apos; para &apos;Eu digo olá&apos; e também executando o gesto!"/>
- <text name="key_label">
- Atalho:
- </text>
- <combo_box label="Nenhum" left="116" name="modifier_combo" width="76"/>
- <combo_box label="Nenhum" left_delta="80" name="key_combo" width="76"/>
- <text name="library_label">
- Biblioteca:
- </text>
- <scroll_list name="library_list" width="84">
- <scroll_list.rows name="action_animation" value="Animação"/>
- <scroll_list.rows name="action_sound" value="Som"/>
- <scroll_list.rows name="action_chat" value="Bate-papo"/>
- <scroll_list.rows name="action_wait" value="Espere"/>
- </scroll_list>
- <button label="Incluir" left="118" name="add_btn" width="87"/>
- <text name="steps_label">
- Passos:
- </text>
- <scroll_list left="226" name="step_list" width="205"/>
- <button label="P/ cima" left_delta="-13" name="up_btn" width="114"/>
- <button label="P/ baixo" name="down_btn" width="114"/>
- <button label="Remover" left_delta="13" name="delete_btn" width="84"/>
- <text name="options_text">
- (opções)
- </text>
- <radio_group name="animation_trigger_type">
- <radio_item label="Iniciar" name="start"/>
- <radio_item label="Parar" name="stop"/>
- </radio_group>
- <check_box bottom_delta="34" label="até que as animações estejam concluídas" name="wait_anim_check"/>
- <check_box bottom_delta="-30" label="segundos:" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor"/>
- <text name="help_label">
- Se não incluir uma pausa, todas as etapas ocorrem ao mesmo tempo.
- </text>
- <check_box label="Ativar" name="active_check" tool_tip="Gestos podem ser ativados escrevendo suas frases de gatilho no chat ou teclando o atalho. Gestos normalmente ficam inativos quando existe um conflito nas teclas de atalho."/>
- <button label="Prévia" name="preview_btn"/>
- <button label="Salvar" name="save_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gesture_preview">
+ <floater.string name="step_anim">
+ Executar animação:
+ </floater.string>
+ <floater.string name="step_sound">
+ Executar som:
+ </floater.string>
+ <floater.string name="step_chat">
+ Executar bate-papo:
+ </floater.string>
+ <floater.string name="step_wait">
+ Pausa
+ </floater.string>
+ <floater.string name="stop_txt">
+ Parar
+ </floater.string>
+ <floater.string name="preview_txt">
+ Prévia
+ </floater.string>
+ <floater.string name="none_text">
+ -- Nenhum --
+ </floater.string>
+ <floater.string name="Title">
+ Gesto: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ Descrição:
+ </text>
+ <text name="trigger_label">
+ Gatilho:
+ </text>
+ <text name="replace_text" tool_tip="Substituir a(s) palavra(s) de gatilho por estas palavras. Por exemplo, o gatilho &apos;oi&apos; substituído por &apos;olá&apos;, mudará a conversa de &apos;Eu digo oi&apos; para &apos;Eu digo olá&apos; e também executando o gesto!">
+ Trocar por:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Substituir a(s) palavra(s) gatilho por estas palavras. Por exemplo, o gatilho &apos;oi&apos; substituído por &apos;olá&apos;, mudará a conversa de &apos;Eu digo oi&apos; para &apos;Eu digo olá&apos; e também executando o gesto!"/>
+ <text name="key_label">
+ Atalho:
+ </text>
+ <combo_box label="Nenhum" name="modifier_combo" width="68"/>
+ <combo_box label="Nenhum" name="key_combo" width="48"/>
+ <text name="library_label">
+ Biblioteca:
+ </text>
+ <scroll_list name="library_list">
+ <scroll_list.rows name="action_animation" value="Animação"/>
+ <scroll_list.rows name="action_sound" value="Som"/>
+ <scroll_list.rows name="action_chat" value="Bate-papo"/>
+ <scroll_list.rows name="action_wait" value="Espere"/>
+ </scroll_list>
+ <button label="Incluir" name="add_btn"/>
+ <text name="steps_label">
+ Passos:
+ </text>
+ <button label="P/ cima" name="up_btn" />
+ <button label="P/ baixo" name="down_btn"/>
+ <button label="Remover" name="delete_btn"/>
+ <text name="options_text">
+ (opções)
+ </text>
+ <radio_group name="animation_trigger_type">
+ <radio_item label="Iniciar" name="start"/>
+ <radio_item label="Parar" name="stop"/>
+ </radio_group>
+ <check_box label="até que as animações estejam concluídas" name="wait_anim_check"/>
+ <check_box label="segundos:" name="wait_time_check"/>
+ <line_editor name="wait_time_editor"/>
+ <text name="help_label">
+ Se não incluir uma pausa, todas as etapas ocorrem ao mesmo tempo.
+ </text>
+ <check_box label="Ativar" name="active_check" tool_tip="Gestos podem ser ativados escrevendo suas frases de gatilho no chat ou teclando o atalho. Gestos normalmente ficam inativos quando existe um conflito nas teclas de atalho."/>
+ <button label="Prévia" name="preview_btn"/>
+ <button label="Salvar" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sell_land.xml b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
index e6d4dc7ed6..014ae0845e 100644
--- a/indra/newview/skins/default/xui/pt/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
@@ -55,8 +55,9 @@
<radio_item label="Sim, vender o terreno com os objetos" name="yes"/>
</radio_group>
<button label="Mostrar objetos" name="show_objects"/>
- <text name="nag_message_label">
- LEMBRE-SE: Qualquer transação de compra e venda é irreversível.
+ <text name="nag_message_label" font="SansSerifSmallBold">
+ LEMBRE-SE: Qualquer transação de compra
+e venda é irreversível.
</text>
<button label="Colocar terreno à venda" name="sell_btn"/>
<button label="Cancelar" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
index dc3bf73818..c3d5820616 100644
--- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
@@ -39,14 +39,14 @@
<text name="id_text">
ID do Objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
+ <line_editor font="SansSerifSmall" name="id_editor"/>
<button label="Mostrar Avisos" name="show_beacon_btn"/>
<text name="obj_name_text">
Nome do objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
+ <line_editor font="SansSerifSmall" name="object_name_editor"/>
<button label="Filtro" name="filter_object_btn"/>
- <text name="owner_name_text" width="130">
+ <text name="owner_name_text">
Proprietário:
</text>
<line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml
index b4613e0890..b2a06f4ff2 100644
--- a/indra/newview/skins/default/xui/pt/floater_water.xml
+++ b/indra/newview/skins/default/xui/pt/floater_water.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Water Floater" title="EDITOR DE ÁGUA AVANÇADO">
- <text name="KeyFramePresetsText" width="154">
+ <text name="KeyFramePresetsText" width="175">
Pré-configurações da Água:
</text>
- <combo_box left_delta="160" name="WaterPresetsCombo" width="150"/>
+ <combo_box left_delta="175" name="WaterPresetsCombo" width="150"/>
<button label="Novo" label_selected="Novo" name="WaterNewPreset"/>
<button label="Salvar" label_selected="Salvar" name="WaterSavePreset"/>
<button label="Deletar" label_selected="Deletar" name="WaterDeletePreset"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
index 22632a4ef8..ec459bbb26 100644
--- a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="WindLight floater" title="EDITOR DE CÉU AVANÇADO">
- <text name="KeyFramePresetsText" width="130">
+ <text name="KeyFramePresetsText" width="140">
Pré-definições de Céu:
</text>
- <combo_box left_delta="130" name="WLPresetsCombo"/>
+ <combo_box left_delta="140" name="WLPresetsCombo"/>
<button label="Novo" label_selected="Novo" name="WLNewPreset"/>
<button label="Salvar" label_selected="Salvar" left_delta="72" name="WLSavePreset"/>
<button label="Deletar" label_selected="Deletar" left_delta="72" name="WLDeletePreset"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_notices.xml b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
index 21136d06fb..3bff1f8fb3 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
@@ -24,18 +24,15 @@ Cada grupo pode enviar no máximo 200 avisos/dia
<text name="lbl">
Criar notícia
</text>
- <text left="20" name="lbl3">
+ <text name="lbl3">
Assunto:
</text>
- <line_editor left_delta="61" name="create_subject" width="251"/>
- <text left="15" name="lbl4" width="60">
+ <text name="lbl4">
Mensagem:
</text>
- <text_editor left_delta="66" name="create_message" width="330"/>
- <text name="lbl5" width="68">
+ <text name="lbl5">
Anexo:
</text>
- <line_editor left_delta="74" name="create_inventory_name" width="190"/>
<text name="string">
Arrastar e soltar o item aqui para anexá-lo:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
index 646969946c..e38c44d8fe 100644
--- a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Segurança" name="Media Settings Security">
<check_box initial_value="false" label="Acesso permitido a URLs com padrão específico" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- URLs com falha de acesso na página inicial são indicados com um:
+ URLs com falha de acesso na página inicial são
+indicados com um:
</text>
<button label="Adicionar" name="whitelist_add"/>
<button label="Excluir" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_aaa.xml b/indra/newview/skins/default/xui/zh/floater_aaa.xml
new file mode 100644
index 0000000000..c62fc8b5d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_aaa.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="TEST FLOATER">
+ <string name="test_the_vlt">
+ This string CHANGE2 is extracted.
+ </string>
+ <string name="testing_eli">
+ Just a test. changes.
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml
new file mode 100644
index 0000000000..825fe13e92
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_about.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="ABOUT [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Built with [COMPILER] version [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Memory: [MEMORY_MB] MB
+OS Version: [OS_VERSION]
+Graphics Card Vendor: [GRAPHICS_CARD_VENDOR]
+Graphics Card: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL Version: [OPENGL_VERSION]
+
+libcurl Version: [LIBCURL_VERSION]
+J2C Decoder Version: [J2C_VERSION]
+Audio Driver Version: [AUDIO_DRIVER_VERSION]
+Qt Webkit Version: [QT_WEBKIT_VERSION]
+Voice Server Version: [VOICE_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (無)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="資訊" name="support_panel">
+ <button label="覆製到剪貼簿" name="copy_btn"/>
+ </panel>
+ <panel label="Credits" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life is brought to you by ..., and many others.
+
+Thank you to the following Residents for helping to ensure that this is the best version yet: ..., and many others.
+
+
+
+
+&quot;The work goes on, the cause endures, the hope still lives, and the dreams shall never die&quot; - Edward Kennedy
+ </text_editor>
+ </panel>
+ <panel label="Licenses" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+APR Copyright (C) 2000-2004 The Apache Software Foundation
+cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+GL Copyright (C) 1999-2004 Brian Paul.
+google-perftools Copyright (c) 2005, Google Inc.
+Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ogg/vorbis Copyright (C) 2001, Xiphophorus
+OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+Pth Copyright (C) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;
+SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+google-perftools Copyright (c) 2005, Google Inc.
+
+All rights reserved. See licenses.txt for details.
+
+Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ </text_editor>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_about_land.xml b/indra/newview/skins/default/xui/zh/floater_about_land.xml
new file mode 100644
index 0000000000..4e5c4f96f0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_about_land.xml
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="關於土地">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] minutes
+ </floater.string>
+ <floater.string name="Minute">
+ minute
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] seconds
+ </floater.string>
+ <floater.string name="Remaining">
+ remaining
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="一般" name="land_general_panel">
+ <panel.string name="new users only">
+ New Residents only
+ </panel.string>
+ <panel.string name="anyone">
+ Anyone
+ </panel.string>
+ <panel.string name="area_text">
+ Area
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Auction ID: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ You must approve your purchase to modify this land.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Group Owned)
+ </panel.string>
+ <panel.string name="profile_text">
+ Profile
+ </panel.string>
+ <panel.string name="info_text">
+ 資訊
+ </panel.string>
+ <panel.string name="public_text">
+ (公開)
+ </panel.string>
+ <panel.string name="none_text">
+ (無)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Sale Pending)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ No parcel selected.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="Name:">
+ 名稱:
+ </text>
+ <text name="Description:">
+ 描述:
+ </text>
+ <text name="LandType">
+ 類型:
+ </text>
+ <text name="LandTypeText">
+ Mainland / Homestead
+ </text>
+ <text name="ContentRating">
+ 分級:
+ </text>
+ <text name="ContentRatingText">
+ Adult
+ </text>
+ <text name="Owner:">
+ 擁有者:
+ </text>
+ <text name="Group:">
+ Group:
+ </text>
+ <button label="設定" name="Set..."/>
+ <check_box label="Allow Deed to Group" name="check deed" tool_tip="A group officer can deed this land to the group, so it will be supported by the group&apos;s land allocation."/>
+ <button label="Deed" name="Deed..." tool_tip="You may only deed land if you are an officer in the selected group."/>
+ <check_box label="Owner Makes Contribution With Deed" name="check contrib" tool_tip="When the land is deeded to the group, the former owner contributes enough land allocation to support it."/>
+ <text name="For Sale:">
+ 出售:
+ </text>
+ <text name="Not for sale.">
+ Not for sale
+ </text>
+ <text name="For Sale: Price L$[PRICE].">
+ Price: L$[PRICE] (L$[PRICE_PER_SQM]/m²)
+ </text>
+ <button label="Sell Land" name="Sell Land..."/>
+ <text name="For sale to">
+ 出售給:[BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel.">
+ Objects included in sale
+ </text>
+ <text name="Selling with no objects in parcel.">
+ Objects not included in sale
+ </text>
+ <button label="Cancel Land Sale" label_selected="Cancel Land Sale" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ Claimed:
+ </text>
+ <text name="DateClaimText">
+ Tue Aug 15 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ 面積:
+ </text>
+ <text name="PriceText">
+ 4048 m²
+ </text>
+ <text name="Traffic:">
+ 流量:
+ </text>
+ <text name="DwellText">
+ 0
+ </text>
+ <button label="購買土地" name="Buy Land..."/>
+ <button label="Script Info" name="Scripts..."/>
+ <button label="Buy For Group" name="Buy For Group..."/>
+ <button label="Buy Pass" name="Buy Pass..." tool_tip="A pass gives you temporary access to this land."/>
+ <button label="Abandon Land" name="Abandon Land..."/>
+ <button label="Reclaim Land" name="Reclaim Land..."/>
+ <button label="Linden Sale" name="Linden Sale..." tool_tip="Land must be owned, set content, and not already for auction."/>
+ </panel>
+ <panel label="契約" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Purchased land in this region may be resold.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </panel.string>
+ <panel.string name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </panel.string>
+ <text name="estate_section_lbl">
+ 領地:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ 擁有者:
+ </text>
+ <text name="estate_owner_text">
+ (無)
+ </text>
+ <text_editor name="covenant_editor">
+ There is no Covenant provided for this Estate.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ Last Modified Wed Dec 31 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ 地區:
+ </text>
+ <text name="region_name_text">
+ EricaVille
+ </text>
+ <text name="region_landtype_lbl">
+ 類型:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ 分級:
+ </text>
+ <text name="region_maturity_text">
+ Adult
+ </text>
+ <text name="resellable_lbl">
+ Resale:
+ </text>
+ <text name="resellable_clause">
+ Land in this region may not be resold.
+ </text>
+ <text name="changeable_lbl">
+ Subdivide:
+ </text>
+ <text name="changeable_clause">
+ Land in this region may not be joined/subdivided.
+ </text>
+ </panel>
+ <panel label="OBJECTS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] out of [MAX] ([AVAILABLE] available)
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] out of [MAX] ([DELETED] will be deleted)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ Region Object Bonus Factor: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ Primitive usage:
+ </text>
+ <text name="objects_available">
+ [COUNT] out of [MAX] ([AVAILABLE] available)
+ </text>
+ <text name="Primitives parcel supports:">
+ Prims parcel supports:
+ </text>
+ <text name="object_contrib_text">
+ [COUNT]
+ </text>
+ <text name="Primitives on parcel:">
+ Prims on parcel:
+ </text>
+ <text name="total_objects_text">
+ [COUNT]
+ </text>
+ <text name="Owned by parcel owner:">
+ Owned by parcel owner:
+ </text>
+ <text name="owner_objects_text">
+ [COUNT]
+ </text>
+ <button label="Show" label_selected="Show" name="ShowOwner"/>
+ <button label="Return" name="ReturnOwner..." tool_tip="Return objects to their owners."/>
+ <text name="Set to group:">
+ Set to group:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="Show" label_selected="Show" name="ShowGroup"/>
+ <button label="Return" name="ReturnGroup..." tool_tip="Return objects to their owners."/>
+ <text name="Owned by others:">
+ Owned by others:
+ </text>
+ <text name="other_objects_text">
+ [COUNT]
+ </text>
+ <button label="Show" label_selected="Show" name="ShowOther"/>
+ <button label="Return" name="ReturnOther..." tool_tip="Return objects to their owners."/>
+ <text name="Selected / sat upon:">
+ Selected / sat upon:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ Auto return other Residents&apos; objects (minutes, 0 for off):
+ </text>
+ <text name="Object Owners:">
+ Object Owners:
+ </text>
+ <button name="Refresh List" tool_tip="Refresh Object List"/>
+ <button label="退回物件" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Type" name="type"/>
+ <name_list.columns label="名稱" name="name"/>
+ <name_list.columns label="Count" name="count"/>
+ <name_list.columns label="Most Recent" name="mostrecent"/>
+ </name_list>
+ </panel>
+ <panel label="OPTIONS" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Let people see this parcel in search results
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ This option is disabled because this parcel&apos;s area is 128 m² or smaller.
+Only large parcels can be listed in search.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ This option is disabled because you cannot modify this parcel&apos;s options.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Moderate Content
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Adult Content
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Your parcel information or content is considered moderate.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Your parcel information or content is considered adult.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (無)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ No Pushing
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ No Pushing (Region Override)
+ </panel.string>
+ <text name="allow_label">
+ Allow other Residents to:
+ </text>
+ <check_box label="Edit Terrain" name="edit land check" tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."/>
+ <check_box label="Fly" name="check fly" tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."/>
+ <text name="allow_label2">
+ Build:
+ </text>
+ <check_box label="Everyone" name="edit objects check"/>
+ <check_box label="Group" name="edit group objects check"/>
+ <text name="allow_label3">
+ Object Entry:
+ </text>
+ <check_box label="Everyone" name="all object entry check"/>
+ <check_box label="Group" name="group object entry check"/>
+ <text name="allow_label4">
+ Run Scripts:
+ </text>
+ <check_box label="Everyone" name="check other scripts"/>
+ <check_box label="Group" name="check group scripts"/>
+ <text name="land_options_label">
+ Land Options:
+ </text>
+ <check_box label="Safe (no damage)" name="check safe" tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."/>
+ <check_box label="No Pushing" name="PushRestrictCheck" tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."/>
+ <check_box label="Show Place in Search (L$30/week)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
+ <combo_box name="land category with adult">
+ <combo_box.item label="Any Category" name="item0"/>
+ <combo_box.item label="Linden Location" name="item1"/>
+ <combo_box.item label="Adult" name="item2"/>
+ <combo_box.item label="Arts &amp; Culture" name="item3"/>
+ <combo_box.item label="Business" name="item4"/>
+ <combo_box.item label="Educational" name="item5"/>
+ <combo_box.item label="Gaming" name="item6"/>
+ <combo_box.item label="聚會所" name="item7"/>
+ <combo_box.item label="Newcomer Friendly" name="item8"/>
+ <combo_box.item label="Parks &amp; Nature" name="item9"/>
+ <combo_box.item label="Residential" name="item10"/>
+ <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Rental" name="item13"/>
+ <combo_box.item label="Other" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="Any Category" name="item0"/>
+ <combo_box.item label="Linden Location" name="item1"/>
+ <combo_box.item label="Arts &amp; Culture" name="item3"/>
+ <combo_box.item label="Business" name="item4"/>
+ <combo_box.item label="Educational" name="item5"/>
+ <combo_box.item label="Gaming" name="item6"/>
+ <combo_box.item label="聚會所" name="item7"/>
+ <combo_box.item label="Newcomer Friendly" name="item8"/>
+ <combo_box.item label="Parks &amp; Nature" name="item9"/>
+ <combo_box.item label="Residential" name="item10"/>
+ <combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Rental" name="item13"/>
+ <combo_box.item label="Other" name="item12"/>
+ </combo_box>
+ <check_box label="Moderate Content" name="MatureCheck" tool_tip=" "/>
+ <text name="Snapshot:">
+ Snapshot:
+ </text>
+ <texture_picker name="snapshot_ctrl" tool_tip="點擊以挑選圖片"/>
+ <text name="landing_point">
+ Landing Point: [LANDING]
+ </text>
+ <button label="設定" label_selected="設定" name="Set" tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."/>
+ <button label="清除" label_selected="清除" name="Clear" tool_tip="清除登陸點"/>
+ <text name="Teleport Routing: ">
+ Teleport Routing:
+ </text>
+ <combo_box name="landing type" tool_tip="Teleport Routing -- select how to handle teleports onto your land">
+ <combo_box.item label="Blocked" name="Blocked"/>
+ <combo_box.item label="Landing Point" name="LandingPoint"/>
+ <combo_box.item label="Anywhere" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="MEDIA" name="land_media_panel">
+ <text name="with media:">
+ 類型:
+ </text>
+ <combo_box name="media type" tool_tip="Specify if the URL is a movie, web page, or other media"/>
+ <text name="at URL:">
+ Home Page:
+ </text>
+ <button label="設定" name="set_media_url"/>
+ <text name="Description:">
+ 描述:
+ </text>
+ <line_editor name="url_description" tool_tip="Text displayed next to play/load button"/>
+ <text name="Media texture:">
+ Replace Texture:
+ </text>
+ <texture_picker name="media texture" tool_tip="點擊以挑選圖片"/>
+ <text name="replace_texture_help">
+ Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture.
+ </text>
+ <check_box label="Auto scale" name="media_auto_scale" tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required."/>
+ <text name="media_size" tool_tip="Size to render Web media, leave 0 for default.">
+ Size:
+ </text>
+ <spinner name="media_size_width" tool_tip="Size to render Web media, leave 0 for default."/>
+ <spinner name="media_size_height" tool_tip="Size to render Web media, leave 0 for default."/>
+ <text name="pixels">
+ pixels
+ </text>
+ <text name="Options:">
+ Options:
+ </text>
+ <check_box label="Loop" name="media_loop" tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning."/>
+ </panel>
+ <panel label="SOUND" name="land_audio_panel">
+ <text name="MusicURL:">
+ Music URL:
+ </text>
+ <text name="Sound:">
+ Sound:
+ </text>
+ <check_box label="Restrict gesture and object sounds to this parcel" name="check sound local"/>
+ <text name="Voice settings:">
+ Voice:
+ </text>
+ <check_box label="Enable Voice" name="parcel_enable_voice_channel"/>
+ <check_box label="Enable Voice (established by the Estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Restrict Voice to this parcel" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ACCESS" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Defined by the Estate)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Allow Public Access ([MATURITY]) (Note: Unchecking this will create ban lines)
+ </panel.string>
+ <panel.string name="estate_override">
+ One or more of these options is set at the estate level
+ </panel.string>
+ <text name="Limit access to this parcel to:">
+ Access To This Parcel
+ </text>
+ <text name="Only Allow">
+ Restrict Access to Residents verified by:
+ </text>
+ <check_box label="Payment Information on File [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Ban unidentified Residents."/>
+ <check_box label="年齡驗證 [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."/>
+ <check_box label="Allow Group Access: [GROUP]" name="GroupCheck" tool_tip="Set group in the General tab."/>
+ <check_box label="Sell passes to:" name="PassCheck" tool_tip="Allows temporary access to this parcel"/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Anyone" name="Anyone"/>
+ <combo_box.item label="Group" name="Group"/>
+ </combo_box>
+ <spinner label="Price in L$:" name="PriceSpin"/>
+ <spinner label="Hours of access:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Always Allow" name="AllowedText">
+ Allowed Residents
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] listed, [MAX] max)"/>
+ <button label="Add" name="add_allowed"/>
+ <button label="Remove" label_selected="Remove" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Ban" name="BanCheck">
+ Banned Residents
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] listed, [MAX] max)"/>
+ <button label="Add" name="add_banned"/>
+ <button label="Remove" label_selected="Remove" name="remove_banned"/>
+ </panel>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_activeim.xml b/indra/newview/skins/default/xui/zh/floater_activeim.xml
new file mode 100644
index 0000000000..93017bf5b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="ACTIVE IM"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_animation_preview.xml b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml
new file mode 100644
index 0000000000..0f1feaa843
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Failed to initialize motion
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animation file is [LENGTH] seconds in length.
+
+Maximum animation length is [MAX_LENGTH] seconds.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Unable to read animation file.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ 確定
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Premature end of file.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Cannot read constraint definition.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Cannot open BVH file.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Invalid HIERARCHY header.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Cannot find ROOT or JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Cannot get JOINT name.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Cannot find OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Cannot find CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Cannot get rotation order.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Cannot get rotation axis.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Cannot find MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Cannot get number of frames.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Cannot get frame time.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Cannot get position values.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Cannot get rotation values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Cannot open translation file.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Cannot read translation header.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Cannot read translation names.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Cannot read translation ignore value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Cannot read translation relative value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Cannot read translation outname value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Cannot read translation matrix.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Cannot get mergechild name.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Cannot get mergeparent name.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Cannot get priority value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Cannot get loop value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Cannot get easeIn values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Cannot get easeOut values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Cannot get hand morph value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Cannot read emote name.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Incorrect root joint name, use &quot;hip&quot;.
+ </floater.string>
+ <text name="name_label">
+ 名稱:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <spinner label="Priority" name="priority" tool_tip="Controls which other animations can be overridden by this animation"/>
+ <check_box label="Loop" name="loop_check" tool_tip="Makes this animation loop"/>
+ <spinner label="In(%)" name="loop_in_point" tool_tip="Sets point in animation that looping returns to"/>
+ <spinner label="Out(%)" name="loop_out_point" tool_tip="Sets point in animation that ends a loop"/>
+ <text name="hand_label">
+ Hand Pose
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Controls what hands do during animation">
+ <combo_box.item label="Spread" name="Spread"/>
+ <combo_box.item label="Relaxed" name="Relaxed"/>
+ <combo_box.item label="Point Both" name="PointBoth"/>
+ <combo_box.item label="Fist" name="Fist"/>
+ <combo_box.item label="Relaxed Left" name="RelaxedLeft"/>
+ <combo_box.item label="Point Left" name="PointLeft"/>
+ <combo_box.item label="Fist Left" name="FistLeft"/>
+ <combo_box.item label="Relaxed Right" name="RelaxedRight"/>
+ <combo_box.item label="Point Right" name="PointRight"/>
+ <combo_box.item label="Fist Right" name="FistRight"/>
+ <combo_box.item label="Salute Right" name="SaluteRight"/>
+ <combo_box.item label="Typing" name="Typing"/>
+ <combo_box.item label="Peace Right" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Expression
+ </text>
+ <combo_box name="emote_combo" tool_tip="Controls what face does during animation">
+ <item label="(無)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Afraid" name="Afraid" value="Afraid"/>
+ <item label="Angry" name="Angry" value="Angry"/>
+ <item label="Big Smile" name="BigSmile" value="Big Smile"/>
+ <item label="Bored" name="Bored" value="Bored"/>
+ <item label="Cry" name="Cry" value="Cry"/>
+ <item label="Disdain" name="Disdain" value="Disdain"/>
+ <item label="Embarrassed" name="Embarrassed" value="Embarrassed"/>
+ <item label="Frown" name="Frown" value="Frown"/>
+ <item label="Kiss" name="Kiss" value="Kiss"/>
+ <item label="Laugh" name="Laugh" value="Laugh"/>
+ <item label="Plllppt" name="Plllppt" value="Plllppt"/>
+ <item label="Repulsed" name="Repulsed" value="Repulsed"/>
+ <item label="Sad" name="Sad" value="Sad"/>
+ <item label="Shrug" name="Shrug" value="Shrug"/>
+ <item label="Smile" name="Smile" value="Smile"/>
+ <item label="Surprise" name="Surprise" value="Surprise"/>
+ <item label="Wink" name="Wink" value="Wink"/>
+ <item label="Worry" name="Worry" value="Worry"/>
+ </combo_box>
+ <text name="preview_label">
+ Preview while
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Use this to test your animation behavior while your avatar performs common actions.">
+ <item label="Standing" name="Standing" value="Standing"/>
+ <item label="Walking" name="Walking" value="Walking"/>
+ <item label="Sitting" name="Sitting" value="Sitting"/>
+ <item label="Flying" name="Flying" value="Flying"/>
+ </combo_box>
+ <spinner label="淡入(秒)" name="ease_in_time" tool_tip="Amount of time (in seconds) over which animations blends in"/>
+ <spinner label="淡出(秒)" name="ease_out_time" tool_tip="Amount of time (in seconds) over which animations blends out"/>
+ <button name="play_btn" tool_tip="Play your animation"/>
+ <button name="pause_btn" tool_tip="Pause your animation"/>
+ <button name="stop_btn" tool_tip="Stop animation playback"/>
+ <text name="bad_animation_text">
+ Unable to read animation file.
+
+We recommend BVH files exported from Poser 4.
+ </text>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+ <button label="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_auction.xml b/indra/newview/skins/default/xui/zh/floater_auction.xml
new file mode 100644
index 0000000000..eb1c9e55dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_auction.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="START LINDEN LAND SALE">
+ <floater.string name="already for sale">
+ You cannot auction parcels which are already for sale.
+ </floater.string>
+ <check_box initial_value="true" label="Include yellow selection fence" name="fence_check"/>
+ <button label="Snapshot" label_selected="Snapshot" name="snapshot_btn"/>
+ <button label="Sell to Anyone" label_selected="Sell to Anyone" name="sell_to_anyone_btn"/>
+ <button label="Clear Settings" label_selected="Clear Settings" name="reset_parcel_btn"/>
+ <button label="Start Auction" label_selected="Start Auction" name="start_auction_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml b/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml
new file mode 100644
index 0000000000..2ffcaf5b55
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatarpicker" title="挑選居民">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; not found
+ </floater.string>
+ <floater.string name="no_one_near">
+ No one near
+ </floater.string>
+ <floater.string name="no_results">
+ No results
+ </floater.string>
+ <floater.string name="searching">
+ Searching...
+ </floater.string>
+ <string name="Select">
+ Select
+ </string>
+ <string name="Close">
+ 關閉
+ </string>
+ <tab_container name="ResidentChooserTabs">
+ <panel label="Search" name="SearchPanel">
+ <text name="InstructSearchResidentName">
+ Type part of a person&apos;s name:
+ </text>
+ <button label="Go" label_selected="Go" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="名稱" name="name"/>
+ <columns label="Username" name="username"/>
+ </scroll_list>
+ </panel>
+ <panel label="Friends" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ 選擇一個人:
+ </text>
+ </panel>
+ <panel label="接近我" name="NearMePanel">
+ <text name="InstructSelectResident">
+ Select a person nearby:
+ </text>
+ <slider label="Range" name="near_me_range"/>
+ <text name="meters">
+ Meters
+ </text>
+ <scroll_list name="NearMe">
+ <columns label="名稱" name="name"/>
+ <columns label="Username" name="username"/>
+ </scroll_list>
+ </panel>
+ </tab_container>
+ <button label="確定" label_selected="確定" name="ok_btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml
new file mode 100644
index 0000000000..f895fa2e9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatar_texture_debug" title="AVATAR TEXTURES">
+ <floater.string name="InvalidAvatar">
+ INVALID AVATAR
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Baked
+Textures
+ </text>
+ <text name="composite_label">
+ Composite
+Textures
+ </text>
+ <button label="Dump IDs to Console" label_selected="Dump" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="Hair" name="hair-baked"/>
+ <texture_picker label="Hair" name="hair_grain"/>
+ <texture_picker label="Hair Alpha" name="hair_alpha"/>
+ <texture_picker label="Head" name="head-baked"/>
+ <texture_picker label="Makeup" name="head_bodypaint"/>
+ <texture_picker label="Head Alpha" name="head_alpha"/>
+ <texture_picker label="Head Tattoo" name="head_tattoo"/>
+ <texture_picker label="眼睛" name="eyes-baked"/>
+ <texture_picker label="Eye" name="eyes_iris"/>
+ <texture_picker label="Eyes Alpha" name="eyes_alpha"/>
+ <texture_picker label="Upper Body" name="upper-baked"/>
+ <texture_picker label="Upper BodyPaint" name="upper_bodypaint"/>
+ <texture_picker label="內衣" name="upper_undershirt"/>
+ <texture_picker label="手套" name="upper_gloves"/>
+ <texture_picker label="襯衫" name="upper_shirt"/>
+ <texture_picker label="Upper Jacket" name="upper_jacket"/>
+ <texture_picker label="Upper Alpha" name="upper_alpha"/>
+ <texture_picker label="Upper Tattoo" name="upper_tattoo"/>
+ <texture_picker label="Lower Body" name="lower-baked"/>
+ <texture_picker label="Lower BodyPaint" name="lower_bodypaint"/>
+ <texture_picker label="內褲" name="lower_underpants"/>
+ <texture_picker label="襪子" name="lower_socks"/>
+ <texture_picker label="鞋子" name="lower_shoes"/>
+ <texture_picker label="褲子" name="lower_pants"/>
+ <texture_picker label="夾克" name="lower_jacket"/>
+ <texture_picker label="Lower Alpha" name="lower_alpha"/>
+ <texture_picker label="Lower Tattoo" name="lower_tattoo"/>
+ <texture_picker label="裙子" name="skirt-baked"/>
+ <texture_picker label="裙子" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_beacons.xml b/indra/newview/skins/default/xui/zh/floater_beacons.xml
new file mode 100644
index 0000000000..1613b23e75
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_beacons.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="BEACONS">
+ <panel name="beacons_panel">
+ <text name="label_show">
+ Show :
+ </text>
+ <check_box label="Beacons" name="beacons"/>
+ <check_box label="Highlights" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Beacon width">
+ Width:
+ </text>
+ <text name="label_objects">
+ For these objects:
+ </text>
+ <check_box label="Physical" name="physical"/>
+ <check_box label="Scripted" name="scripted"/>
+ <check_box label="Touch only" name="touch_only"/>
+ <check_box label="Sound sources" name="sounds"/>
+ <check_box label="Particle sources" name="particles"/>
+ <check_box label="Media sources" name="moapbeacon"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_build_options.xml b/indra/newview/skins/default/xui/zh/floater_build_options.xml
new file mode 100644
index 0000000000..95211b746c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_build_options.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="格線選項">
+ <spinner label="格線單位(公尺)" name="GridResolution"/>
+ <spinner label="Grid Extents (meters)" name="GridDrawSize"/>
+ <check_box label="貼齊至子單位" name="GridSubUnit"/>
+ <check_box label="View cross-sections" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Grid opacity">
+ Opacity:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
new file mode 100644
index 0000000000..98fa6804ba
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="EDIT CONTENT PERMISSIONS">
+ <floater.string name="nothing_to_modify_text">
+ Selection contains no editable contents.
+ </floater.string>
+ <floater.string name="status_text">
+ Setting permissions on [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Starting permission change requests...
+ </floater.string>
+ <floater.string name="done_text">
+ Finished permission change requests.
+ </floater.string>
+ <icon name="icon_animation" tool_tip="Animation"/>
+ <icon name="icon_bodypart" tool_tip="Body Parts"/>
+ <icon name="icon_clothing" tool_tip="Clothing"/>
+ <icon name="icon_gesture" tool_tip="Gestures"/>
+ <icon name="icon_notecard" tool_tip="Notecards"/>
+ <icon name="icon_object" tool_tip="Objects"/>
+ <icon name="icon_script" tool_tip="Scripts"/>
+ <icon name="icon_sound" tool_tip="Sounds"/>
+ <icon name="icon_texture" tool_tip="Textures"/>
+ <button label="√ All" name="check_all"/>
+ <button label="清除" label_selected="無" name="check_none"/>
+ <text name="newperms">
+ New Content Permissions
+ </text>
+ <text name="GroupLabel">
+ Group:
+ </text>
+ <check_box label="分享" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ 任何人:
+ </text>
+ <check_box label="覆製" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ 下一個擁有者:
+ </text>
+ <check_box label="修改" name="next_owner_modify"/>
+ <check_box label="覆製" name="next_owner_copy"/>
+ <check_box initial_value="true" label="轉移" name="next_owner_transfer" tool_tip="Next owner can give away or resell this object"/>
+ <button label="確定" name="apply"/>
+ <button label="取銷" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_bumps.xml b/indra/newview/skins/default/xui/zh/floater_bumps.xml
new file mode 100644
index 0000000000..d2b7494b08
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_bumps.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="BUMPS, PUSHES &amp; HITS">
+ <floater.string name="none_detected">
+ None detected
+ </floater.string>
+ <floater.string name="bump">
+ [TIME] [NAME] bumped you
+ </floater.string>
+ <floater.string name="llpushobject">
+ [TIME] [NAME] pushed you with a script
+ </floater.string>
+ <floater.string name="selected_object_collide">
+ [TIME] [NAME] hit you with an object
+ </floater.string>
+ <floater.string name="scripted_object_collide">
+ [TIME] [NAME] hit you with a scripted object
+ </floater.string>
+ <floater.string name="physical_object_collide">
+ [TIME] [NAME] hit you with a physical object
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_contents.xml b/indra/newview/skins/default/xui/zh/floater_buy_contents.xml
new file mode 100644
index 0000000000..de3c0aa075
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_contents.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_contents" title="BUY CONTENTS">
+ <floater.string name="no_copy_text">
+ (no copy)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (no modify)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (no transfer)
+ </floater.string>
+ <text name="contains_text">
+ [NAME] contains:
+ </text>
+ <text name="buy_text">
+ Buy for L$[AMOUNT] from [NAME]?
+ </text>
+ <check_box label="Wear clothing now" name="wear_check"/>
+ <button label="購買" label_selected="購買" name="buy_btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
new file mode 100644
index 0000000000..bebc17a5cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="購買 L$">
+ <floater.string name="buy_currency">
+ Buy L$ [LINDENS] for approx. [LOCALAMOUNT]
+ </floater.string>
+ <text name="info_need_more">
+ 你需要更多 L$
+ </text>
+ <text name="contacting">
+ Contacting LindeX...
+ </text>
+ <text name="info_buying">
+ 購買 L$
+ </text>
+ <text name="balance_label">
+ 我有
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_action">
+ 我想購買
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
+ 1234
+ </line_editor>
+ <text name="buying_label">
+ For the price
+ </text>
+ <text name="currency_est">
+ approx. [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ Estimating...
+ </text>
+ <text name="buy_action">
+ [ACTION]
+ </text>
+ <text name="total_label">
+ My new balance will be
+ </text>
+ <text name="total_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ </text>
+ <text name="exchange_rate_note">
+ Re-enter amount to see the latest exchange rate.
+ </text>
+ <text name="purchase_warning_repurchase">
+ Confirming this purchase only buys L$, not the object.
+ </text>
+ <text name="purchase_warning_notenough">
+ You aren&apos;t buying enough L$. Please increase the amount.
+ </text>
+ <button label="立即購買" name="buy_btn"/>
+ <button label="取銷" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ Unable to Buy
+ </text>
+ <button label="Continue to the Web" name="error_web"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..ec700ad7af
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="購買貨幣"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_land.xml b/indra/newview/skins/default/xui/zh/floater_buy_land.xml
new file mode 100644
index 0000000000..d665a16639
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_land.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy land" title="購買土地">
+ <floater.string name="can_resell">
+ May be resold.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ May not be resold.
+ </floater.string>
+ <floater.string name="can_change">
+ May be joined or subdivided.
+ </floater.string>
+ <floater.string name="can_not_change">
+ May not be joined or subdivided.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ You do not have permission to buy land for your active group.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ No land selected.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Multiple different parcels selected.
+Try selecting a smaller area.
+ </floater.string>
+ <floater.string name="no_permission">
+ You do not have permission to buy land for your active group.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ The selected parcel is not for sale.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ The group already owns the parcel.
+ </floater.string>
+ <floater.string name="you_already_own">
+ You already own the parcel.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ The selected parcel is set to sell to another party.
+ </floater.string>
+ <floater.string name="no_public_land">
+ The selected area has no public land.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Land owned by another Resident is selected.
+Try selecting a smaller area.
+ </floater.string>
+ <floater.string name="processing">
+ Processing your purchase...
+
+(This may take a minute or two.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ There has been an error while fetching land buying information.
+ </floater.string>
+ <floater.string name="buying_will">
+ Buying this land will:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Buying land for group will:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Cannot buy now:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Not for sale:
+ </floater.string>
+ <floater.string name="none_needed">
+ none needed
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Your account must be upgraded to own land.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Your account can own land.
+ </floater.string>
+ <floater.string name="land_holdings">
+ You hold [BUYER] m² of land.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Pay L$ [AMOUNT] to [SELLER] for this land
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Buy L$ [AMOUNT] for approx. [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ This parcel is [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ This land is premium, and will charge as [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ This land is discounted, and will charge as [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+supports [AMOUNT2] objects
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ sold with objects
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ objects not included
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$ [PRICE_PER_SQM]/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ The group [GROUP] will need sufficient contributed land use credits to cover this parcel before the purchase will complete.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ You have L$ [AMOUNT], which is enough to buy this land.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ You have only L$ [AMOUNT], and need L$ [AMOUNT2] more.
+ </floater.string>
+ <floater.string name="balance_left">
+ After the purchase, you will have L$ [AMOUNT] left.
+ </floater.string>
+ <floater.string name="balance_needed">
+ You need to buy at least L$ [AMOUNT] to afford this land.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (no parcel selected)
+ </floater.string>
+ <text name="region_name_label">
+ 地區:
+ </text>
+ <text name="region_name_text">
+ (未知)
+ </text>
+ <text name="region_type_label">
+ 類型:
+ </text>
+ <text name="region_type_text">
+ (未知)
+ </text>
+ <text name="estate_name_label">
+ 領地:
+ </text>
+ <text name="estate_name_text">
+ (未知)
+ </text>
+ <text name="estate_owner_label">
+ 領地擁有者:
+ </text>
+ <text name="estate_owner_text">
+ (未知)
+ </text>
+ <text name="resellable_changeable_label">
+ Purchased land in this region:
+ </text>
+ <text name="resellable_clause">
+ May or may not be resold.
+ </text>
+ <text name="changeable_clause">
+ May or may not be joined or subdivided.
+ </text>
+ <text name="covenant_text">
+ You must agree to the Estate Covenant:
+ </text>
+ <text_editor name="covenant_editor">
+ 載入中...
+ </text_editor>
+ <check_box label="I Agree to the Covenant Defined Above." name="agree_covenant"/>
+ <text name="info_parcel_label">
+ 地段:
+ </text>
+ <text name="info_parcel">
+ Scotopteryx 138,204
+ </text>
+ <text name="info_size_label">
+ Size:
+ </text>
+ <text name="info_size">
+ 1024 m²
+ </text>
+ <text name="info_price_label">
+ 價格:
+ </text>
+ <text name="info_price">
+ L$ 1500
+(L$ 1.1/m²)
+sold with objects
+ </text>
+ <text name="info_action">
+ Buying this land will:
+ </text>
+ <text name="error_message">
+ Something ain&apos;t right.
+ </text>
+ <button label="Go to website" name="error_web"/>
+ <text name="account_action">
+ Upgrade you to premium membership.
+ </text>
+ <text name="account_reason">
+ Only premimum members may own land.
+ </text>
+ <combo_box name="account_level">
+ <combo_box.item label="US$9.95/month, billed monthly" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7.50/month, billed quarterly" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6.00/month, billed annually" name="US$6.00/month,billedannually"/>
+ </combo_box>
+ <text name="land_use_action">
+ Increase your monthly land use fees to US$ 40/month.
+ </text>
+ <text name="land_use_reason">
+ You hold 1309 m² of land.
+This parcel is 512 m² of land.
+ </text>
+ <text name="purchase_action">
+ Pay Joe Resident L$ 4000 for the land
+ </text>
+ <text name="currency_reason">
+ You have L$ 2,100.
+ </text>
+ <text name="currency_action">
+ Buy additional L$
+ </text>
+ <line_editor name="currency_amt">
+ 1000
+ </line_editor>
+ <text name="currency_est">
+ for approx. [LOCAL_AMOUNT]
+ </text>
+ <text name="currency_balance">
+ You have L$ 2,100.
+ </text>
+ <check_box label="Remove [AMOUNT] m² of contribution from group." name="remove_contribution"/>
+ <button label="Purchase" name="buy_btn"/>
+ <button label="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_object.xml b/indra/newview/skins/default/xui/zh/floater_buy_object.xml
new file mode 100644
index 0000000000..559982b6c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="BUY COPY OF OBJECT">
+ <floater.string name="title_buy_text">
+ 購買
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Buy a copy of
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (no copy)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (no modify)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (no transfer)
+ </floater.string>
+ <text name="contents_text">
+ Contains:
+ </text>
+ <text name="buy_text">
+ Buy for L$[AMOUNT] from:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
+ </text>
+ <button label="購買" label_selected="購買" name="buy_btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_camera.xml b/indra/newview/skins/default/xui/zh/floater_camera.xml
new file mode 100644
index 0000000000..65d04583f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_camera.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+ <floater.string name="rotate_tooltip">
+ Rotate Camera Around Focus
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Zoom Camera Towards Focus
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Move Camera Up and Down, Left and Right
+ </floater.string>
+ <floater.string name="camera_modes_title">
+ Camera modes
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Orbit Zoom Pan
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Preset Views
+ </floater.string>
+ <floater.string name="free_mode_title">
+ View Object
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Front View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Side View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Rear View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Object View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Mouselook View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Orbit camera around focus"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoom camera toward focus"/>
+ <joystick_track name="cam_track_stick" tool_tip="Move camera up and down, left and right"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Preset Views"/>
+ <button label="" name="pan_btn" tool_tip="Orbit Zoom Pan"/>
+ <button label="" name="avatarview_btn" tool_tip="Camera modes"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_choose_group.xml b/indra/newview/skins/default/xui/zh/floater_choose_group.xml
new file mode 100644
index 0000000000..ec67f8d4fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_choose_group.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="GROUPS">
+ <text name="groupdesc">
+ Choose a group:
+ </text>
+ <button label="確定" label_selected="確定" name="OK"/>
+ <button label="取銷" label_selected="取銷" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_color_picker.xml b/indra/newview/skins/default/xui/zh/floater_color_picker.xml
new file mode 100644
index 0000000000..df9c780cbf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_color_picker.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="COLOR PICKER">
+ <text name="r_val_text">
+ Red:
+ </text>
+ <text name="g_val_text">
+ Green:
+ </text>
+ <text name="b_val_text">
+ Blue:
+ </text>
+ <text name="h_val_text">
+ Hue:
+ </text>
+ <text name="s_val_text">
+ Sat:
+ </text>
+ <text name="l_val_text">
+ Lum:
+ </text>
+ <check_box label="立即套用" name="apply_immediate"/>
+ <button label="確定" label_selected="確定" name="select_btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel_btn"/>
+ <text name="Current color:">
+ Current color:
+ </text>
+ <text name="(Drag below to save.)">
+ (Drag below to save)
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_critical.xml b/indra/newview/skins/default/xui/zh/floater_critical.xml
new file mode 100644
index 0000000000..da357bde56
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_critical.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <button label="繼續" label_selected="繼續" name="Continue"/>
+ <text name="tos_heading">
+ Please read the following message carefully.
+ </text>
+ <text_editor name="tos_text">
+ TOS_TEXT
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml
new file mode 100644
index 0000000000..c6ab787625
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Day Cycle Floater" title="DAY CYCLE EDITOR">
+ <tab_container name="Day Cycle Tabs">
+ <panel label="Day Cycle" name="Day Cycle">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <text name="WL12am">
+ 12am
+ </text>
+ <text name="WL3am">
+ 3am
+ </text>
+ <text name="WL6am">
+ 6am
+ </text>
+ <text name="WL9amHash">
+ 9am
+ </text>
+ <text name="WL12pmHash">
+ 12pm
+ </text>
+ <text name="WL3pm">
+ 3pm
+ </text>
+ <text name="WL6pm">
+ 6pm
+ </text>
+ <text name="WL9pm">
+ 9pm
+ </text>
+ <text name="WL12am2">
+ 12am
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <button label="Add Key" label_selected="Add Key" name="WLAddKey"/>
+ <button label="Delete Key" label_selected="Delete Key" name="WLDeleteKey"/>
+ <text name="WLCurKeyFrameText">
+ Key Frame Settings:
+ </text>
+ <text name="WLCurKeyTimeText">
+ Key Time:
+ </text>
+ <spinner label="Hour" name="WLCurKeyHour"/>
+ <spinner label="Min" name="WLCurKeyMin"/>
+ <text name="WLCurKeyTimeText2">
+ Key Preset:
+ </text>
+ <combo_box label="Preset" name="WLKeyPresets"/>
+ <text name="DayCycleText">
+ Snap:
+ </text>
+ <combo_box label="五分鐘" name="WLSnapOptions"/>
+ <text name="DayCycleText2">
+ Length of Cycle:
+ </text>
+ <spinner label="小時" name="WLLengthOfDayHour"/>
+ <spinner label="分" name="WLLengthOfDayMin"/>
+ <spinner label="秒" name="WLLengthOfDaySec"/>
+ <text name="DayCycleText3">
+ 預覽:
+ </text>
+ <button label="Play" label_selected="Play" name="WLAnimSky"/>
+ <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/>
+ <button label="Use Estate Time" label_selected="Go to Estate Time" name="WLUseLindenTime"/>
+ <button label="Save Test Day" label_selected="Save Test Day" name="WLSaveDayCycle"/>
+ <button label="Load Test Day" label_selected="Load Test Day" name="WLLoadDayCycle"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_display_name.xml b/indra/newview/skins/default/xui/zh/floater_display_name.xml
new file mode 100644
index 0000000000..5a89ecaa82
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="CHANGE DISPLAY NAME">
+ <text name="info_text">
+ The name you give your avatar is called your Display Name. You can change it once a week.
+ </text>
+ <text name="lockout_text">
+ You cannot change your Display Name until: [TIME].
+ </text>
+ <text name="set_name_label">
+ New Display Name:
+ </text>
+ <text name="name_confirm_label">
+ Type your new name again to confirm:
+ </text>
+ <button label="儲存" name="save_btn" tool_tip="Save your new Display Name"/>
+ <button label="Reset" name="reset_btn" tool_tip="Make Display Name the same as Username"/>
+ <button label="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_env_settings.xml b/indra/newview/skins/default/xui/zh/floater_env_settings.xml
new file mode 100644
index 0000000000..65a97f0cff
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_env_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ENVIRONMENT EDITOR">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
+ <text name="EnvTimeText">
+ Time of Day
+ </text>
+ <text name="EnvTimeText2">
+ 12:00 PM
+ </text>
+ <text name="EnvCloudText">
+ Cloud Cover
+ </text>
+ <text name="EnvWaterColorText">
+ Water Color
+ </text>
+ <color_swatch name="EnvWaterColor" tool_tip="Click to open color picker"/>
+ <text name="EnvWaterFogText">
+ Water Fog
+ </text>
+ <button label="Use Estate Time" name="EnvUseEstateTimeButton"/>
+ <button label="Advanced Sky" name="EnvAdvancedSkyButton"/>
+ <button label="Advanced Water" name="EnvAdvancedWaterButton"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_event.xml b/indra/newview/skins/default/xui/zh/floater_event.xml
new file mode 100644
index 0000000000..349b5717f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_event.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Event" name="Event" title="EVENT DETAILS">
+ <floater.string name="loading_text">
+ 載入中...
+ </floater.string>
+ <floater.string name="done_text">
+ Done
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_font_test.xml b/indra/newview/skins/default/xui/zh/floater_font_test.xml
new file mode 100644
index 0000000000..ec83c51eb3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_font_test.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="字型測試"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_gesture.xml b/indra/newview/skins/default/xui/zh/floater_gesture.xml
new file mode 100644
index 0000000000..22e7451d13
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_gesture.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Places" name="gestures" title="GESTURES">
+ <floater.string name="loading">
+ 載入中...
+ </floater.string>
+ <floater.string name="playing">
+ (Playing)
+ </floater.string>
+ <floater.string name="copy_name">
+ Copy of [COPY_NAME]
+ </floater.string>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="名稱" name="name"/>
+ <scroll_list.columns label="聊天" name="trigger"/>
+ <scroll_list.columns label="Key" name="shortcut"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="More options"/>
+ <button name="new_gesture_btn" tool_tip="Make new gesture"/>
+ <button name="activate_btn" tool_tip="Activate/Deactivate selected gesture"/>
+ <button name="del_btn" tool_tip="Delete this gesture"/>
+ </panel>
+ <button label="編輯" name="edit_btn"/>
+ <button label="Play" name="play_btn"/>
+ <button label="Stop" name="stop_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_god_tools.xml b/indra/newview/skins/default/xui/zh/floater_god_tools.xml
new file mode 100644
index 0000000000..b01d346a64
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_god_tools.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="GOD TOOLS">
+ <tab_container name="GodTools Tabs">
+ <panel label="Grid" name="grid">
+ <button label="Flush This Region&apos;s Map Visibility Caches" label_selected="Flush This Region&apos;s Map Visibility Caches" name="Flush This Region&apos;s Map Visibility Caches"/>
+ </panel>
+ <panel label="地區" name="region">
+ <text name="Region Name:">
+ 地區名稱:
+ </text>
+ <check_box label="Prelude" name="check prelude" tool_tip="Set this to make the region a prelude"/>
+ <check_box label="Fixed Sun" name="check fixed sun" tool_tip="Fix the sun position (like in Region/Estate &gt; Terrain"/>
+ <check_box label="Reset Home On Teleport" name="check reset home" tool_tip="When Resident teleports out, reset their home to the destination position."/>
+ <check_box label="Visible" name="check visible" tool_tip="Set this to make the region visible to non-gods"/>
+ <check_box label="Damage" name="check damage" tool_tip="Set this to enable damage in this region"/>
+ <check_box label="Block Traffic Tracking" name="block dwell" tool_tip="Set this to make the region not compute traffic"/>
+ <check_box label="Block Terraform" name="block terraform" tool_tip="Set this to disallow people terraforming their land"/>
+ <check_box label="Sandbox" name="is sandbox" tool_tip="Toggle whether this is a sandbox region"/>
+ <button label="Bake Terrain" label_selected="Bake Terrain" name="Bake Terrain" tool_tip="Save the current terrain as default"/>
+ <button label="Revert Terrain" label_selected="Revert Terrain" name="Revert Terrain" tool_tip="Replace the current terrain with default"/>
+ <button label="Swap Terrain" label_selected="Swap Terrain" name="Swap Terrain" tool_tip="Swap current terrain with default"/>
+ <text name="estate id">
+ Estate ID:
+ </text>
+ <text name="parent id">
+ Parent ID:
+ </text>
+ <line_editor name="parentestate" tool_tip="This is the parent estate for this region"/>
+ <text name="Grid Pos: ">
+ Grid Pos:
+ </text>
+ <line_editor name="gridposx" tool_tip="This is the grid x position for this region"/>
+ <line_editor name="gridposy" tool_tip="This is the grid y position for this region"/>
+ <text name="Redirect to Grid: ">
+ Redirect to Grid:
+ </text>
+ <text name="billable factor text">
+ Billable Factor:
+ </text>
+ <text name="land cost text">
+ L$ per m²:
+ </text>
+ <button label="Refresh" label_selected="Refresh" name="Refresh" tool_tip="Click here to refresh the above information"/>
+ <button label="套用" label_selected="套用" name="Apply" tool_tip="Click here to apply any changes from above"/>
+ <button label="選擇地區" label_selected="選擇地區" name="Select Region" tool_tip="Select the whole region with the land tool"/>
+ <button label="Autosave now" label_selected="Autosave now" name="Autosave now" tool_tip="Save gzipped state to autosave directory"/>
+ </panel>
+ <panel label="Objects" name="objects">
+ <panel.string name="no_target">
+ (no target)
+ </panel.string>
+ <text name="Region Name:">
+ 地區名稱:
+ </text>
+ <text name="region name">
+ Welsh
+ </text>
+ <check_box label="Disable Scripts" name="disable scripts" tool_tip="Set this to disable all scripts in this region"/>
+ <check_box label="Disable Collisions" name="disable collisions" tool_tip="Set this to disable non-agent collisions in this region"/>
+ <check_box label="Disable Physics" name="disable physics" tool_tip="Set this to disable all physics in this region"/>
+ <button label="套用" label_selected="套用" name="Apply" tool_tip="Click here to apply any changes from above"/>
+ <button label="Set Target" label_selected="Set Target" name="Set Target" tool_tip="Set the target avatar for object deletion"/>
+ <text name="target_avatar_name">
+ (no target)
+ </text>
+ <button label="Delete Target&apos;s Scripted Objects On Others Land" label_selected="Delete Target&apos;s Scripted Objects On Others Land" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Delete all scripted objects owned by the target on land not owned by the target. (no copy) objects will be returned."/>
+ <button label="Delete Target&apos;s Scripted Objects On *Any* Land" label_selected="Delete Target&apos;s Scripted Objects On *Any* Land" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Delete all scripted objects owned by the target in this region. (no copy) objects will be returned."/>
+ <button label="Delete *ALL* Of Target&apos;s Objects" label_selected="Delete *ALL* Of Target&apos;s Objects" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Delete all objects owned by the target in this region. (no copy) objects will be returned."/>
+ <button label="Get Top Colliders" label_selected="Get Top Colliders" name="Get Top Colliders" tool_tip="Gets list of objects experiencing the most narrowphase callbacks"/>
+ <button label="Get Top Scripts" label_selected="Get Top Scripts" name="Get Top Scripts" tool_tip="Gets list of objects spending the most time running scripts"/>
+ <button label="Scripts digest" label_selected="Scripts digest" name="Scripts digest" tool_tip="Gets a list of all scripts and number of occurences of each"/>
+ </panel>
+ <panel label="Request" name="request">
+ <text name="Destination:">
+ Destination:
+ </text>
+ <combo_box name="destination">
+ <combo_box.item label="Selection" name="item1"/>
+ <combo_box.item label="Agent Region" name="item2"/>
+ </combo_box>
+ <text name="Request:">
+ Request:
+ </text>
+ <combo_box name="request">
+ <combo_box.item label="colliders &lt;steps&gt;" name="item1"/>
+ <combo_box.item label="scripts &lt;count&gt;,&lt;optional pattern&gt;" name="item2"/>
+ <combo_box.item label="objects &lt;pattern&gt;" name="item3"/>
+ <combo_box.item label="rez &lt;asset_id&gt;" name="item4"/>
+ </combo_box>
+ <text name="Parameter:">
+ Parameter:
+ </text>
+ <button label="Make Request" label_selected="Make Request" name="Make Request"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml b/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml
new file mode 100644
index 0000000000..75403a79dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="硬體設定">
+ <text name="Filtering:">
+ Filtering:
+ </text>
+ <check_box label="Anisotropic Filtering (slower when enabled)" name="ani"/>
+ <text name="Antialiasing:">
+ Antialiasing:
+ </text>
+ <combo_box label="Antialiasing" name="fsaa">
+ <combo_box.item label="Disabled" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
+ </combo_box>
+ <text name="antialiasing restart">
+ (須重新啟動瀏覽器)
+ </text>
+ <spinner label="Gamma:" name="gamma"/>
+ <text name="(brightness, lower is brighter)">
+ (0 = default brightness, lower = brighter)
+ </text>
+ <text name="Enable VBO:">
+ Enable VBO:
+ </text>
+ <check_box initial_value="true" label="Enable OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Enabling this on modern hardware gives a performance gain. However, older hardware often has poor implementations of VBOs and you may get crashes when this is enabled."/>
+ <slider label="Texture Memory (MB):" name="GraphicsCardTextureMemory" tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry."/>
+ <spinner label="Fog Distance Ratio:" name="fog"/>
+ <button label="確定" label_selected="確定" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_help_browser.xml b/indra/newview/skins/default/xui/zh/floater_help_browser.xml
new file mode 100644
index 0000000000..957c37bd63
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_help_browser.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="HELP BROWSER">
+ <floater.string name="loading_text">
+ 載入中...
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_hud.xml b/indra/newview/skins/default/xui/zh/floater_hud.xml
new file mode 100644
index 0000000000..e458913452
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_hud.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="TUTORIAL"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_im_container.xml b/indra/newview/skins/default/xui/zh/floater_im_container.xml
new file mode 100644
index 0000000000..5ea073365e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="CONVERSATIONS"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_im_session.xml b/indra/newview/skins/default/xui/zh/floater_im_session.xml
new file mode 100644
index 0000000000..e8db97560e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_im_session.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel>
+ <line_editor label="To" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_image_preview.xml b/indra/newview/skins/default/xui/zh/floater_image_preview.xml
new file mode 100644
index 0000000000..92d5c3df73
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_image_preview.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview">
+ <text name="name_label">
+ 名稱:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <text name="preview_label">
+ Preview image as:
+ </text>
+ <combo_box label="Clothing Type" name="clothing_type_combo">
+ <item label="Image" name="Image" value="Image"/>
+ <item label="Hair" name="Hair" value="Hair"/>
+ <item label="Female Head" name="FemaleHead" value="Female Head"/>
+ <item label="Female Upper Body" name="FemaleUpperBody" value="Female Upper Body"/>
+ <item label="Female Lower Body" name="FemaleLowerBody" value="Female Lower Body"/>
+ <item label="Male Head" name="MaleHead" value="Male Head"/>
+ <item label="Male Upper Body" name="MaleUpperBody" value="Male Upper Body"/>
+ <item label="Male Lower Body" name="MaleLowerBody" value="Male Lower Body"/>
+ <item label="裙子" name="Skirt" value="裙子"/>
+ <item label="Sculpted Prim" name="SculptedPrim" value="Sculpted Prim"/>
+ </combo_box>
+ <text name="bad_image_text">
+ Unable to read image.
+
+Try saving image as 24 bit Targa (.tga).
+ </text>
+ <check_box label="Use lossless compression" name="lossless_check"/>
+ <button label="取銷" name="cancel_btn"/>
+ <button label="Upload (L$[AMOUNT])" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml
new file mode 100644
index 0000000000..9ca08c06b1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="Incoming call">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Nearby Voice Chat
+ </floater.string>
+ <floater.string name="anonymous">
+ anonymous
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ is calling.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ has joined a Voice Chat call with a conference chat.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ just joined &apos;[GROUP]&apos; voice channel.
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ Would you like to leave [CURRENT_CHAT] and join the call with &apos;[GROUP]&apos;?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ Do you want to leave [CURRENT_CHAT] and join this voice chat?
+ </floater.string>
+ <text name="question">
+ Do you want to leave [CURRENT_CHAT] and join this voice chat?
+ </text>
+ <button label="接受" label_selected="接受" name="Accept"/>
+ <button label="Reject" label_selected="Reject" name="Reject"/>
+ <button label="Start IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inspect.xml b/indra/newview/skins/default/xui/zh/floater_inspect.xml
new file mode 100644
index 0000000000..7f23bba37a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inspect.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="inspect" title="INSPECT OBJECTS">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <scroll_list name="object_list" tool_tip="Select an object from this list to highlight it in-world">
+ <scroll_list.columns label="物件名稱" name="object_name"/>
+ <scroll_list.columns label="Owner Name" name="owner_name"/>
+ <scroll_list.columns label="Creator Name" name="creator_name"/>
+ <scroll_list.columns label="Creation Date" name="creation_date"/>
+ </scroll_list>
+ <button label="See Owner Profile..." name="button owner" tool_tip="See profile of the highlighted object&apos;s owner"/>
+ <button label="See Creator Profile..." name="button creator" tool_tip="See profile of the highlighted object&apos;s original creator"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory.xml b/indra/newview/skins/default/xui/zh/floater_inventory.xml
new file mode 100644
index 0000000000..93cd681126
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inventory.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory" title="MY INVENTORY">
+ <panel label="Inventory Panel" name="Inventory Panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
new file mode 100644
index 0000000000..4fac10df81
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="INVENTORY ITEM PROPERTIES">
+ <floater.string name="unknown">
+ (未知)
+ </floater.string>
+ <floater.string name="public">
+ (公開)
+ </floater.string>
+ <floater.string name="you_can">
+ 你可以:
+ </floater.string>
+ <floater.string name="owner_can">
+ 擁有者可以:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <text name="LabelItemNameTitle">
+ 名稱:
+ </text>
+ <text name="LabelItemDescTitle">
+ 描述:
+ </text>
+ <text name="LabelCreatorTitle">
+ 創造者:
+ </text>
+ <button label="Profile..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ 擁有者:
+ </text>
+ <button label="Profile..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Acquired:
+ </text>
+ <text name="LabelAcquiredDate">
+ Wed May 24 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ 你:
+ </text>
+ <check_box label="編輯" name="CheckOwnerModify"/>
+ <check_box label="覆製" name="CheckOwnerCopy"/>
+ <check_box label="轉售" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ 任何人:
+ </text>
+ <check_box label="覆製" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Group:
+ </text>
+ <check_box label="分享" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ 下一個擁有者:
+ </text>
+ <check_box label="編輯" name="CheckNextOwnerModify"/>
+ <check_box label="覆製" name="CheckNextOwnerCopy"/>
+ <check_box label="轉售" name="CheckNextOwnerTransfer"/>
+ <check_box label="出售" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="副本" name="Copy"/>
+ <combo_box.item label="原件" name="Original"/>
+ </combo_box>
+ <spinner label="價格:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
new file mode 100644
index 0000000000..41ea8dc593
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
+ <check_box label="Animation" name="check_animation"/>
+ <check_box label="Calling Cards" name="check_calling_card"/>
+ <check_box label="Clothing" name="check_clothing"/>
+ <check_box label="Gestures" name="check_gesture"/>
+ <check_box label="Landmarks" name="check_landmark"/>
+ <check_box label="Notecards" name="check_notecard"/>
+ <check_box label="Objects" name="check_object"/>
+ <check_box label="Scripts" name="check_script"/>
+ <check_box label="Sounds" name="check_sound"/>
+ <check_box label="Textures" name="check_texture"/>
+ <check_box label="Snapshots" name="check_snapshot"/>
+ <button label="全部" label_selected="全部" name="All"/>
+ <button label="無" label_selected="無" name="None"/>
+ <check_box label="Always show folders" name="check_show_empty"/>
+ <check_box label="Since Logoff" name="check_since_logoff"/>
+ <text name="- OR -">
+ - 或 -
+ </text>
+ <spinner label="小時前" name="spin_hours_ago"/>
+ <spinner label="天前" name="spin_days_ago"/>
+ <button label="關閉" label_selected="關閉" name="Close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_joystick.xml b/indra/newview/skins/default/xui/zh/floater_joystick.xml
new file mode 100644
index 0000000000..91f2bc6d81
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_joystick.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Joystick" title="JOYSTICK CONFIGURATION">
+ <floater.string name="NoDevice">
+ 未偵測到設備
+ </floater.string>
+ <check_box label="Enable Joystick:" name="enable_joystick"/>
+ <spinner label="X Axis Mapping" name="JoystickAxis1"/>
+ <spinner label="Y Axis Mapping" name="JoystickAxis2"/>
+ <spinner label="Z Axis Mapping" name="JoystickAxis0"/>
+ <spinner label="Pitch Mapping" name="JoystickAxis4"/>
+ <spinner label="Yaw Mapping" name="JoystickAxis5"/>
+ <spinner label="Roll Mapping" name="JoystickAxis3"/>
+ <spinner label="Zoom Mapping" name="JoystickAxis6"/>
+ <check_box label="Direct Zoom" name="ZoomDirect"/>
+ <check_box label="3D Cursor" name="Cursor3D"/>
+ <check_box label="Auto Level" name="AutoLeveling"/>
+ <text name="Control Modes:">
+ Control Modes:
+ </text>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Build" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
+ <stat_view label="Joystick Monitor" name="axis_view">
+ <stat_bar label="Axis 0" name="axis0"/>
+ <stat_bar label="Axis 1" name="axis1"/>
+ <stat_bar label="Axis 2" name="axis2"/>
+ <stat_bar label="Axis 3" name="axis3"/>
+ <stat_bar label="Axis 4" name="axis4"/>
+ <stat_bar label="Axis 5" name="axis5"/>
+ </stat_view>
+ <text name="XScale">
+ X Scale
+ </text>
+ <text name="YScale">
+ Y Scale
+ </text>
+ <text name="ZScale">
+ Z Scale
+ </text>
+ <text name="PitchScale">
+ Pitch Scale
+ </text>
+ <text name="YawScale">
+ Yaw Scale
+ </text>
+ <text name="RollScale">
+ Roll Scale
+ </text>
+ <text name="XDeadZone">
+ X Dead Zone
+ </text>
+ <text name="YDeadZone">
+ Y Dead Zone
+ </text>
+ <text name="ZDeadZone">
+ Z Dead Zone
+ </text>
+ <text name="PitchDeadZone">
+ Pitch Dead Zone
+ </text>
+ <text name="YawDeadZone">
+ Yaw Dead Zone
+ </text>
+ <text name="RollDeadZone">
+ Roll Dead Zone
+ </text>
+ <text name="Feathering">
+ Feathering
+ </text>
+ <text name="ZoomScale2">
+ Zoom Scale
+ </text>
+ <text name="ZoomDeadZone">
+ Zoom Dead Zone
+ </text>
+ <button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/>
+ <button label="確定" label_selected="確定" name="ok_btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
new file mode 100644
index 0000000000..4ff6c45b17
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="LAG METER">
+ <floater.string name="max_title_msg">
+ Lag Meter
+ </floater.string>
+ <floater.string name="max_width_px">
+ 360
+ </floater.string>
+ <floater.string name="min_title_msg">
+ Lag
+ </floater.string>
+ <floater.string name="min_width_px">
+ 90
+ </floater.string>
+ <floater.string name="client_text_msg">
+ Client
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
+ 10
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
+ 15
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
+ Normal, window in background
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
+ Client frame rate below [CLIENT_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
+ Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING]
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
+ Possible cause: Draw distance set too high
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
+ Possible cause: Images loading
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
+ Possible cause: Too many images in memory
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
+ Possible cause: Too many complex objects in scene
+ </floater.string>
+ <floater.string name="network_text_msg">
+ Network
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
+ 10
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
+ 5
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
+ Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
+ Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
+ 600
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
+ 300
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
+ Connection ping time is over [NETWORK_PING_CRITICAL] ms
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
+ Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
+ Possible bad connection or &apos;Bandwidth&apos; pref too high.
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
+ Possible bad connection or file-sharing app.
+ </floater.string>
+ <floater.string name="server_text_msg">
+ Server
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
+ 30
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
+ Simulator framerate below [SERVER_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
+ Simulator framerate between [SERVER_FRAME_RATE_CRITICAL] and [SERVER_FRAME_RATE_WARNING]
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
+ Possible Cause: Too many physical objects
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
+ Possible Cause: Too many scripted objects
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
+ Possible Cause: Too much network traffic
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
+ Possible Cause: Too many moving people in region
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
+ Possible Cause: Too many image calculations
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
+ Possible Cause: Simulator load too heavy
+ </floater.string>
+ <floater.string name="smaller_label">
+ &gt;&gt;
+ </floater.string>
+ <floater.string name="bigger_label">
+ &lt;&lt;
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="Client lag status"/>
+ <text name="client">
+ Client
+ </text>
+ <text name="client_text">
+ Normal
+ </text>
+ <button name="network_lagmeter" tool_tip="Network lag status"/>
+ <text name="network">
+ Network
+ </text>
+ <text name="network_text">
+ Normal
+ </text>
+ <button name="server_lagmeter" tool_tip="Server lag status"/>
+ <text name="server">
+ Server
+ </text>
+ <text name="server_text">
+ Normal
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Toggle floater size"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_land_holdings.xml b/indra/newview/skins/default/xui/zh/floater_land_holdings.xml
new file mode 100644
index 0000000000..de551f8c96
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_land_holdings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="MY LAND">
+ <floater.string name="area_string">
+ [AREA] m²
+ </floater.string>
+ <scroll_list name="parcel list">
+ <scroll_list.columns label="地段" name="name"/>
+ <scroll_list.columns label="地區" name="location"/>
+ <scroll_list.columns label="Type" name="type"/>
+ <scroll_list.columns label="Area" name="area"/>
+ </scroll_list>
+ <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleport to the center of this land."/>
+ <button label="地圖" label_selected="地圖" name="Show on Map" tool_tip="Show this land on the world map"/>
+ <text name="contrib_label">
+ Contributions to your groups:
+ </text>
+ <scroll_list name="grant list">
+ <scroll_list.columns label="Group" name="group"/>
+ <scroll_list.columns label="Area" name="area"/>
+ </scroll_list>
+ <text name="allowed_label">
+ Allowed land holdings at current payment plan:
+ </text>
+ <text name="allowed_text">
+ [AREA] m²
+ </text>
+ <text name="current_label">
+ Current land holdings:
+ </text>
+ <text name="current_text">
+ [AREA] m²
+ </text>
+ <text name="available_label">
+ Available for land purchases:
+ </text>
+ <text name="available_text">
+ [AREA] m²
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml
new file mode 100644
index 0000000000..6c8bd76a8a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="SCRIPT: NEW SCRIPT">
+ <floater.string name="not_allowed">
+ You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
+ </floater.string>
+ <floater.string name="script_running">
+ Running
+ </floater.string>
+ <floater.string name="Title">
+ SCRIPT: [NAME]
+ </floater.string>
+ <button label="Reset" label_selected="Reset" name="Reset"/>
+ <check_box initial_value="true" label="Running" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml b/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml
new file mode 100644
index 0000000000..e5c3c47827
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL REFERENCE">
+ <check_box label="Follow cursor" name="lock_check"/>
+ <combo_box label="Lock" name="history_combo"/>
+ <button label="Back" name="back_btn"/>
+ <button label="Forward" name="fwd_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_map.xml b/indra/newview/skins/default/xui/zh/floater_map.xml
new file mode 100644
index 0000000000..b535ef0074
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_map.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map" title="">
+ <floater.string name="ToolTipMsg">
+ [REGION](Double-click to open Map, shift-drag to pan)
+ </floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Double-click to teleport, shift-drag to pan)
+ </floater.string>
+ <floater.string name="mini_map_caption">
+ MINIMAP
+ </floater.string>
+ <text label="N" name="floater_map_north">
+ N
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="W" name="floater_map_west">
+ W
+ </text>
+ <text label="S" name="floater_map_south">
+ S
+ </text>
+ <text label="SE" name="floater_map_southeast">
+ SE
+ </text>
+ <text label="NE" name="floater_map_northeast">
+ NE
+ </text>
+ <text label="SW" name="floater_map_southwest">
+ SW
+ </text>
+ <text label="NW" name="floater_map_northwest">
+ NW
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_media_browser.xml b/indra/newview/skins/default/xui/zh/floater_media_browser.xml
new file mode 100644
index 0000000000..616c326d6b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="MEDIA BROWSER">
+ <floater.string name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="Back" name="back"/>
+ <button label="Forward" name="forward"/>
+ <button label="Reload" name="reload"/>
+ <button label="Go" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="rewind" name="rewind"/>
+ <button label="stop" name="stop"/>
+ <button label="forward" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="Send Current Page to Parcel" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Open in My Web Browser" name="open_browser"/>
+ <check_box label="Always open in my web browser" name="open_always"/>
+ <button label="關閉" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_media_settings.xml b/indra/newview/skins/default/xui/zh/floater_media_settings.xml
new file mode 100644
index 0000000000..821b93c06f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="MEDIA SETTINGS">
+ <button label="確定" label_selected="確定" name="OK"/>
+ <button label="取銷" label_selected="取銷" name="Cancel"/>
+ <button label="套用" label_selected="套用" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml b/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml
new file mode 100644
index 0000000000..3fa62b1b60
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="SIMULATE A MEMORY LEAK">
+ <spinner label="Leaking Speed (bytes per frame):" name="leak_speed"/>
+ <spinner label="Max Leaked Memory (MB):" name="max_leak"/>
+ <text name="total_leaked_label">
+ Current leaked memory: [SIZE] KB
+ </text>
+ <text name="note_label_1">
+ [NOTE1]
+ </text>
+ <text name="note_label_2">
+ [NOTE2]
+ </text>
+ <button label="Start" name="start_btn"/>
+ <button label="Stop" name="stop_btn"/>
+ <button label="Release" name="release_btn"/>
+ <button label="關閉" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_moveview.xml b/indra/newview/skins/default/xui/zh/floater_moveview.xml
new file mode 100644
index 0000000000..1866592d84
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_moveview.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater">
+ <string name="walk_forward_tooltip">
+ Walk Forward (press Up Arrow or W)
+ </string>
+ <string name="walk_back_tooltip">
+ Walk Backwards (press Down Arrow or S)
+ </string>
+ <string name="walk_left_tooltip">
+ Walk left (press Shift + Left Arrow or A)
+ </string>
+ <string name="walk_right_tooltip">
+ Walk right (press Shift + Right Arrow or D)
+ </string>
+ <string name="run_forward_tooltip">
+ Run Forward (press Up Arrow or W)
+ </string>
+ <string name="run_back_tooltip">
+ Run Backwards (press Down Arrow or S)
+ </string>
+ <string name="run_left_tooltip">
+ Run left (press Shift + Left Arrow or A)
+ </string>
+ <string name="run_right_tooltip">
+ Run right (press Shift + Right Arrow or D)
+ </string>
+ <string name="fly_forward_tooltip">
+ Fly Forward (press Up Arrow or W)
+ </string>
+ <string name="fly_back_tooltip">
+ Fly Backwards (press Down Arrow or S)
+ </string>
+ <string name="fly_left_tooltip">
+ Fly left (press Shift + Left Arrow or A)
+ </string>
+ <string name="fly_right_tooltip">
+ Fly right (press Shift + Right Arrow or D)
+ </string>
+ <string name="fly_up_tooltip">
+ Fly up (press E)
+ </string>
+ <string name="fly_down_tooltip">
+ Fly down (press C)
+ </string>
+ <string name="jump_tooltip">
+ Jump (press E)
+ </string>
+ <string name="crouch_tooltip">
+ Crouch (press C)
+ </string>
+ <string name="walk_title">
+ Walk
+ </string>
+ <string name="run_title">
+ Run
+ </string>
+ <string name="fly_title">
+ Fly
+ </string>
+ <panel name="panel_actions">
+ <button name="turn left btn" tool_tip="Turn left (press Left Arrow or A)"/>
+ <joystick_slide name="move left btn" tool_tip="Walk left (press Shift + Left Arrow or A)"/>
+ <button name="turn right btn" tool_tip="Turn right (press Right Arrow or D)"/>
+ <joystick_slide name="move right btn" tool_tip="Walk right (press Shift + Right Arrow or D)"/>
+ <joystick_turn name="forward btn" tool_tip="Walk forward (press up arrow or W)"/>
+ <joystick_turn name="backward btn" tool_tip="Walk backward (press down arrow or S)"/>
+ <button name="move up btn" tool_tip="Fly up (press E)"/>
+ <button name="move down btn" tool_tip="Fly down (press C)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Walking mode"/>
+ <button label="" name="mode_run_btn" tool_tip="Running mode"/>
+ <button label="" name="mode_fly_btn" tool_tip="Flying mode"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_mute_object.xml b/indra/newview/skins/default/xui/zh/floater_mute_object.xml
new file mode 100644
index 0000000000..a2a56f769e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_mute_object.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="block by name" title="BLOCK OBJECT BY NAME">
+ <text name="message">
+ Block an object:
+ </text>
+ <line_editor name="object_name">
+ Object name
+ </line_editor>
+ <text name="note">
+ * Only blocks object text, not sounds
+ </text>
+ <button label="確定" name="OK"/>
+ <button label="取銷" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml
new file mode 100644
index 0000000000..bed7c20ba5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="NEARBY CHAT">
+ <check_box label="Translate chat (powered by Google)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_notification.xml b/indra/newview/skins/default/xui/zh/floater_notification.xml
new file mode 100644
index 0000000000..65102216d2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_notification.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification" title="NOTIFICATIONS CONSOLE">
+ <text_editor name="payload">
+ 載入中...
+ </text_editor>
+ <combo_box label="Response" name="response"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_notifications_console.xml b/indra/newview/skins/default/xui/zh/floater_notifications_console.xml
new file mode 100644
index 0000000000..4e92aa69e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_notifications_console.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notifications_console" title="NOTIFICATIONS CONSOLE">
+ <combo_box label="Select notification type" name="notification_types"/>
+ <button label="Add" name="add_notification"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_openobject.xml b/indra/newview/skins/default/xui/zh/floater_openobject.xml
new file mode 100644
index 0000000000..0739e01833
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_openobject.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="OBJECT CONTENTS">
+ <text name="object_name">
+ [DESC]:
+ </text>
+ <button label="Copy To Inventory" label_selected="Copy To Inventory" name="copy_to_inventory_button"/>
+ <button label="Copy And Wear" label_selected="Copy And Wear" name="copy_and_wear_button"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..63c9d6c950
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="Save Outfit">
+ <button label="儲存" label_selected="儲存" name="Save"/>
+ <button label="取銷" label_selected="取銷" name="Cancel"/>
+ <text name="Save item as:">
+ Save what I&apos;m wearing
+as a new Outfit:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (new)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml
new file mode 100644
index 0000000000..a871f821e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="CALLING">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Nearby Voice Chat
+ </floater.string>
+ <floater.string name="anonymous">
+ anonymous
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ is calling.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ has joined a Voice Chat call with a conference chat.
+ </floater.string>
+ <text name="connecting">
+ Connecting to [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Calling [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ No Answer. Please try again later.
+ </text>
+ <text name="nearby">
+ You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Your call has ended. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ You have ended the call. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ Leaving [CURRENT_CHAT].
+ </text>
+ <button label="取銷" label_selected="取銷" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pay.xml b/indra/newview/skins/default/xui/zh/floater_pay.xml
new file mode 100644
index 0000000000..9374ac3f3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_pay.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Pay Group
+ </string>
+ <string name="payee_resident">
+ Pay Resident
+ </string>
+ <text name="payee_name">
+ Test Name That Is Extremely Long To Check Clipping
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ Or, choose amount:
+ </text>
+ <button label="Pay" label_selected="Pay" name="pay btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pay_object.xml b/indra/newview/skins/default/xui/zh/floater_pay_object.xml
new file mode 100644
index 0000000000..fbb6a8ab36
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_pay_object.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Pay Group
+ </string>
+ <string name="payee_resident">
+ Pay Resident
+ </string>
+ <text name="payee_name">
+ Ericacita Moostopolison
+ </text>
+ <text name="object_name_label">
+ Via object:
+ </text>
+ <icon name="icon_object" tool_tip="Objects"/>
+ <text name="object_name_text">
+ My awesome object with a really damn long name
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ 或者,選擇一個金額:
+ </text>
+ <button label="Pay" label_selected="Pay" name="pay btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml b/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml
new file mode 100644
index 0000000000..8d44d474c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="perm prefs" title="預設上傳權限">
+ <panel label="權限" name="permissions">
+ <check_box label="與社團分享" name="share_with_group"/>
+ <check_box label="允許任何人覆製" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ 下一個擁有者可以:
+ </text>
+ <check_box label="修改" name="next_owner_modify"/>
+ <check_box label="覆製" name="next_owner_copy"/>
+ <check_box initial_value="true" label="轉售 / 送人" name="next_owner_transfer"/>
+ </panel>
+ <button label="確定" label_selected="確定" name="ok"/>
+ <button label="取銷" label_selected="取銷" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_post_process.xml b/indra/newview/skins/default/xui/zh/floater_post_process.xml
new file mode 100644
index 0000000000..0972c6dfa6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_post_process.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Post-Process Floater" title="POST-PROCESS SETTINGS">
+ <tab_container name="Post-Process Tabs">
+ <panel label="Color Filter" name="wmiColorFilterPanel">
+ <check_box label="Enable" name="wmiColorFilterToggle"/>
+ <text name="wmiColorFilterBrightnessText">
+ Brightness
+ </text>
+ <text name="wmiColorFilterSaturationText">
+ Saturation
+ </text>
+ <text name="wmiColorFilterContrastText">
+ Contrast
+ </text>
+ <text name="wmiColorFilterBaseText">
+ Contrast Base Color
+ </text>
+ <slider label="R" name="wmiColorFilterBaseR"/>
+ <slider label="G" name="wmiColorFilterBaseG"/>
+ <slider label="B" name="wmiColorFilterBaseB"/>
+ <slider label="I" name="wmiColorFilterBaseI"/>
+ </panel>
+ <panel label="Night Vision" name="wmiNightVisionPanel">
+ <check_box label="Enable" name="wmiNightVisionToggle"/>
+ <text name="wmiNightVisionBrightMultText">
+ Light Amplification Multiple
+ </text>
+ <text name="wmiNightVisionNoiseSizeText">
+ Noise Size
+ </text>
+ <text name="wmiNightVisionNoiseStrengthText">
+ Noise Strength
+ </text>
+ </panel>
+ <panel label="Bloom" name="wmiBloomPanel">
+ <check_box label="Enable" name="wmiBloomToggle"/>
+ <text name="wmiBloomExtractText">
+ Luminosity Extraction
+ </text>
+ <text name="wmiBloomSizeText">
+ Bloom Size
+ </text>
+ <text name="wmiBloomStrengthText">
+ Bloom Strength
+ </text>
+ </panel>
+ <panel label="Extras" name="Extras">
+ <button label="LoadEffect" label_selected="LoadEffect" name="PPLoadEffect"/>
+ <button label="SaveEffect" label_selected="SaveEffect" name="PPSaveEffect"/>
+ <line_editor label="效果名稱" name="PPEffectNameEditor"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_postcard.xml b/indra/newview/skins/default/xui/zh/floater_postcard.xml
new file mode 100644
index 0000000000..c85ca93e85
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_postcard.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="EMAIL SNAPSHOT">
+ <floater.string name="default_subject">
+ Postcard from [SECOND_LIFE].
+ </floater.string>
+ <floater.string name="default_message">
+ Check this out!
+ </floater.string>
+ <floater.string name="upload_message">
+ Sending...
+ </floater.string>
+ <text name="to_label">
+ Recipient&apos;s Email:
+ </text>
+ <text name="from_label">
+ Your Email:
+ </text>
+ <text name="name_label">
+ Your Name:
+ </text>
+ <text name="subject_label">
+ Subject:
+ </text>
+ <line_editor label="Type your subject here." name="subject_form"/>
+ <text name="msg_label">
+ Message:
+ </text>
+ <text_editor name="msg_form">
+ Type your message here.
+ </text_editor>
+ <button label="取銷" name="cancel_btn"/>
+ <button label="Send" name="send_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preferences.xml b/indra/newview/skins/default/xui/zh/floater_preferences.xml
new file mode 100644
index 0000000000..777425ba30
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preferences.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Preferences" title="PREFERENCES">
+ <button label="確定" label_selected="確定" name="OK"/>
+ <button label="取銷" label_selected="取銷" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="一般" name="general"/>
+ <panel label="Graphics" name="display"/>
+ <panel label="Sound &amp; Media" name="audio"/>
+ <panel label="聊天" name="chat"/>
+ <panel label="Move &amp; View" name="move"/>
+ <panel label="Notifications" name="msgs"/>
+ <panel label="Colors" name="colors"/>
+ <panel label="Privacy" name="im"/>
+ <panel label="Setup" name="input"/>
+ <panel label="Advanced" name="advanced1"/>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_animation.xml b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
new file mode 100644
index 0000000000..5ac2de4dc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+ <floater.string name="Title">
+ Animation: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ 描述:
+ </text>
+ <button label="Play Inworld" label_selected="Stop" name="Anim play btn" tool_tip="Play this animation so that others can see it"/>
+ <button label="Play Locally" label_selected="Stop" name="Anim audition btn" tool_tip="Play this animation so that only you can see it"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml b/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml
new file mode 100644
index 0000000000..fe64f75777
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gesture_preview">
+ <floater.string name="step_anim">
+ Animation to play:
+ </floater.string>
+ <floater.string name="step_sound">
+ Sound to play:
+ </floater.string>
+ <floater.string name="step_chat">
+ Chat to say:
+ </floater.string>
+ <floater.string name="step_wait">
+ Wait:
+ </floater.string>
+ <floater.string name="stop_txt">
+ Stop
+ </floater.string>
+ <floater.string name="preview_txt">
+ 預覽
+ </floater.string>
+ <floater.string name="none_text">
+ -- 無 --
+ </floater.string>
+ <floater.string name="Title">
+ Gesture: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ 描述:
+ </text>
+ <text name="trigger_label">
+ Trigger:
+ </text>
+ <text name="replace_text" tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture!">
+ Replace with:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture"/>
+ <text name="key_label">
+ Shortcut Key:
+ </text>
+ <combo_box label="無" name="modifier_combo"/>
+ <combo_box label="無" name="key_combo"/>
+ <text name="library_label">
+ Library:
+ </text>
+ <scroll_list name="library_list">
+ <scroll_list.rows name="action_animation" value="Animation"/>
+ <scroll_list.rows name="action_sound" value="Sound"/>
+ <scroll_list.rows name="action_chat" value="聊天"/>
+ <scroll_list.rows name="action_wait" value="Wait"/>
+ </scroll_list>
+ <button label="Add &gt;&gt;" name="add_btn"/>
+ <text name="steps_label">
+ Steps:
+ </text>
+ <button label="Up" name="up_btn"/>
+ <button label="Down" name="down_btn"/>
+ <button label="Remove" name="delete_btn"/>
+ <text name="options_text">
+ (options)
+ </text>
+ <radio_group name="animation_trigger_type">
+ <radio_item label="Start" name="start"/>
+ <radio_item label="Stop" name="stop"/>
+ </radio_group>
+ <check_box label="until animations are done" name="wait_anim_check"/>
+ <check_box label="time in seconds:" name="wait_time_check"/>
+ <text name="help_label">
+ All steps happen simultaneously, unless you add wait steps.
+ </text>
+ <check_box label="Active" name="active_check" tool_tip="Active gestures can be triggered by chatting their trigger phrases or pressing their hot keys. Gestures usually become inactive when there is a key binding conflict."/>
+ <button label="預覽" name="preview_btn"/>
+ <button label="儲存" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml
new file mode 100644
index 0000000000..a3eaa559e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="NOTECARD:">
+ <floater.string name="no_object">
+ Unable to find object containing this notecard.
+ </floater.string>
+ <floater.string name="not_allowed">
+ You do not have permission to view this notecard.
+ </floater.string>
+ <floater.string name="Title">
+ Notecard: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ 描述:
+ </text>
+ <text_editor name="Notecard Editor">
+ 載入中...
+ </text_editor>
+ <button label="儲存" label_selected="儲存" name="Save"/>
+ <button label="刪除" label_selected="刪除" name="Delete"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_sound.xml b/indra/newview/skins/default/xui/zh/floater_preview_sound.xml
new file mode 100644
index 0000000000..d9854a85b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_sound.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+ <floater.string name="Title">
+ Sound: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ 描述:
+ </text>
+ <button label="Play Inworld" label_selected="Play Inworld" name="Sound play btn" tool_tip="Play this sound so that others can hear it"/>
+ <button label="Play Locally" label_selected="Play Locally" name="Sound audition btn" tool_tip="Play this sound so that only you can hear it"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_texture.xml b/indra/newview/skins/default/xui/zh/floater_preview_texture.xml
new file mode 100644
index 0000000000..53fb7ef2f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_texture.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+ <floater.string name="Title">
+ Texture: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Copy To Inventory
+ </floater.string>
+ <text name="desc txt">
+ 描述:
+ </text>
+ <text name="dimensions">
+ [WIDTH]px x [HEIGHT]px
+ </text>
+ <text name="aspect_ratio">
+ Preview aspect ratio
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Preview at a fixed aspect ratio">
+ <combo_item name="Unconstrained">
+ Unconstrained
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Group insignia or Real World profile">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] profile">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Classifieds and search listings, landmarks">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="關於土地">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Profile picks">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="確定" name="Keep"/>
+ <button label="Discard" name="Discard"/>
+ <button label="另存" name="save_tex_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_publish_classified.xml b/indra/newview/skins/default/xui/zh/floater_publish_classified.xml
new file mode 100644
index 0000000000..45bbe7b979
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_publish_classified.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Publishing Classified">
+ <text name="explanation_text">
+ Your classified ad will run for one week from the date it is published.
+
+Remember, Classified fees are non-refundable.
+ </text>
+ <spinner label="價格: L$" name="price_for_listing" tool_tip="Price for listing." value="50"/>
+ <button label="Publish" name="publish_btn"/>
+ <button label="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml b/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml
new file mode 100644
index 0000000000..b16a3bd9cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Region Debug"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_region_info.xml b/indra/newview/skins/default/xui/zh/floater_region_info.xml
new file mode 100644
index 0000000000..0e4879f555
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_region_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="地區 / 領地"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_report_abuse.xml b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml
new file mode 100644
index 0000000000..c745051c8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="REPORT ABUSE">
+ <floater.string name="Screenshot">
+ Screenshot
+ </floater.string>
+ <check_box label="Use this screenshot" name="screen_check"/>
+ <text name="reporter_title">
+ Reporter:
+ </text>
+ <text name="sim_title">
+ 地區:
+ </text>
+ <text name="sim_field">
+ 地區名稱
+ </text>
+ <text name="pos_title">
+ Position:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Click the button, then the abusive object:
+ </text>
+ <button name="pick_btn" tool_tip="Object Picker - Identify an object as the subject of this report"/>
+ <text name="object_name_label">
+ Object:
+ </text>
+ <text name="owner_name_label">
+ 擁有者:
+ </text>
+ <combo_box name="category_combo" tool_tip="Category -- select the category that best describes this report">
+ <combo_box.item label="Select category" name="Select_category"/>
+ <combo_box.item label="Age &gt; Age play" name="Age__Age_play"/>
+ <combo_box.item label="Age &gt; Adult Resident on Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Age &gt; Underage Resident outside of Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Assault &gt; Combat sandbox / unsafe area" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Assault &gt; Safe area" name="Assault__Safe_area"/>
+ <combo_box.item label="Assault &gt; Weapons testing sandbox" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Commerce &gt; Failure to deliver product or service" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Disclosure &gt; Real world information" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Disclosure &gt; Remotely monitoring chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Disclosure &gt; Second Life information/chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Disturbing the peace &gt; Unfair use of region resources" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Disturbing the peace &gt; Excessive scripted objects" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Disturbing the peace &gt; Object littering" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Disturbing the peace &gt; Repetitive spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Disturbing the peace &gt; Unwanted advert spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraud &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraud &gt; Land" name="Fraud__Land"/>
+ <combo_box.item label="Fraud &gt; Pyramid scheme or chain letter" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraud &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Harassment &gt; Advert farms / visual spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Harassment &gt; Defaming individuals or groups" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Harassment &gt; Impeding movement" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Harassment &gt; Sexual harassment" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Harassment &gt; Solicting/inciting others to violate ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Harassment &gt; Verbal abuse" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecency &gt; Broadly offensive content or conduct" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecency &gt; Inappropriate avatar name" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecency &gt; Inappropriate content or conduct in a PG region" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecency &gt; Inappropriate content or conduct in a Moderate region" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Intellectual property infringement &gt; Content Removal" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Intellectual property infringement &gt; CopyBot or Permissions Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerance" name="Intolerance"/>
+ <combo_box.item label="Land &gt; Abuse of sandbox resources" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Objects/textures" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Particles" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Trees/plants" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Wagering/gambling" name="Wagering_gambling"/>
+ <combo_box.item label="Other" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ Abuser name:
+ </text>
+ <button label="Choose" name="select_abuser" tool_tip="Select the name of the abuser from a list"/>
+ <text name="abuser_name_title2">
+ Location of Abuse:
+ </text>
+ <text name="sum_title">
+ Summary:
+ </text>
+ <text name="dscr_title">
+ Details:
+ </text>
+ <text name="bug_aviso">
+ Please be as specific as possible
+ </text>
+ <text name="incomplete_title">
+ * Incomplete reports won&apos;t be investigated
+ </text>
+ <button label="Report Abuse" label_selected="Report Abuse" name="send_btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_debug.xml b/indra/newview/skins/default/xui/zh/floater_script_debug.xml
new file mode 100644
index 0000000000..12e646785d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_debug.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="script debug floater" title="Script Warning/Error"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_limits.xml b/indra/newview/skins/default/xui/zh/floater_script_limits.xml
new file mode 100644
index 0000000000..7cd2c8e6c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="腳本資訊"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_preview.xml b/indra/newview/skins/default/xui/zh/floater_script_preview.xml
new file mode 100644
index 0000000000..75ef4ebe73
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_preview.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT">
+ <floater.string name="Title">
+ SCRIPT: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ 描述:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_queue.xml b/indra/newview/skins/default/xui/zh/floater_script_queue.xml
new file mode 100644
index 0000000000..4062db5014
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_queue.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="RESET PROGRESS">
+ <floater.string name="Starting">
+ Starting [START] of [COUNT] items.
+ </floater.string>
+ <floater.string name="Done">
+ Done.
+ </floater.string>
+ <floater.string name="Resetting">
+ Resetting
+ </floater.string>
+ <floater.string name="Running">
+ Running
+ </floater.string>
+ <floater.string name="NotRunning">
+ Not running
+ </floater.string>
+ <button label="關閉" label_selected="關閉" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_search.xml b/indra/newview/skins/default/xui/zh/floater_script_search.xml
new file mode 100644
index 0000000000..b6671df0e2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_search.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="SCRIPT SEARCH">
+ <check_box label="Case Insensitive" name="case_text"/>
+ <button label="Search" label_selected="Search" name="search_btn"/>
+ <button label="取代" label_selected="取代" name="replace_btn"/>
+ <button label="全部取代" label_selected="全部取代" name="replace_all_btn"/>
+ <text name="txt">
+ Search
+ </text>
+ <text name="txt2">
+ 取代
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml
new file mode 100644
index 0000000000..5b247350b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="FIND">
+ <floater.string name="loading_text">
+ 載入中...
+ </floater.string>
+ <floater.string name="done_text">
+ Done
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Redo search to reflect current God level
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_select_key.xml b/indra/newview/skins/default/xui/zh/floater_select_key.xml
new file mode 100644
index 0000000000..1452f744da
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_select_key.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <text name="Save item as:">
+ Press a key to set your Speak button trigger.
+ </text>
+ <button label="取銷" label_selected="取銷" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sell_land.xml b/indra/newview/skins/default/xui/zh/floater_sell_land.xml
new file mode 100644
index 0000000000..12d4ed606d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_sell_land.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="出售土地">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ 地段:
+ </text>
+ <text name="info_parcel">
+ 地段名稱
+ </text>
+ <text name="info_size_label">
+ Size:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text name="info_action">
+ To sell this parcel:
+ </text>
+ <text name="price_label">
+ 1. Set a price:
+ </text>
+ <text name="price_text">
+ Choose an appropriate price.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] per m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Sell the land to:
+ </text>
+ <text name="sell_to_text">
+ Choose whether to sell to anyone or a particular buyer.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- Select one -" name="--selectone--"/>
+ <combo_box.item label="任何人" name="Anyone"/>
+ <combo_box.item label="Specific person:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Select" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Sell the objects with the land?
+ </text>
+ <text name="sell_objects_text">
+ Land owner&apos;s transferable objects on parcel will change ownership.
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="No, keep ownership of objects" name="no"/>
+ <radio_item label="Yes, sell objects with land" name="yes"/>
+ </radio_group>
+ <button label="Show Objects" name="show_objects"/>
+ <text name="nag_message_label">
+ REMEMBER: All sales are final.
+ </text>
+ <button label="Set Land For Sale" name="sell_btn"/>
+ <button label="取銷" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_settings_debug.xml b/indra/newview/skins/default/xui/zh/floater_settings_debug.xml
new file mode 100644
index 0000000000..bba075cf08
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_settings_debug.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="除錯設定">
+ <radio_group name="boolean_combo">
+ <radio_item label="TRUE" name="TRUE" value="true"/>
+ <radio_item label="FALSE" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Color" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="Reset to default" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_snapshot.xml b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
new file mode 100644
index 0000000000..80b9d69a79
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Snapshot" title="SNAPSHOT PREVIEW">
+ <floater.string name="unknown">
+ 未知
+ </floater.string>
+ <radio_group label="Snapshot type" name="snapshot_type_radio">
+ <radio_item label="Email" name="postcard"/>
+ <radio_item label="My inventory (L$[AMOUNT])" name="texture"/>
+ <radio_item label="Save to my computer" name="local"/>
+ </radio_group>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
+ <button label="Send" name="send_btn"/>
+ <button label="Save (L$[AMOUNT])" name="upload_btn"/>
+ <flyout_button label="儲存" name="save_btn" tool_tip="Save image to a file">
+ <flyout_button.item label="儲存" name="save_item"/>
+ <flyout_button.item label="另存..." name="saveas_item"/>
+ </flyout_button>
+ <button label="More" name="more_btn" tool_tip="Advanced options"/>
+ <button label="Less" name="less_btn" tool_tip="Advanced options"/>
+ <button label="取銷" name="discard_btn"/>
+ <text name="type_label2">
+ Size
+ </text>
+ <text name="format_label">
+ Format
+ </text>
+ <combo_box label="Resolution" name="postcard_size_combo">
+ <combo_box.item label="Current Window" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Custom" name="Custom"/>
+ </combo_box>
+ <combo_box label="Resolution" name="texture_size_combo">
+ <combo_box.item label="Current Window" name="CurrentWindow"/>
+ <combo_box.item label="Small (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Medium (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Large (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Custom" name="Custom"/>
+ </combo_box>
+ <combo_box label="Resolution" name="local_size_combo">
+ <combo_box.item label="Current Window" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Custom" name="Custom"/>
+ </combo_box>
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
+ </combo_box>
+ <spinner label="Width" name="snapshot_width"/>
+ <spinner label="Height" name="snapshot_height"/>
+ <check_box label="Constrain proportions" name="keep_aspect_check"/>
+ <slider label="Image quality" name="image_quality_slider"/>
+ <text name="layer_type_label">
+ Capture:
+ </text>
+ <combo_box label="Image Layers" name="layer_types">
+ <combo_box.item label="Colors" name="Colors"/>
+ <combo_box.item label="Depth" name="Depth"/>
+ </combo_box>
+ <check_box label="Interface" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Keep open after saving" name="keep_open_check"/>
+ <check_box label="Freeze frame (fullscreen)" name="freeze_frame_check"/>
+ <check_box label="Auto-refresh" name="auto_snapshot_check"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sound_preview.xml b/indra/newview/skins/default/xui/zh/floater_sound_preview.xml
new file mode 100644
index 0000000000..269cd5db08
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_sound_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
+ <text name="name_label">
+ 名稱:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+ <button label="取銷" label_selected="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_stats.xml b/indra/newview/skins/default/xui/zh/floater_stats.xml
new file mode 100644
index 0000000000..6b6276e88f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="STATISTICS">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Basic" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bandwidth" name="bandwidth"/>
+ <stat_bar label="封包損失" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Advanced" name="advanced">
+ <stat_view label="Render" name="render">
+ <stat_bar label="KTris Drawn" name="ktrisframe"/>
+ <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="Total Objects" name="objs"/>
+ <stat_bar label="New Objects" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Texture" name="texture">
+ <stat_bar label="Count" name="numimagesstat"/>
+ <stat_bar label="Raw Count" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Network" name="network">
+ <stat_bar label="Packets In" name="packetsinstat"/>
+ <stat_bar label="Packets Out" name="packetsoutstat"/>
+ <stat_bar label="Objects" name="objectkbitstat"/>
+ <stat_bar label="Texture" name="texturekbitstat"/>
+ <stat_bar label="Asset" name="assetkbitstat"/>
+ <stat_bar label="Layers" name="layerskbitstat"/>
+ <stat_bar label="Actual In" name="actualinkbitstat"/>
+ <stat_bar label="Actual Out" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulator" name="sim">
+ <stat_bar label="Time Dilation" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Physics FPS" name="simphysicsfps"/>
+ <stat_view label="Physics Details" name="physicsdetail">
+ <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+ <stat_bar label="Low LOD Objects" name="physicslodtasks"/>
+ <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="Agent Updates/Sec" name="simagentups"/>
+ <stat_bar label="Main Agents" name="simmainagents"/>
+ <stat_bar label="Child Agents" name="simchildagents"/>
+ <stat_bar label="Objects" name="simobjects"/>
+ <stat_bar label="Active Objects" name="simactiveobjects"/>
+ <stat_bar label="Active Scripts" name="simactivescripts"/>
+ <stat_bar label="Script Events" name="simscripteps"/>
+ <stat_bar label="Packets In" name="siminpps"/>
+ <stat_bar label="Packets Out" name="simoutpps"/>
+ <stat_bar label="擱置下載" name="simpendingdownloads"/>
+ <stat_bar label="擱置上傳" name="simpendinguploads"/>
+ <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+ <stat_view label="Time (ms)" name="simperf">
+ <stat_bar label="Total Frame Time" name="simframemsec"/>
+ <stat_bar label="Net Time" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Simulation Time" name="simsimothermsec"/>
+ <stat_bar label="Agent Time" name="simagentmsec"/>
+ <stat_bar label="Images Time" name="simimagesmsec"/>
+ <stat_bar label="Script Time" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sys_well.xml b/indra/newview/skins/default/xui/zh/floater_sys_well.xml
new file mode 100644
index 0000000000..dbdd32974c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="NOTIFICATIONS">
+ <string name="title_im_well_window">
+ CONVERSATIONS
+ </string>
+ <string name="title_notification_well_window">
+ NOTIFICATIONS
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_telehub.xml b/indra/newview/skins/default/xui/zh/floater_telehub.xml
new file mode 100644
index 0000000000..b4c9f3ab29
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_telehub.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Explicit left edge to avoid overlapping build tools -->
+<floater name="telehub" title="TELEHUB">
+ <text name="status_text_connected">
+ Telehub connected to object [OBJECT]
+ </text>
+ <text name="status_text_not_connected">
+ No telehub connected.
+ </text>
+ <text name="help_text_connected">
+ To remove, click Disconnect.
+ </text>
+ <text name="help_text_not_connected">
+ Select object and click Connect Telehub.
+ </text>
+ <button label="Connect Telehub" name="connect_btn"/>
+ <button label="Disconnect" name="disconnect_btn"/>
+ <text name="spawn_points_text">
+ Spawn Points (positions, not objects):
+ </text>
+ <button label="Add Spawn" name="add_spawn_point_btn"/>
+ <button label="Remove Spawn" name="remove_spawn_point_btn"/>
+ <text name="spawn_point_help">
+ Select object and click &quot;Add Spawn&quot; to specify position.
+You can then move or delete the object.
+Positions are relative to the telehub center.
+Select an item in list to highlight it inworld.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
new file mode 100644
index 0000000000..4c6dffea76
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="PICK: TEXTURE">
+ <floater.string name="choose_picture">
+ 點擊以挑選圖片
+ </floater.string>
+ <floater.string name="pick title">
+ Pick:
+ </floater.string>
+ <text name="Multiple">
+ Multiple textures
+ </text>
+ <text name="unknown">
+ Size: [DIMENSIONS]
+ </text>
+ <button label="預設" label_selected="預設" name="Default"/>
+ <button label="無" label_selected="無" name="None"/>
+ <button label="Blank" label_selected="Blank" name="Blank"/>
+ <check_box initial_value="true" label="立即套用" name="apply_immediate_check"/>
+ <filter_editor label="Filter Textures" name="inventory search editor"/>
+ <check_box initial_value="false" label="顯示資料夾" name="show_folders_check"/>
+ <button label="確定" label_selected="確定" name="Select"/>
+ <button label="取銷" label_selected="取銷" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml
new file mode 100644
index 0000000000..b0d3d69230
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_tools.xml
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="BUILD TOOLS">
+ <floater.string name="status_rotate">
+ Drag colored bands to rotate object
+ </floater.string>
+ <floater.string name="status_scale">
+ Click and drag to stretch selected side
+ </floater.string>
+ <floater.string name="status_move">
+ Drag to move, shift-drag to copy
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Click and hold to modify land
+ </floater.string>
+ <floater.string name="status_camera">
+ Click and drag to move camera
+ </floater.string>
+ <floater.string name="status_grab">
+ Drag to move, Ctrl to lift, Ctrl+Shift to rotate
+ </floater.string>
+ <floater.string name="status_place">
+ Click inworld to build
+ </floater.string>
+ <floater.string name="status_selectland">
+ Click and drag to select land
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Screen
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ World
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Reference
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Attachment
+ </floater.string>
+ <button name="button focus" tool_tip="Focus"/>
+ <button name="button move" tool_tip="移動"/>
+ <button name="button edit" tool_tip="編輯"/>
+ <button name="button create" tool_tip="Create"/>
+ <button name="button land" tool_tip="Land"/>
+ <text name="text status">
+ Drag to move, shift-drag to copy
+ </text>
+ <radio_group name="focus_radio_group">
+ <radio_item label="Zoom" name="radio zoom"/>
+ <radio_item label="Orbit (Ctrl)" name="radio orbit"/>
+ <radio_item label="Pan (Ctrl+Shift)" name="radio pan"/>
+ </radio_group>
+ <slider_bar initial_value="0.125" name="slider zoom"/>
+ <radio_group name="move_radio_group">
+ <radio_item label="移動" name="radio move"/>
+ <radio_item label="Lift (Ctrl)" name="radio lift"/>
+ <radio_item label="Spin (Ctrl+Shift)" name="radio spin"/>
+ </radio_group>
+ <radio_group name="edit_radio_group">
+ <radio_item label="移動" name="radio position"/>
+ <radio_item label="Rotate (Ctrl)" name="radio rotate"/>
+ <radio_item label="Stretch (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Select Face" name="radio select face"/>
+ </radio_group>
+ <check_box label="Edit linked" name="checkbox edit linked parts"/>
+ <button label="Link" name="link_btn"/>
+ <button label="Unlink" name="unlink_btn"/>
+ <text name="RenderingCost" tool_tip="Shows the rendering cost calculated for this object">
+ þ: [COUNT]
+ </text>
+ <text label="Stretch Both Sides" name="checkbox uniform label">
+ Stretch Both Sides
+ </text>
+ <check_box initial_value="true" label="Stretch Textures" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="貼齊格線" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Choose the type of grid ruler for positioning the object">
+ <combo_box.item label="World grid" name="World"/>
+ <combo_box.item label="Local grid" name="Local"/>
+ <combo_box.item label="Reference grid" name="Reference"/>
+ </combo_box>
+ <button name="Options..." tool_tip="See more grid options"/>
+ <button name="ToolCube" tool_tip="Cube"/>
+ <button name="ToolPrism" tool_tip="Prism"/>
+ <button name="ToolPyramid" tool_tip="Pyramid"/>
+ <button name="ToolTetrahedron" tool_tip="Tetrahedron"/>
+ <button name="ToolCylinder" tool_tip="Cylinder"/>
+ <button name="ToolHemiCylinder" tool_tip="Hemicylinder"/>
+ <button name="ToolCone" tool_tip="Cone"/>
+ <button name="ToolHemiCone" tool_tip="Hemicone"/>
+ <button name="ToolSphere" tool_tip="Sphere"/>
+ <button name="ToolHemiSphere" tool_tip="Hemisphere"/>
+ <button name="ToolTorus" tool_tip="Torus"/>
+ <button name="ToolTube" tool_tip="Tube"/>
+ <button name="ToolRing" tool_tip="Ring"/>
+ <button name="ToolTree" tool_tip="Tree"/>
+ <button name="ToolGrass" tool_tip="Grass"/>
+ <check_box label="Keep Tool selected" name="checkbox sticky"/>
+ <check_box label="Copy selection" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Center Copy" name="checkbox copy centers"/>
+ <check_box label="Rotate Copy" name="checkbox copy rotates"/>
+ <radio_group name="land_radio_group">
+ <radio_item label="Select Land" name="radio select land"/>
+ <radio_item label="Flatten" name="radio flatten"/>
+ <radio_item label="Raise" name="radio raise"/>
+ <radio_item label="Lower" name="radio lower"/>
+ <radio_item label="Smooth" name="radio smooth"/>
+ <radio_item label="Roughen" name="radio noise"/>
+ <radio_item label="Revert" name="radio revert"/>
+ </radio_group>
+ <text name="Bulldozer:">
+ Bulldozer:
+ </text>
+ <text name="Dozer Size:">
+ Size
+ </text>
+ <slider_bar initial_value="2.0" name="slider brush size"/>
+ <text name="Strength:">
+ Strength
+ </text>
+ <slider_bar initial_value="0.00" name="slider force"/>
+ <button label="套用" label_selected="套用" name="button apply to selection" tool_tip="Modify selected land"/>
+ <text name="obj_count">
+ Objects: [COUNT]
+ </text>
+ <text name="prim_count">
+ Prims: [COUNT]
+ </text>
+ <tab_container name="Object Info Tabs">
+ <panel label="一般" name="General">
+ <panel.string name="text deed continued">
+ Deed
+ </panel.string>
+ <panel.string name="text deed">
+ Deed
+ </panel.string>
+ <panel.string name="text modify info 1">
+ You can modify this object
+ </panel.string>
+ <panel.string name="text modify info 2">
+ You can modify these objects
+ </panel.string>
+ <panel.string name="text modify info 3">
+ You can&apos;t modify this object
+ </panel.string>
+ <panel.string name="text modify info 4">
+ You can&apos;t modify these objects
+ </panel.string>
+ <panel.string name="text modify warning">
+ You must select entire object to set permissions
+ </panel.string>
+ <panel.string name="Cost Default">
+ 價格: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ 總價: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <text name="Name:">
+ 名稱:
+ </text>
+ <text name="Description:">
+ 描述:
+ </text>
+ <text name="Creator:">
+ 創造者:
+ </text>
+ <text name="Owner:">
+ 擁有者:
+ </text>
+ <text name="Group:">
+ Group:
+ </text>
+ <name_box initial_value="載入中..." name="Group Name Proxy"/>
+ <button name="button set group" tool_tip="Choose a group to share this object&apos;s permissions"/>
+ <check_box label="分享" name="checkbox share with group" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
+ <button label="Deed" label_selected="Deed" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
+ <text name="label click action">
+ Click to:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Touch (default)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sit on object" name="Sitonobject"/>
+ <combo_box.item label="Buy object" name="Buyobject"/>
+ <combo_box.item label="Pay object" name="Payobject"/>
+ <combo_box.item label="Open" name="Open"/>
+ <combo_box.item label="Zoom" name="Zoom"/>
+ </combo_box>
+ <check_box label="出售:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="副本" name="Copy"/>
+ <combo_box.item label="內容" name="Contents"/>
+ <combo_box.item label="原件" name="Original"/>
+ </combo_box>
+ <spinner label="價格: L$" name="Edit Cost"/>
+ <check_box label="Show in search" name="search_check" tool_tip="Let people see this object in search results"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ You can modify this object
+ </text>
+ <text name="Anyone can:">
+ 任何人:
+ </text>
+ <check_box label="移動" name="checkbox allow everyone move"/>
+ <check_box label="覆製" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ 下一個擁有者:
+ </text>
+ <check_box label="修改" name="checkbox next owner can modify"/>
+ <check_box label="覆製" name="checkbox next owner can copy"/>
+ <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個擁有者可以送人或轉售這個物件"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel label="Object" name="Object">
+ <check_box label="Locked" name="checkbox locked" tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits."/>
+ <check_box label="Physical" name="Physical Checkbox Ctrl" tool_tip="Allows object to be pushed and affected by gravity"/>
+ <check_box label="Temporary" name="Temporary Checkbox Ctrl" tool_tip="Causes object to be deleted 1 minute after creation"/>
+ <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Causes object to not collide with other objects or avatars"/>
+ <text name="label position">
+ Position (meters)
+ </text>
+ <spinner label="X" name="Pos X"/>
+ <spinner label="Y" name="Pos Y"/>
+ <spinner label="Z" name="Pos Z"/>
+ <text name="label size">
+ Size (meters)
+ </text>
+ <spinner label="X" name="Scale X"/>
+ <spinner label="Y" name="Scale Y"/>
+ <spinner label="Z" name="Scale Z"/>
+ <text name="label rotation">
+ Rotation (degrees)
+ </text>
+ <spinner label="X" name="Rot X"/>
+ <spinner label="Y" name="Rot Y"/>
+ <spinner label="Z" name="Rot Z"/>
+ <combo_box name="comboBaseType">
+ <combo_box.item label="Box" name="Box"/>
+ <combo_box.item label="Cylinder" name="Cylinder"/>
+ <combo_box.item label="Prism" name="Prism"/>
+ <combo_box.item label="Sphere" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Tube" name="Tube"/>
+ <combo_box.item label="Ring" name="Ring"/>
+ <combo_box.item label="Sculpted" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Stone" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Glass" name="Glass"/>
+ <combo_box.item label="Wood" name="Wood"/>
+ <combo_box.item label="Flesh" name="Flesh"/>
+ <combo_box.item label="Plastic" name="Plastic"/>
+ <combo_box.item label="Rubber" name="Rubber"/>
+ </combo_box>
+ <text name="text cut">
+ Path Cut (begin/end)
+ </text>
+ <spinner label="B" name="cut begin"/>
+ <spinner label="E" name="cut end"/>
+ <text name="text hollow">
+ Hollow
+ </text>
+ <text name="text skew">
+ Skew
+ </text>
+ <text name="Hollow Shape">
+ Hollow Shape
+ </text>
+ <combo_box name="hole">
+ <combo_box.item label="預設" name="Default"/>
+ <combo_box.item label="Circle" name="Circle"/>
+ <combo_box.item label="Square" name="Square"/>
+ <combo_box.item label="Triangle" name="Triangle"/>
+ </combo_box>
+ <text name="text twist">
+ Twist (begin/end)
+ </text>
+ <spinner label="B" name="Twist Begin"/>
+ <spinner label="E" name="Twist End"/>
+ <text name="scale_taper">
+ Taper
+ </text>
+ <text name="scale_hole">
+ Hole Size
+ </text>
+ <spinner label="X" name="Taper Scale X"/>
+ <spinner label="Y" name="Taper Scale Y"/>
+ <text name="text topshear">
+ Top Shear
+ </text>
+ <spinner label="X" name="Shear X"/>
+ <spinner label="Y" name="Shear Y"/>
+ <text name="advanced_cut">
+ Profile Cut (begin/end)
+ </text>
+ <text name="advanced_dimple">
+ Dimple (begin/end)
+ </text>
+ <text name="advanced_slice">
+ Slice (begin/end)
+ </text>
+ <spinner label="B" name="Path Limit Begin"/>
+ <spinner label="E" name="Path Limit End"/>
+ <text name="text taper2">
+ Taper
+ </text>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
+ <text name="text radius delta">
+ Radius
+ </text>
+ <text name="text revolutions">
+ Revolutions
+ </text>
+ <texture_picker label="Sculpt Texture" name="sculpt texture control" tool_tip="點擊以挑選圖片"/>
+ <check_box label="Mirror" name="sculpt mirror control" tool_tip="Flips sculpted prim along the X axis"/>
+ <check_box label="Inside-out" name="sculpt invert control" tool_tip="Inverts the sculpted prims normals, making it appear inside-out"/>
+ <text name="label sculpt type">
+ Stitching type
+ </text>
+ <combo_box name="sculpt type control">
+ <combo_box.item label="(無)" name="None"/>
+ <combo_box.item label="Sphere" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Plane" name="Plane"/>
+ <combo_box.item label="Cylinder" name="Cylinder"/>
+ </combo_box>
+ </panel>
+ <panel label="Features" name="Features">
+ <text name="select_single">
+ Select only one primitive to edit features.
+ </text>
+ <text name="edit_object">
+ Edit object features:
+ </text>
+ <check_box label="Flexible Path" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/>
+ <spinner label="Softness" name="FlexNumSections"/>
+ <spinner label="Gravity" name="FlexGravity"/>
+ <spinner label="Drag" name="FlexFriction"/>
+ <spinner label="Wind" name="FlexWind"/>
+ <spinner label="Tension" name="FlexTension"/>
+ <spinner label="Force X" name="FlexForceX"/>
+ <spinner label="Force Y" name="FlexForceY"/>
+ <spinner label="Force Z" name="FlexForceZ"/>
+ <check_box label="Light" name="Light Checkbox Ctrl" tool_tip="Causes object to emit light"/>
+ <color_swatch name="colorswatch" tool_tip="Click to open color picker"/>
+ <texture_picker label="" name="light texture control" tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"/>
+ <spinner label="Intensity" name="Light Intensity"/>
+ <spinner label="FOV" name="Light FOV"/>
+ <spinner label="Radius" name="Light Radius"/>
+ <spinner label="Focus" name="Light Focus"/>
+ <spinner label="Falloff" name="Light Falloff"/>
+ <spinner label="Ambiance" name="Light Ambiance"/>
+ </panel>
+ <panel label="Texture" name="Texture">
+ <panel.string name="string repeats per meter">
+ Repeats Per Meter
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Repeats Per Face
+ </panel.string>
+ <texture_picker label="Texture" name="texture control" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color" name="colorswatch" tool_tip="Click to open color picker"/>
+ <text name="color trans">
+ Transparency %
+ </text>
+ <text name="glow label">
+ Glow
+ </text>
+ <check_box label="Full Bright" name="checkbox fullbright"/>
+ <text name="tex gen">
+ Mapping
+ </text>
+ <combo_box name="combobox texgen">
+ <combo_box.item label="預設" name="Default"/>
+ <combo_box.item label="Planar" name="Planar"/>
+ </combo_box>
+ <text name="label shininess">
+ Shininess
+ </text>
+ <combo_box name="combobox shininess">
+ <combo_box.item label="無" name="None"/>
+ <combo_box.item label="Low" name="Low"/>
+ <combo_box.item label="Medium" name="Medium"/>
+ <combo_box.item label="High" name="High"/>
+ </combo_box>
+ <text name="label bumpiness">
+ Bumpiness
+ </text>
+ <combo_box name="combobox bumpiness">
+ <combo_box.item label="無" name="None"/>
+ <combo_box.item label="Brightness" name="Brightness"/>
+ <combo_box.item label="Darkness" name="Darkness"/>
+ <combo_box.item label="woodgrain" name="woodgrain"/>
+ <combo_box.item label="bark" name="bark"/>
+ <combo_box.item label="bricks" name="bricks"/>
+ <combo_box.item label="checker" name="checker"/>
+ <combo_box.item label="concrete" name="concrete"/>
+ <combo_box.item label="crustytile" name="crustytile"/>
+ <combo_box.item label="cutstone" name="cutstone"/>
+ <combo_box.item label="discs" name="discs"/>
+ <combo_box.item label="gravel" name="gravel"/>
+ <combo_box.item label="petridish" name="petridish"/>
+ <combo_box.item label="siding" name="siding"/>
+ <combo_box.item label="stonetile" name="stonetile"/>
+ <combo_box.item label="stucco" name="stucco"/>
+ <combo_box.item label="suction" name="suction"/>
+ <combo_box.item label="weave" name="weave"/>
+ </combo_box>
+ <check_box initial_value="false" label="Align planar faces" name="checkbox planar align" tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping."/>
+ <text name="rpt">
+ Repeats / Face
+ </text>
+ <spinner label="Horizontal (U)" name="TexScaleU"/>
+ <check_box label="Flip" name="checkbox flip s"/>
+ <spinner label="Vertical (V)" name="TexScaleV"/>
+ <check_box label="Flip" name="checkbox flip t"/>
+ <spinner label="Rotation˚" name="TexRot"/>
+ <spinner label="Repeats / Meter" name="rptctrl"/>
+ <button label="套用" label_selected="套用" name="button apply"/>
+ <text name="tex offset">
+ Texture Offset
+ </text>
+ <spinner label="Horizontal (U)" name="TexOffsetU"/>
+ <spinner label="Vertical (V)" name="TexOffsetV"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Media
+ </text>
+ <button name="add_media" tool_tip="Add Media"/>
+ <button name="delete_media" tool_tip="Delete this media texture"/>
+ <button name="edit_media" tool_tip="Edit this Media"/>
+ <button label="Align" label_selected="Align Media" name="button align" tool_tip="Align media texture (must load first)"/>
+ </panel>
+ </panel>
+ <panel label="Content" name="Contents">
+ <button label="New Script" label_selected="New Script" name="button new script"/>
+ <button label="Permissions" name="button permissions"/>
+ </panel>
+ </tab_container>
+ <panel name="land info panel">
+ <text name="label_parcel_info">
+ Parcel Information
+ </text>
+ <text name="label_area_price">
+ Price: L$[PRICE] for [AREA] m²
+ </text>
+ <text name="label_area">
+ 面積: [AREA] m²
+ </text>
+ <button label="關於土地" label_selected="關於土地" name="button about land"/>
+ <check_box label="顯示擁有主" name="checkbox show owners" tool_tip="Colorize the parcels according to the type of owner:
+
+Green = Your land
+Aqua = Your group&apos;s land
+Red = Owned by others
+Yellow = For sale
+Purple = For auction
+Grey = Public"/>
+ <text name="label_parcel_modify">
+ Modify Parcel
+ </text>
+ <button label="Subdivide" label_selected="Subdivide" name="button subdivide land"/>
+ <button label="Join" label_selected="Join" name="button join land"/>
+ <text name="label_parcel_trans">
+ Land Transactions
+ </text>
+ <button label="購買土地" label_selected="購買土地" name="button buy land"/>
+ <button label="Abandon Land" label_selected="Abandon Land" name="button abandon land"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_top_objects.xml b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
new file mode 100644
index 0000000000..c1ad927bbb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="top_objects" title="Top Objects">
+ <floater.string name="top_scripts_title">
+ Top Scripts
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] scripts taking a total of [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Time
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Mono Time
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Top Colliders
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ Top [COUNT] objects experiencing many potential collisions
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Score
+ </floater.string>
+ <floater.string name="none_descriptor">
+ None found.
+ </floater.string>
+ <text name="title_text">
+ 載入中...
+ </text>
+ <scroll_list name="objects_list">
+ <scroll_list.columns label="Score" name="score"/>
+ <scroll_list.columns label="名稱" name="name"/>
+ <scroll_list.columns label="擁有者" name="owner"/>
+ <scroll_list.columns label="位置" name="location"/>
+ <scroll_list.columns label="Time" name="time"/>
+ <scroll_list.columns label="Mono Time" name="mono_time"/>
+ <scroll_list.columns label="URLs" name="URLs"/>
+ </scroll_list>
+ <text name="id_text">
+ Object ID:
+ </text>
+ <button label="Show Beacon" name="show_beacon_btn"/>
+ <text name="obj_name_text">
+ 物件名稱:
+ </text>
+ <button label="Filter" name="filter_object_btn"/>
+ <text name="owner_name_text">
+ 擁有者:
+ </text>
+ <button label="Filter" name="filter_owner_btn"/>
+ <button label="Return Selected" name="return_selected_btn"/>
+ <button label="全部退回" name="return_all_btn"/>
+ <button label="Disable Selected" name="disable_selected_btn"/>
+ <button label="Disable All" name="disable_all_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_tos.xml b/indra/newview/skins/default/xui/zh/floater_tos.xml
new file mode 100644
index 0000000000..acc61a7961
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_tos.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
+ <button label="繼續" label_selected="繼續" name="Continue"/>
+ <button label="取銷" label_selected="取銷" name="Cancel"/>
+ <check_box label="我同意接受服務條款及隱私政策" name="agree_chk"/>
+ <text name="tos_heading">
+ 請謹慎閱讀以下的服務條款及隱私政策。要繼續登入到 [SECOND_LIFE],你必須接受這些協議。
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_url_entry.xml b/indra/newview/skins/default/xui/zh/floater_url_entry.xml
new file mode 100644
index 0000000000..2b4f5ea11d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_url_entry.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="url_entry">
+ <text name="media_label">
+ Media URL:
+ </text>
+ <button label="" name="ok_btn"/>
+ <button label="取銷" name="cancel_btn"/>
+ <button label="清除" name="clear_btn"/>
+ <text name="loading_label">
+ 載入中...
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_voice_controls.xml b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
new file mode 100644
index 0000000000..d4a76555cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Voice Controls">
+ <string name="title_nearby">
+ NEARBY VOICE
+ </string>
+ <string name="title_group">
+ Group Call with [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Conference Call
+ </string>
+ <string name="title_peer_2_peer">
+ Call with [NAME]
+ </string>
+ <string name="no_one_near">
+ No one near has voice enabled
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="My Avatar:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_panel">
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Leave Call" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
new file mode 100644
index 0000000000..b9021d25d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Places" name="voice_effects" title="語音變聲">
+ <string name="no_voice_effect">
+ (No Voice Morph)
+ </string>
+ <string name="active_voice_effect">
+ (Active)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Unsubscribed)
+ </string>
+ <string name="new_voice_effect">
+ (New!)
+ </string>
+ <text name="preview_text">
+ To Preview
+ </text>
+ <text name="status_text">
+ Record a sample, then click on a voice to hear how it will sound.
+ </text>
+ <button label="Record" name="record_btn" tool_tip="Record a sample of your voice."/>
+ <button label="Stop" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] Subscribe Now]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Record a sample of your voice, then click an effect to preview.">
+ <scroll_list.columns label="語音名稱" name="name"/>
+ <scroll_list.columns label="過期" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_water.xml b/indra/newview/skins/default/xui/zh/floater_water.xml
new file mode 100644
index 0000000000..2e0fcd13a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_water.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="ADVANCED WATER EDITOR">
+ <floater.string name="WLDefaultWaterNames">
+ Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Water Presets:
+ </text>
+ <button label="New" label_selected="New" name="WaterNewPreset"/>
+ <button label="儲存" label_selected="儲存" name="WaterSavePreset"/>
+ <button label="刪除" label_selected="刪除" name="WaterDeletePreset"/>
+ <tab_container name="Water Tabs">
+ <panel label="設定" name="Settings">
+ <text name="BHText">
+ Water Fog Color
+ </text>
+ <color_swatch name="WaterFogColor" tool_tip="Click to open color picker"/>
+ <text name="WaterFogDensText">
+ Fog Density Exponent
+ </text>
+ <text name="WaterUnderWaterFogModText">
+ Underwater Fog Modifier
+ </text>
+ <text name="BDensText">
+ Reflection Wavelet Scale
+ </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
+ <text name="HDText">
+ Fresnel Scale
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel Offset
+ </text>
+ <text name="DensMultText">
+ Refract Scale Above
+ </text>
+ <text name="WaterScaleBelowText">
+ Refract Scale Below
+ </text>
+ <text name="MaxAltText">
+ Blur Multiplier
+ </text>
+ </panel>
+ <panel label="IMAGE" name="Waves">
+ <text name="BHText">
+ Big Wave Direction
+ </text>
+ <text name="WaterWave1DirXText">
+ X
+ </text>
+ <text name="WaterWave1DirYText">
+ Y
+ </text>
+ <text name="BHText2">
+ Little Wave Direction
+ </text>
+ <text name="WaterWave2DirXText">
+ X
+ </text>
+ <text name="WaterWave2DirYText">
+ Y
+ </text>
+ <text name="BHText3">
+ Normal Map
+ </text>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_web_content.xml b/indra/newview/skins/default/xui/zh/floater_web_content.xml
new file mode 100644
index 0000000000..2670e223d3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Navigate back"/>
+ <button name="forward" tool_tip="Navigate forward"/>
+ <button name="stop" tool_tip="Stop navigation"/>
+ <button name="reload" tool_tip="重載頁面"/>
+ <combo_box name="address" tool_tip="Enter URL here"/>
+ <icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/>
+ <button name="popexternal" tool_tip="Open current URL in your desktop browser"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..ea360be6c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="WHITELIST ENTRY">
+ <text name="media_label">
+ Enter a URL or URL pattern to add to the list of allowed domains
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Enter a URL or URL pattern to White List"/>
+ <button label="確定" name="ok_btn"/>
+ <button label="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_windlight_options.xml b/indra/newview/skins/default/xui/zh/floater_windlight_options.xml
new file mode 100644
index 0000000000..2b202a9e6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_windlight_options.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="ADVANCED SKY EDITOR">
+ <floater.string name="WLDefaultSkyNames">
+ A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Sky Presets:
+ </text>
+ <button label="New" label_selected="New" name="WLNewPreset"/>
+ <button label="儲存" label_selected="儲存" name="WLSavePreset"/>
+ <button label="刪除" label_selected="刪除" name="WLDeletePreset"/>
+ <button label="Day Cycle Editor" label_selected="Day Cycle Editor" name="WLDayCycleMenuButton"/>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSPHERE" name="Atmosphere">
+ <text name="BHText">
+ Blue Horizon
+ </text>
+ <text name="BHText2">
+ R
+ </text>
+ <text name="BHText3">
+ G
+ </text>
+ <text name="BHText4">
+ B
+ </text>
+ <text name="BHText5">
+ I
+ </text>
+ <text name="BDensText">
+ Haze Horizon
+ </text>
+ <text name="BDensText2">
+ Blue Density
+ </text>
+ <text name="BHText6">
+ R
+ </text>
+ <text name="BHText7">
+ G
+ </text>
+ <text name="BHText8">
+ B
+ </text>
+ <text name="BHText9">
+ I
+ </text>
+ <text name="HDText">
+ Haze Density
+ </text>
+ <text name="DensMultText">
+ Density Multiplier
+ </text>
+ <text name="WLDistanceMultText">
+ Distance Multiplier
+ </text>
+ <text name="MaxAltText">
+ Max Altitude
+ </text>
+ </panel>
+ <panel label="LIGHTING" name="Lighting">
+ <text name="SLCText">
+ Sun/Moon Color
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="TODText">
+ Sun/Moon Position
+ </text>
+ <text name="WLAmbientText">
+ Ambient
+ </text>
+ <text name="BHText5">
+ R
+ </text>
+ <text name="BHText6">
+ G
+ </text>
+ <text name="BHText7">
+ B
+ </text>
+ <text name="BHText8">
+ I
+ </text>
+ <text name="WLEastAngleText">
+ East Angle
+ </text>
+ <text name="SunGlowText">
+ Sun Glow
+ </text>
+ <slider label="Focus" name="WLGlowB"/>
+ <slider label="Size" name="WLGlowR"/>
+ <text name="SceneGammaText">
+ Scene Gamma
+ </text>
+ <text name="WLStarText">
+ Star Brightness
+ </text>
+ </panel>
+ <panel label="CLOUDS" name="Clouds">
+ <text name="WLCloudColorText">
+ Cloud Color
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="WLCloudColorText2">
+ Cloud XY/Density
+ </text>
+ <text name="BHText5">
+ X
+ </text>
+ <text name="BHText6">
+ Y
+ </text>
+ <text name="BHText7">
+ D
+ </text>
+ <text name="WLCloudCoverageText">
+ Cloud Coverage
+ </text>
+ <text name="WLCloudScaleText">
+ Cloud Scale
+ </text>
+ <text name="WLCloudDetailText">
+ Cloud Detail (XY/Density)
+ </text>
+ <text name="BHText8">
+ X
+ </text>
+ <text name="BHText9">
+ Y
+ </text>
+ <text name="BHText10">
+ D
+ </text>
+ <text name="WLCloudScrollXText">
+ Cloud Scroll X
+ </text>
+ <check_box label="Lock" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Cloud Scroll Y
+ </text>
+ <check_box label="Lock" name="WLCloudLockY"/>
+ <check_box label="Draw Classic Clouds" name="DrawClassicClouds"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_window_size.xml b/indra/newview/skins/default/xui/zh/floater_window_size.xml
new file mode 100644
index 0000000000..34b969c2dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="WINDOW SIZE">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Set window size:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="width x height">
+ <combo_box.item label="1000 x 700 (default)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="設定" name="set_btn"/>
+ <button label="取銷" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_world_map.xml b/indra/newview/skins/default/xui/zh/floater_world_map.xml
new file mode 100644
index 0000000000..e149285ab2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_world_map.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="worldmap" title="世界地圖">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Legend
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Center map on my avatar&apos;s location"/>
+ <text name="me_label">
+ Me
+ </text>
+ <text name="person_label">
+ Person
+ </text>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <text name="land_sale_label">
+ Land Sale
+ </text>
+ <text name="auction_label">
+ land auction
+ </text>
+ <text name="by_owner_label">
+ by owner
+ </text>
+ <button name="Go Home" tool_tip="Teleport to my home location"/>
+ <text name="Home_label">
+ Home
+ </text>
+ <text name="events_label">
+ Events:
+ </text>
+ <text name="pg_label">
+ 一般
+ </text>
+ <check_box initial_value="true" name="events_mature_chk"/>
+ <text name="events_mature_label">
+ Moderate
+ </text>
+ <text name="events_adult_label">
+ Adult
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Find on Map
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <combo_box label="Online Friends" name="friend combo" tool_tip="Show friends on map">
+ <combo_box.item label="My Friends Online" name="item1"/>
+ </combo_box>
+ <combo_box label="My Landmarks" name="landmark combo" tool_tip="Landmark to show on map">
+ <combo_box.item label="My Landmarks" name="item1"/>
+ </combo_box>
+ <search_editor label="Regions by Name" name="location" tool_tip="Type the name of a region"/>
+ <button label="Find" name="DoSearch" tool_tip="Search for region"/>
+ <button name="Clear" tool_tip="Clear tracking lines and reset map"/>
+ <text name="events_label">
+ 位置:
+ </text>
+ <button label="Teleport" name="Teleport" tool_tip="Teleport to selected location"/>
+ <button label="Copy SLurl" name="copy_slurl" tool_tip="Copies current location as SLurl to be used on the web."/>
+ <button label="Show Selection" name="Show Destination" tool_tip="Center map on selected location"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_avatar.xml b/indra/newview/skins/default/xui/zh/inspect_avatar.xml
new file mode 100644
index 0000000000..df450937fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/inspect_avatar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_subtitle" value="11 Months, 3 days old"/>
+ <text name="user_details">
+ This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
+ </text>
+ <slider name="volume_slider" tool_tip="Voice volume" value="0.5"/>
+ <button label="加為朋友" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Profile" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Disable Voice" name="disable_voice"/>
+ <button label="Enable Voice" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_group.xml b/indra/newview/skins/default/xui/zh/inspect_group.xml
new file mode 100644
index 0000000000..72e5eade9c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/inspect_group.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Private group
+ </string>
+ <string name="FreeToJoin">
+ Free to join
+ </string>
+ <string name="CostToJoin">
+ L$[AMOUNT] to join
+ </string>
+ <string name="YouAreMember">
+ You are a member
+ </string>
+ <text name="group_subtitle">
+ 123 members
+ </text>
+ <text name="group_details">
+ A group of folks charged with creating a room with a moose.
+Fear the moose! Fear it! And the mongoose too!
+ </text>
+ <text name="group_cost">
+ L$123 to join
+ </text>
+ <button label="Join" name="join_btn"/>
+ <button label="Leave" name="leave_btn"/>
+ <button label="View Profile" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_object.xml b/indra/newview/skins/default/xui/zh/inspect_object.xml
new file mode 100644
index 0000000000..f1fe037087
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/inspect_object.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ By [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ By [CREATOR]
+Owner [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Free!
+ </string>
+ <string name="Touch">
+ Touch
+ </string>
+ <string name="Sit">
+ Sit
+ </string>
+ <text name="object_creator">
+ by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ L$30,000
+ </text>
+ <icon name="secure_browsing" tool_tip="Secure Browsing"/>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="購買" name="buy_btn"/>
+ <button label="Pay" name="pay_btn"/>
+ <button label="取得副本" name="take_free_copy_btn"/>
+ <button label="Touch" name="touch_btn"/>
+ <button label="Sit" name="sit_btn"/>
+ <button label="Open" name="open_btn"/>
+ <button label="More" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_remote_object.xml b/indra/newview/skins/default/xui/zh/inspect_remote_object.xml
new file mode 100644
index 0000000000..26f49ce69a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/inspect_remote_object.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Test Object Name That Is Really Long OMG so long I can&apos;t believe how long the name of this object is, I mean really.
+ </text>
+ <text name="object_owner_label">
+ 擁有者:
+ </text>
+ <text name="object_owner">
+ Longavatarname Johnsonlongstonnammer
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="地圖" name="map_btn"/>
+ <button label="Block" name="block_btn"/>
+ <button label="關閉" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..3c8c3e4a31
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Add Wearable Gear Menu">
+ <menu_item_check label="依最近排序" name="sort_by_most_recent"/>
+ <menu_item_check label="依名稱排序" name="sort_by_name"/>
+ <menu_item_check label="依類型排序" name="sort_by_type"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_other.xml b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml
new file mode 100644
index 0000000000..b674ed2763
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="View Profile" name="Profile..."/>
+ <menu_item_call label="加為朋友" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Call" name="Call"/>
+ <menu_item_call label="Invite to Group" name="Invite..."/>
+ <menu_item_call label="Block" name="Avatar Mute"/>
+ <menu_item_call label="Report" name="abuse"/>
+ <menu_item_call label="Freeze" name="Freeze..."/>
+ <menu_item_call label="Eject" name="Eject..."/>
+ <menu_item_call label="Debug Textures" name="Debug..."/>
+ <menu_item_call label="Zoom In" name="Zoom In"/>
+ <menu_item_call label="Pay" name="Pay..."/>
+ <menu_item_call label="Object Profile" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_self.xml b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
new file mode 100644
index 0000000000..2089f8d58a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Touch" name="Attachment Object Touch"/>
+ <menu_item_call label="編輯" name="Edit..."/>
+ <menu_item_call label="卸下" name="Detach"/>
+ <menu_item_call label="坐下" name="Sit Down Here"/>
+ <menu_item_call label="起立" name="Stand Up"/>
+ <menu_item_call label="My Appearance" name="Change Outfit"/>
+ <menu_item_call label="Edit My Outfit" name="Edit Outfit"/>
+ <menu_item_call label="Edit My Shape" name="Edit My Shape"/>
+ <menu_item_call label="My Friends" name="Friends..."/>
+ <menu_item_call label="My Groups" name="Groups..."/>
+ <menu_item_call label="My Profile" name="Profile..."/>
+ <menu_item_call label="Debug Textures" name="Debug..."/>
+ <menu_item_call label="Drop" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml b/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml
new file mode 100644
index 0000000000..cce8fa3ca6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="View Profile" name="Show Profile"/>
+ <menu_item_call label="Send IM..." name="Send IM"/>
+ <menu_item_call label="加為朋友..." name="Add Friend"/>
+ <menu_item_call label="Remove Friend..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_other.xml b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml
new file mode 100644
index 0000000000..db22646ced
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="View Profile" name="Profile..."/>
+ <menu_item_call label="加為朋友" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Call" name="Call"/>
+ <menu_item_call label="Invite to Group" name="Invite..."/>
+ <menu_item_call label="Block" name="Avatar Mute"/>
+ <menu_item_call label="Report" name="abuse"/>
+ <menu_item_call label="Freeze" name="Freeze..."/>
+ <menu_item_call label="Eject" name="Eject..."/>
+ <menu_item_call label="Debug Textures" name="Debug..."/>
+ <menu_item_call label="Zoom In" name="Zoom In"/>
+ <menu_item_call label="Pay" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
new file mode 100644
index 0000000000..bccae5b547
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="坐下" name="Sit Down Here"/>
+ <menu_item_call label="起立" name="Stand Up"/>
+ <context_menu label="脫下" name="Take Off &gt;">
+ <context_menu label="Clothes" name="Clothes &gt;">
+ <menu_item_call label="襯衫" name="Shirt"/>
+ <menu_item_call label="褲子" name="Pants"/>
+ <menu_item_call label="裙子" name="Skirt"/>
+ <menu_item_call label="鞋子" name="Shoes"/>
+ <menu_item_call label="襪子" name="Socks"/>
+ <menu_item_call label="夾克" name="Jacket"/>
+ <menu_item_call label="手套" name="Gloves"/>
+ <menu_item_call label="內衣" name="Self Undershirt"/>
+ <menu_item_call label="內褲" name="Self Underpants"/>
+ <menu_item_call label="刺青" name="Self Tattoo"/>
+ <menu_item_call label="Physics" name="Self Physics"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="All Clothes" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="卸下" name="Object Detach"/>
+ <menu_item_call label="全部卸下" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="My Appearance" name="Chenge Outfit"/>
+ <menu_item_call label="Edit My Outfit" name="Edit Outfit"/>
+ <menu_item_call label="Edit My Shape" name="Edit My Shape"/>
+ <menu_item_call label="My Friends" name="Friends..."/>
+ <menu_item_call label="My Groups" name="Groups..."/>
+ <menu_item_call label="My Profile" name="Profile..."/>
+ <menu_item_call label="Debug Textures" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_bottomtray.xml b/indra/newview/skins/default/xui/zh/menu_bottomtray.xml
new file mode 100644
index 0000000000..d55b3afc95
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Speak Button" name="EnableVoiceChat"/>
+ <menu_item_check label="Gesture button" name="ShowGestureButton"/>
+ <menu_item_check label="Move button" name="ShowMoveButton"/>
+ <menu_item_check label="View button" name="ShowCameraButton"/>
+ <menu_item_check label="Snapshot button" name="ShowSnapshotButton"/>
+ <menu_item_check label="Build button" name="ShowBuildButton"/>
+ <menu_item_check label="Search button" name="ShowSearchButton"/>
+ <menu_item_check label="地圖按鈕" name="ShowWorldMapButton"/>
+ <menu_item_check label="迷你地圖按鈕" name="ShowMiniMapButton"/>
+ <menu_item_call label="剪下" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="覆製" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="貼上" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="刪除" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="全選" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_cof_attachment.xml b/indra/newview/skins/default/xui/zh/menu_cof_attachment.xml
new file mode 100644
index 0000000000..876fef16df
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="卸下" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_cof_body_part.xml b/indra/newview/skins/default/xui/zh/menu_cof_body_part.xml
new file mode 100644
index 0000000000..d06207b19d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="取代" name="replace"/>
+ <menu_item_call label="編輯" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_cof_clothing.xml b/indra/newview/skins/default/xui/zh/menu_cof_clothing.xml
new file mode 100644
index 0000000000..300ff47b12
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="脫下" name="take_off"/>
+ <menu_item_call label="編輯" name="edit"/>
+ <menu_item_call label="取代" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_cof_gear.xml b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml
new file mode 100644
index 0000000000..7314676c6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear COF">
+ <menu label="New Clothes" name="COF.Gear.New_Clothes"/>
+ <menu label="New Body Parts" name="COF.Geear.New_Body_Parts"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_edit.xml b/indra/newview/skins/default/xui/zh/menu_edit.xml
new file mode 100644
index 0000000000..1e645acc7a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="編輯" name="Edit">
+ <menu_item_call label="復原" name="Undo"/>
+ <menu_item_call label="Redo" name="Redo"/>
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="覆製貼上" name="Duplicate"/>
+ <menu_item_call label="全選" name="Select All"/>
+ <menu_item_call label="Deselect" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_favorites.xml b/indra/newview/skins/default/xui/zh/menu_favorites.xml
new file mode 100644
index 0000000000..042f5c3a93
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleport" name="Teleport To Landmark"/>
+ <menu_item_call label="View/Edit Landmark" name="Landmark Open"/>
+ <menu_item_call label="Copy SLurl" name="Copy slurl"/>
+ <menu_item_call label="顯示在地圖上" name="Show On Map"/>
+ <menu_item_call label="覆製" name="Landmark Copy"/>
+ <menu_item_call label="貼上" name="Landmark Paste"/>
+ <menu_item_call label="刪除" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml b/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml
new file mode 100644
index 0000000000..488d80bfad
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gesture_gear">
+ <menu_item_call label="Add/Remove from Favorites" name="activate"/>
+ <menu_item_call label="覆製" name="copy_gesture"/>
+ <menu_item_call label="貼上" name="paste"/>
+ <menu_item_call label="Copy UUID" name="copy_uuid"/>
+ <menu_item_call label="Save to current outfit" name="save_to_outfit"/>
+ <menu_item_call label="編輯" name="edit_gesture"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_group_plus.xml b/indra/newview/skins/default/xui/zh/menu_group_plus.xml
new file mode 100644
index 0000000000..77c2c92491
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Join Group..." name="item_join"/>
+ <menu_item_call label="New Group..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml
new file mode 100644
index 0000000000..f03749533e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Show Navigation Bar" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Show Favorites Bar" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Show Mini-Location Bar" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_im_well_button.xml b/indra/newview/skins/default/xui/zh/menu_im_well_button.xml
new file mode 100644
index 0000000000..4b9b4b2758
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="全部關閉" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..6cf86327be
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="End Session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..7ca805278a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Group Info" name="Show Profile"/>
+ <menu_item_call label="Show Session" name="Chat"/>
+ <menu_item_call label="End Session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..d9254f7aff
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="View Profile" name="Show Profile"/>
+ <menu_item_call label="加為朋友" name="Add Friend"/>
+ <menu_item_call label="Show Session" name="Send IM"/>
+ <menu_item_call label="End Session" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..2ed6cfad89
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="View Profile" name="view_profile"/>
+ <menu_item_call label="加為朋友" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Call" name="call"/>
+ <menu_item_call label="Teleport" name="teleport"/>
+ <menu_item_call label="Invite to Group" name="invite_to_group"/>
+ <menu_item_call label="Block" name="block"/>
+ <menu_item_call label="Unblock" name="unblock"/>
+ <menu_item_call label="Report" name="report"/>
+ <menu_item_call label="Freeze" name="freeze"/>
+ <menu_item_call label="Eject" name="eject"/>
+ <menu_item_call label="Kick" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
+ <menu_item_call label="Debug Textures" name="debug"/>
+ <menu_item_call label="Find On Map" name="find_on_map"/>
+ <menu_item_call label="Zoom In" name="zoom_in"/>
+ <menu_item_call label="Pay" name="pay"/>
+ <menu_item_call label="分享" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..41ea648803
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Touch" name="touch"/>
+ <menu_item_call label="Sit" name="sit"/>
+ <menu_item_call label="Pay" name="pay"/>
+ <menu_item_call label="購買" name="buy"/>
+ <menu_item_call label="Take" name="take"/>
+ <menu_item_call label="取得副本" name="take_copy"/>
+ <menu_item_call label="Open" name="open"/>
+ <menu_item_call label="編輯" name="edit"/>
+ <menu_item_call label="Wear" name="wear"/>
+ <menu_item_call label="Add" name="add"/>
+ <menu_item_call label="Report" name="report"/>
+ <menu_item_call label="Block" name="block"/>
+ <menu_item_call label="Zoom In" name="zoom_in"/>
+ <menu_item_call label="Remove" name="remove"/>
+ <menu_item_call label="更多資訊" name="more_info"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..c88826708e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+ <menu_item_call label="坐下" name="Sit Down Here"/>
+ <menu_item_call label="起立" name="Stand Up"/>
+ <context_menu label="脫下" name="Take Off &gt;">
+ <context_menu label="Clothes" name="Clothes &gt;">
+ <menu_item_call label="襯衫" name="Shirt"/>
+ <menu_item_call label="褲子" name="Pants"/>
+ <menu_item_call label="裙子" name="Skirt"/>
+ <menu_item_call label="鞋子" name="Shoes"/>
+ <menu_item_call label="襪子" name="Socks"/>
+ <menu_item_call label="夾克" name="Jacket"/>
+ <menu_item_call label="手套" name="Gloves"/>
+ <menu_item_call label="內衣" name="Self Undershirt"/>
+ <menu_item_call label="內褲" name="Self Underpants"/>
+ <menu_item_call label="刺青" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="All Clothes" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="卸下" name="Object Detach"/>
+ <menu_item_call label="全部卸下" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Change Outfit" name="Chenge Outfit"/>
+ <menu_item_call label="Edit My Outfit" name="Edit Outfit"/>
+ <menu_item_call label="Edit My Shape" name="Edit My Shape"/>
+ <menu_item_call label="My Friends" name="Friends..."/>
+ <menu_item_call label="My Groups" name="Groups..."/>
+ <menu_item_call label="My Profile" name="Profile..."/>
+ <menu_item_call label="Debug Textures" name="Debug..."/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..577e5988f8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="關閉" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory.xml b/indra/newview/skins/default/xui/zh/menu_inventory.xml
new file mode 100644
index 0000000000..086a89fc33
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inventory.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="購買" name="Task Buy"/>
+ <menu_item_call label="Open" name="Task Open"/>
+ <menu_item_call label="Play" name="Task Play"/>
+ <menu_item_call label="Properties" name="Task Properties"/>
+ <menu_item_call label="更名" name="Task Rename"/>
+ <menu_item_call label="刪除" name="Task Remove"/>
+ <menu_item_call label="清空垃圾筒" name="Empty Trash"/>
+ <menu_item_call label="Empty Lost And Found" name="Empty Lost And Found"/>
+ <menu_item_call label="新資料夾" name="New Folder"/>
+ <menu_item_call label="New Script" name="New Script"/>
+ <menu_item_call label="New Notecard" name="New Note"/>
+ <menu_item_call label="New Gesture" name="New Gesture"/>
+ <menu label="New Clothes" name="New Clothes">
+ <menu_item_call label="新襯衫" name="New Shirt"/>
+ <menu_item_call label="新褲子" name="New Pants"/>
+ <menu_item_call label="新鞋子" name="New Shoes"/>
+ <menu_item_call label="新襪子" name="New Socks"/>
+ <menu_item_call label="新夾克" name="New Jacket"/>
+ <menu_item_call label="新裙子" name="New Skirt"/>
+ <menu_item_call label="新手套" name="New Gloves"/>
+ <menu_item_call label="新內衣" name="New Undershirt"/>
+ <menu_item_call label="新內褲" name="New Underpants"/>
+ <menu_item_call label="New Alpha Mask" name="New Alpha Mask"/>
+ <menu_item_call label="New Tattoo" name="New Tattoo"/>
+ <menu_item_call label="New Physics" name="New Physics"/>
+ </menu>
+ <menu label="New Body Parts" name="New Body Parts">
+ <menu_item_call label="New Shape" name="New Shape"/>
+ <menu_item_call label="New Skin" name="New Skin"/>
+ <menu_item_call label="New Hair" name="New Hair"/>
+ <menu_item_call label="New Eyes" name="New Eyes"/>
+ </menu>
+ <menu label="Change Type" name="Change Type">
+ <menu_item_call label="預設" name="Default"/>
+ <menu_item_call label="手套" name="Gloves"/>
+ <menu_item_call label="夾克" name="Jacket"/>
+ <menu_item_call label="褲子" name="Pants"/>
+ <menu_item_call label="Shape" name="Shape"/>
+ <menu_item_call label="鞋子" name="Shoes"/>
+ <menu_item_call label="襯衫" name="Shirt"/>
+ <menu_item_call label="裙子" name="Skirt"/>
+ <menu_item_call label="內褲" name="Underpants"/>
+ <menu_item_call label="內衣" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Teleport" name="Landmark Open"/>
+ <menu_item_call label="Open" name="Animation Open"/>
+ <menu_item_call label="Open" name="Sound Open"/>
+ <menu_item_call label="Replace Current Outfit" name="Replace Outfit"/>
+ <menu_item_call label="Add To Current Outfit" name="Add To Outfit"/>
+ <menu_item_call label="Remove From Current Outfit" name="Remove From Outfit"/>
+ <menu_item_call label="Find Original" name="Find Original"/>
+ <menu_item_call label="Purge Item" name="Purge Item"/>
+ <menu_item_call label="Restore Item" name="Restore Item"/>
+ <menu_item_call label="Open" name="Open"/>
+ <menu_item_call label="Open Original" name="Open Original"/>
+ <menu_item_call label="Properties" name="Properties"/>
+ <menu_item_call label="更名" name="Rename"/>
+ <menu_item_call label="Copy Asset UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="Paste As Link" name="Paste As Link"/>
+ <menu_item_call label="刪除" name="Remove Link"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="刪除系統資料夾" name="Delete System Folder"/>
+ <menu_item_call label="Start Conference Chat" name="Conference Chat Folder"/>
+ <menu_item_call label="Play" name="Sound Play"/>
+ <menu_item_call label="About Landmark" name="About Landmark"/>
+ <menu_item_call label="Play Inworld" name="Animation Play"/>
+ <menu_item_call label="Play Locally" name="Animation Audition"/>
+ <menu_item_call label="Send Instant Message" name="Send Instant Message"/>
+ <menu_item_call label="Offer Teleport..." name="Offer Teleport..."/>
+ <menu_item_call label="Start Conference Chat" name="Conference Chat"/>
+ <menu_item_call label="Activate" name="Activate"/>
+ <menu_item_call label="Deactivate" name="Deactivate"/>
+ <menu_item_call label="另存" name="Save As"/>
+ <menu_item_call label="Detach From Yourself" name="Detach From Yourself"/>
+ <menu_item_call label="Wear" name="Wearable And Object Wear"/>
+ <menu label="Attach To" name="Attach To"/>
+ <menu label="Attach To HUD" name="Attach To HUD"/>
+ <menu_item_call label="編輯" name="Wearable Edit"/>
+ <menu_item_call label="Add" name="Wearable Add"/>
+ <menu_item_call label="脫下" name="Take Off"/>
+ <menu_item_call label="--no options--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory_add.xml b/indra/newview/skins/default/xui/zh/menu_inventory_add.xml
new file mode 100644
index 0000000000..1cfba8e989
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inventory_add.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="上傳" name="upload">
+ <menu_item_call label="圖像(L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="聲音(L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="動作(L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="大批(L$[COST] 每檔案)..." name="Bulk Upload"/>
+ <menu_item_call label="設定預設上傳權限" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="新資料夾" name="New Folder"/>
+ <menu_item_call label="新腳本" name="New Script"/>
+ <menu_item_call label="新記事卡" name="New Note"/>
+ <menu_item_call label="新姿勢" name="New Gesture"/>
+ <menu label="新衣服" name="New Clothes">
+ <menu_item_call label="新襯衫" name="New Shirt"/>
+ <menu_item_call label="新褲子" name="New Pants"/>
+ <menu_item_call label="新鞋子" name="New Shoes"/>
+ <menu_item_call label="新襪子" name="New Socks"/>
+ <menu_item_call label="新夾克" name="New Jacket"/>
+ <menu_item_call label="新裙子" name="New Skirt"/>
+ <menu_item_call label="新手套" name="New Gloves"/>
+ <menu_item_call label="新內衣" name="New Undershirt"/>
+ <menu_item_call label="新內褲" name="New Underpants"/>
+ <menu_item_call label="New Alpha" name="New Alpha"/>
+ <menu_item_call label="新刺青" name="New Tattoo"/>
+ <menu_item_call label="New Physics" name="New Physics"/>
+ </menu>
+ <menu label="New Body Parts" name="New Body Parts">
+ <menu_item_call label="新體形" name="New Shape"/>
+ <menu_item_call label="新皮膚" name="New Skin"/>
+ <menu_item_call label="新頭髮" name="New Hair"/>
+ <menu_item_call label="新眼睛" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..8b0fd8c014
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="New Inventory Window" name="new_window"/>
+ <menu_item_check label="依名稱排序" name="sort_by_name"/>
+ <menu_item_check label="依最近排序" name="sort_by_recent"/>
+ <menu_item_check label="Sort Folders Always by Name" name="sort_folders_by_name"/>
+ <menu_item_check label="Sort System Folders to Top" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Show Filters" name="show_filters"/>
+ <menu_item_call label="Reset Filters" name="reset_filters"/>
+ <menu_item_call label="關閉全部資料夾" name="close_folders"/>
+ <menu_item_call label="Empty Lost and Found" name="empty_lostnfound"/>
+ <menu_item_call label="Save Texture As" name="Save Texture As"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="Find Original" name="Find Original"/>
+ <menu_item_call label="Find All Links" name="Find All Links"/>
+ <menu_item_call label="清空垃圾筒" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_land.xml b/indra/newview/skins/default/xui/zh/menu_land.xml
new file mode 100644
index 0000000000..84941d138c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="關於土地" name="Place Information..."/>
+ <menu_item_call label="坐在此處" name="Sit Here"/>
+ <menu_item_call label="購買這塊土地" name="Land Buy"/>
+ <menu_item_call label="購買通行權" name="Land Buy Pass"/>
+ <menu_item_call label="建造" name="Create"/>
+ <menu_item_call label="編輯地形" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_landmark.xml b/indra/newview/skins/default/xui/zh/menu_landmark.xml
new file mode 100644
index 0000000000..f91b479fb6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copy SLurl" name="copy"/>
+ <menu_item_call label="刪除" name="delete"/>
+ <menu_item_call label="Create Pick" name="pick"/>
+ <menu_item_call label="Add to Favorites Bar" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_login.xml b/indra/newview/skins/default/xui/zh/menu_login.xml
new file mode 100644
index 0000000000..056c11e69d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_login.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Me" name="File">
+ <menu_item_call label="Preferences" name="Preferences..."/>
+ <menu_item_call label="Exit [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Help" name="Help">
+ <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
+ <menu_item_call label="About [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Show Debug Menu" name="Show Debug Menu"/>
+ <menu label="除錯" name="Debug">
+ <menu_item_call label="Show Debug Settings" name="Debug Settings"/>
+ <menu_item_call label="UI/Color Settings" name="UI/Color Settings"/>
+ <menu_item_call label="XUI Preview Tool" name="UI Preview Tool"/>
+ <menu label="UI Tests" name="UI Tests"/>
+ <menu_item_call label="Set Window Size..." name="Set Window Size..."/>
+ <menu_item_call label="Show TOS" name="TOS"/>
+ <menu_item_call label="Show Critical Message" name="Critical"/>
+ <menu_item_call label="Media Browser Test" name="Web Browser Test"/>
+ <menu_item_call label="Web Content Floater Test" name="Web Content Floater Test"/>
+ <menu_item_check label="Show Grid Picker" name="Show Grid Picker"/>
+ <menu_item_call label="Show Notifications Console" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml b/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
new file mode 100644
index 0000000000..2ec95aa4f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_mini_map.xml b/indra/newview/skins/default/xui/zh/menu_mini_map.xml
new file mode 100644
index 0000000000..24bc6355c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Zoom Close" name="Zoom Close"/>
+ <menu_item_call label="Zoom Medium" name="Zoom Medium"/>
+ <menu_item_call label="Zoom Far" name="Zoom Far"/>
+ <menu_item_call label="Zoom Default" name="Zoom Default"/>
+ <menu_item_check label="旋轉地圖" name="Rotate Map"/>
+ <menu_item_check label="自動居中" name="Auto Center"/>
+ <menu_item_call label="停止追蹤" name="Stop Tracking"/>
+ <menu_item_call label="世界地圖" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_navbar.xml b/indra/newview/skins/default/xui/zh/menu_navbar.xml
new file mode 100644
index 0000000000..66b5fbe58d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="顯示座標" name="Show Coordinates"/>
+ <menu_item_check label="顯示地段屬性" name="Show Parcel Properties"/>
+ <menu_item_call label="Landmark" name="Landmark"/>
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="全選" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml b/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml
new file mode 100644
index 0000000000..6e525cccd5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Show Nearby People..." name="nearby_people"/>
+ <menu_item_check label="Show Blocked Text" name="muted_text"/>
+ <menu_item_check label="Show Buddy Icons" name="show_buddy_icons"/>
+ <menu_item_check label="Show Names" name="show_names"/>
+ <menu_item_check label="Show Icons and Names" name="show_icons_and_names"/>
+ <menu_item_call label="Font Size" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_notification_well_button.xml b/indra/newview/skins/default/xui/zh/menu_notification_well_button.xml
new file mode 100644
index 0000000000..b629f73584
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="全部關閉" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_object.xml b/indra/newview/skins/default/xui/zh/menu_object.xml
new file mode 100644
index 0000000000..6107318a0e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_object.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Touch" name="Object Touch"/>
+ <menu_item_call label="編輯" name="Edit..."/>
+ <menu_item_call label="Build" name="Build"/>
+ <menu_item_call label="Open" name="Open"/>
+ <menu_item_call label="Sit Here" name="Object Sit"/>
+ <menu_item_call label="起立" name="Object Stand Up"/>
+ <menu_item_call label="Object Profile" name="Object Inspect"/>
+ <menu_item_call label="Zoom In" name="Zoom In"/>
+ <context_menu label="Put On" name="Put On">
+ <menu_item_call label="Wear" name="Wear"/>
+ <menu_item_call label="Add" name="Add"/>
+ <context_menu label="Attach" name="Object Attach"/>
+ <context_menu label="Attach HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Manage" name="Remove">
+ <menu_item_call label="Report Abuse" name="Report Abuse..."/>
+ <menu_item_call label="Block" name="Object Mute"/>
+ <menu_item_call label="Return" name="Return..."/>
+ </context_menu>
+ <menu_item_call label="Take" name="Pie Object Take"/>
+ <menu_item_call label="取得副本" name="Take Copy"/>
+ <menu_item_call label="Pay" name="Pay..."/>
+ <menu_item_call label="購買" name="Buy..."/>
+ <menu_item_call label="刪除" name="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_object_icon.xml b/indra/newview/skins/default/xui/zh/menu_object_icon.xml
new file mode 100644
index 0000000000..7cf6289bd1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Object Profile..." name="Object Profile"/>
+ <menu_item_call label="Block..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml
new file mode 100644
index 0000000000..6befd163b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Outfit">
+ <menu_item_call label="Wear - Replace Current Outfit" name="wear"/>
+ <menu_item_call label="Wear - Add to Current Outfit" name="wear_add"/>
+ <menu_item_call label="Take Off - Remove from Current Outfit" name="take_off"/>
+ <menu label="New Clothes" name="New Clothes">
+ <menu_item_call label="新襯衫" name="New Shirt"/>
+ <menu_item_call label="新褲子" name="New Pants"/>
+ <menu_item_call label="新鞋子" name="New Shoes"/>
+ <menu_item_call label="新襪子" name="New Socks"/>
+ <menu_item_call label="新夾克" name="New Jacket"/>
+ <menu_item_call label="新裙子" name="New Skirt"/>
+ <menu_item_call label="新手套" name="New Gloves"/>
+ <menu_item_call label="新內衣" name="New Undershirt"/>
+ <menu_item_call label="新內褲" name="New Underpants"/>
+ <menu_item_call label="New Alpha" name="New Alpha"/>
+ <menu_item_call label="New Physics" name="New Physics"/>
+ <menu_item_call label="New Tattoo" name="New Tattoo"/>
+ </menu>
+ <menu label="New Body Parts" name="New Body Parts">
+ <menu_item_call label="New Shape" name="New Shape"/>
+ <menu_item_call label="New Skin" name="New Skin"/>
+ <menu_item_call label="New Hair" name="New Hair"/>
+ <menu_item_call label="New Eyes" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Rename Outfit" name="rename"/>
+ <menu_item_call label="Delete Outfit" name="delete_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_tab.xml b/indra/newview/skins/default/xui/zh/menu_outfit_tab.xml
new file mode 100644
index 0000000000..9254aadf56
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Wear - Replace Current Outfit" name="wear_replace"/>
+ <menu_item_call label="Wear - Add to Current Outfit" name="wear_add"/>
+ <menu_item_call label="Take Off - Remove from Current Outfit" name="take_off"/>
+ <menu_item_call label="Edit Outfit" name="edit"/>
+ <menu_item_call label="Rename Outfit" name="rename"/>
+ <menu_item_call label="Delete Outfit" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_participant_list.xml b/indra/newview/skins/default/xui/zh/menu_participant_list.xml
new file mode 100644
index 0000000000..c487c35588
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="依名稱排序" name="SortByName"/>
+ <menu_item_check label="Sort by Recent Speakers" name="SortByRecentSpeakers"/>
+ <menu_item_call label="View Profile" name="View Profile"/>
+ <menu_item_call label="加為朋友" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Call" name="Call"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="Pay" name="Pay"/>
+ <menu_item_check label="View People Icons" name="View Icons"/>
+ <menu_item_check label="Block Voice" name="Block/Unblock"/>
+ <menu_item_check label="Block Text" name="MuteText"/>
+ <context_menu label="Moderator Options" name="Moderator Options">
+ <menu_item_check label="Allow text chat" name="AllowTextChat"/>
+ <menu_item_call label="Mute this participant" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Unmute this participant" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Mute everyone" name="ModerateVoiceMute"/>
+ <menu_item_call label="Unmute everyone" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..2b0c461312
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="依名稱排序" name="sort_name"/>
+ <menu_item_check label="依狀態排序" name="sort_status"/>
+ <menu_item_check label="View People Icons" name="view_icons"/>
+ <menu_item_check label="View Permissions Granted" name="view_permissions"/>
+ <menu_item_call label="Show Blocked Residents &amp; Objects" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups.xml b/indra/newview/skins/default/xui/zh/menu_people_groups.xml
new file mode 100644
index 0000000000..c2d7182a6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="察看資訊" name="View Info"/>
+ <menu_item_call label="聊天" name="Chat"/>
+ <menu_item_call label="Call" name="Call"/>
+ <menu_item_call label="Activate" name="Activate"/>
+ <menu_item_call label="Leave" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..2c84a858af
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Display Group Icons" name="Display Group Icons"/>
+ <menu_item_call label="Leave Selected Group" name="Leave Selected Group"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml
new file mode 100644
index 0000000000..2ca0ad6a89
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="View Profile" name="View Profile"/>
+ <menu_item_call label="加為朋友" name="Add Friend"/>
+ <menu_item_call label="Remove Friend" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Call" name="Call"/>
+ <menu_item_call label="地圖" name="Map"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="Pay" name="Pay"/>
+ <menu_item_check label="Block/Unblock" name="Block/Unblock"/>
+ <menu_item_call label="Offer Teleport" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..a71609170b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="加為朋友" name="Add Friends"/>
+ <menu_item_call label="移除朋友" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Call" name="Call"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="Pay" name="Pay"/>
+ <menu_item_call label="Offer Teleport" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..5cf54b117b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Sort by Recent Speakers" name="sort_by_recent_speakers"/>
+ <menu_item_check label="依名稱排序" name="sort_name"/>
+ <menu_item_check label="依距離排序" name="sort_distance"/>
+ <menu_item_check label="View People Icons" name="view_icons"/>
+ <menu_item_call label="Show Blocked Residents &amp; Objects" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..5a4729abde
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="依最近排序" name="sort_most"/>
+ <menu_item_check label="依名稱排序" name="sort_name"/>
+ <menu_item_check label="View People Icons" name="view_icons"/>
+ <menu_item_call label="Show Blocked Residents &amp; Objects" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_picks.xml b/indra/newview/skins/default/xui/zh/menu_picks.xml
new file mode 100644
index 0000000000..3c78e9f920
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="資訊" name="pick_info"/>
+ <menu_item_call label="編輯" name="pick_edit"/>
+ <menu_item_call label="Teleport" name="pick_teleport"/>
+ <menu_item_call label="地圖" name="pick_map"/>
+ <menu_item_call label="刪除" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_picks_plus.xml b/indra/newview/skins/default/xui/zh/menu_picks_plus.xml
new file mode 100644
index 0000000000..9e55c633f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="New Pick" name="create_pick"/>
+ <menu_item_call label="New Classified" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_place.xml b/indra/newview/skins/default/xui/zh/menu_place.xml
new file mode 100644
index 0000000000..63e44d808c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_place.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Make a Landmark" name="landmark"/>
+ <menu_item_call label="Create Pick" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_place_add_button.xml b/indra/newview/skins/default/xui/zh/menu_place_add_button.xml
new file mode 100644
index 0000000000..e86fe7367e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Add Folder" name="add_folder"/>
+ <menu_item_call label="Add Landmark" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..e9658f72a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
+ <menu_item_call label="Add Landmark" name="add_landmark"/>
+ <menu_item_call label="Add Folder" name="add_folder"/>
+ <menu_item_call label="Restore Item" name="restore_item"/>
+ <menu_item_call label="剪下" name="cut"/>
+ <menu_item_call label="覆製" name="copy_folder"/>
+ <menu_item_call label="貼上" name="paste"/>
+ <menu_item_call label="更名" name="rename"/>
+ <menu_item_call label="刪除" name="delete"/>
+ <menu_item_call label="展開" name="expand"/>
+ <menu_item_call label="摺疊" name="collapse"/>
+ <menu_item_call label="展開全部資料夾" name="expand_all"/>
+ <menu_item_call label="摺疊全部資料夾" name="collapse_all"/>
+ <menu_item_check label="依日期排序" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..66247d3fe6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleport" name="teleport"/>
+ <menu_item_call label="更多資訊" name="more_info"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="Add Landmark" name="add_landmark"/>
+ <menu_item_call label="Add Folder" name="add_folder"/>
+ <menu_item_call label="Restore Item" name="restore_item"/>
+ <menu_item_call label="剪下" name="cut"/>
+ <menu_item_call label="Copy Landmark" name="copy_landmark"/>
+ <menu_item_call label="Copy SLurl" name="copy_slurl"/>
+ <menu_item_call label="貼上" name="paste"/>
+ <menu_item_call label="更名" name="rename"/>
+ <menu_item_call label="刪除" name="delete"/>
+ <menu_item_call label="展開全部資料夾" name="expand_all"/>
+ <menu_item_call label="摺疊全部資料夾" name="collapse_all"/>
+ <menu_item_check label="依日期排序" name="sort_by_date"/>
+ <menu_item_call label="Create Pick" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml b/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml
new file mode 100644
index 0000000000..9c52ddfd18
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="地圖" name="show_on_map"/>
+ <menu_item_call label="Pay" name="pay"/>
+ <menu_item_call label="分享" name="share"/>
+ <menu_item_call label="Block" name="block"/>
+ <menu_item_call label="Unblock" name="unblock"/>
+ <menu_item_call label="Kick" name="kick"/>
+ <menu_item_call label="Freeze" name="freeze"/>
+ <menu_item_call label="Unfreeze" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_save_outfit.xml b/indra/newview/skins/default/xui/zh/menu_save_outfit.xml
new file mode 100644
index 0000000000..7884df5b01
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="儲存" name="save_outfit"/>
+ <menu_item_call label="另存" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_script_chiclet.xml b/indra/newview/skins/default/xui/zh/menu_script_chiclet.xml
new file mode 100644
index 0000000000..e9817dd2bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="關閉" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_slurl.xml b/indra/newview/skins/default/xui/zh/menu_slurl.xml
new file mode 100644
index 0000000000..7291239383
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="About URL" name="about_url"/>
+ <menu_item_call label="Teleport to URL" name="teleport_to_url"/>
+ <menu_item_call label="地圖" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..12989ea59c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="展開全部資料夾" name="Expand all folders"/>
+ <menu_item_call label="摺疊全部資料夾" name="Collapse all folders"/>
+ <menu_item_call label="Clear Teleport History" name="Clear Teleport History"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..4d1aa5f74a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleport" name="Teleport"/>
+ <menu_item_call label="更多資訊" name="More Information"/>
+ <menu_item_call label="覆製到剪貼簿" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..423ba64aa7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Open" name="TabOpen"/>
+ <menu_item_call label="關閉" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_text_editor.xml b/indra/newview/skins/default/xui/zh/menu_text_editor.xml
new file mode 100644
index 0000000000..c25f5128c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="全選" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_topinfobar.xml b/indra/newview/skins/default/xui/zh/menu_topinfobar.xml
new file mode 100644
index 0000000000..dc3981a4d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="顯示座標" name="Show Coordinates"/>
+ <menu_item_check label="顯示地段屬性" name="Show Parcel Properties"/>
+ <menu_item_call label="Landmark" name="Landmark"/>
+ <menu_item_call label="覆製" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_agent.xml b/indra/newview/skins/default/xui/zh/menu_url_agent.xml
new file mode 100644
index 0000000000..9f56edb959
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Show Resident Profile" name="show_agent"/>
+ <menu_item_call label="覆製名稱到剪貼簿" name="url_copy_label"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_group.xml b/indra/newview/skins/default/xui/zh/menu_url_group.xml
new file mode 100644
index 0000000000..c574090a4a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Show Group Information" name="show_group"/>
+ <menu_item_call label="Copy Group to clipboard" name="url_copy_label"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_http.xml b/indra/newview/skins/default/xui/zh/menu_url_http.xml
new file mode 100644
index 0000000000..cf953576f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="開啟網頁" name="url_open"/>
+ <menu_item_call label="Open in Internal Browser" name="url_open_internal"/>
+ <menu_item_call label="Open in External Browser" name="url_open_external"/>
+ <menu_item_call label="Copy URL to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_inventory.xml b/indra/newview/skins/default/xui/zh/menu_url_inventory.xml
new file mode 100644
index 0000000000..1e56aa1a47
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Show Inventory Item" name="show_item"/>
+ <menu_item_call label="Copy Name to clipboard" name="url_copy_label"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_map.xml b/indra/newview/skins/default/xui/zh/menu_url_map.xml
new file mode 100644
index 0000000000..fc8922318f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="Teleport to Location" name="teleport_to_location"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml
new file mode 100644
index 0000000000..8ad8e4ba84
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Show Object Information" name="show_object"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="Teleport to Object Location" name="teleport_to_object"/>
+ <menu_item_call label="Copy Object Name to clipboard" name="url_copy_label"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_parcel.xml b/indra/newview/skins/default/xui/zh/menu_url_parcel.xml
new file mode 100644
index 0000000000..d011ba8208
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示地段資訊" name="show_parcel"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_slapp.xml b/indra/newview/skins/default/xui/zh/menu_url_slapp.xml
new file mode 100644
index 0000000000..10d7c9cba0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Run This Command" name="run_slapp"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_slurl.xml b/indra/newview/skins/default/xui/zh/menu_url_slurl.xml
new file mode 100644
index 0000000000..cf4ff9f8ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Show Place Information" name="show_place"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="Teleport to Location" name="teleport_to_location"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_teleport.xml b/indra/newview/skins/default/xui/zh/menu_url_teleport.xml
new file mode 100644
index 0000000000..c103582487
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teleport to this Location" name="teleport"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="Copy SLurl to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
new file mode 100644
index 0000000000..3b1f7820af
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="自己" name="Me">
+ <menu_item_call label="偏好設定" name="Preferences"/>
+ <menu_item_call label="我的塗鴉牆" name="Manage My Account"/>
+ <menu_item_call label="購買 L$" name="Buy and Sell L$"/>
+ <menu_item_call label="我的個人檔案" name="Profile"/>
+ <menu_item_call label="我的外觀" name="ChangeOutfit"/>
+ <menu_item_check label="我的庫存" name="Inventory"/>
+ <menu_item_check label="我的庫存" name="ShowSidetrayInventory"/>
+ <menu_item_check label="我的姿勢" name="Gestures"/>
+ <menu_item_check label="我的聲音" name="ShowVoice"/>
+ <menu label="移動" name="Movement">
+ <menu_item_call label="坐下" name="Sit Down Here"/>
+ <menu_item_check label="飛行" name="Fly"/>
+ <menu_item_check label="總是奔跑" name="Always Run"/>
+ <menu_item_call label="停止我身上的動作" name="Stop Animating My Avatar"/>
+ </menu>
+ <menu label="我的狀態" name="Status">
+ <menu_item_call label="離開" name="Set Away"/>
+ <menu_item_call label="忙碌" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Leave Admin Status" name="Leave Admin Options"/>
+ <menu_item_call label="結束離開 [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="溝通" name="Communicate">
+ <menu_item_call label="我的朋友" name="My Friends"/>
+ <menu_item_call label="我的社團" name="My Groups"/>
+ <menu_item_check label="附近的聊天" name="Nearby Chat"/>
+ <menu_item_call label="附近的人群" name="Active Speakers"/>
+ </menu>
+ <menu label="世界" name="World">
+ <menu_item_check label="迷你地圖" name="Mini-Map"/>
+ <menu_item_check label="世界地圖" name="World Map"/>
+ <menu_item_check label="搜尋" name="Search"/>
+ <menu_item_call label="拍攝快照" name="Take Snapshot"/>
+ <menu_item_call label="Landmark This Place" name="Create Landmark Here"/>
+ <menu label="Place Profile" name="Land">
+ <menu_item_call label="Place Profile" name="Place Profile"/>
+ <menu_item_call label="關於土地" name="About Land"/>
+ <menu_item_call label="地區 / 領地" name="Region/Estate"/>
+ </menu>
+ <menu_item_call label="購買這塊土地" name="Buy Land"/>
+ <menu_item_call label="我的土地" name="My Land"/>
+ <menu label="顯示" name="LandShow">
+ <menu_item_check label="移動控制" name="Movement Controls"/>
+ <menu_item_check label="視角控制" name="Camera Controls"/>
+ <menu_item_check label="禁越線" name="Ban Lines"/>
+ <menu_item_check label="指標" name="beacons"/>
+ <menu_item_check label="土地邊界" name="Property Lines"/>
+ <menu_item_check label="地主" name="Land Owners"/>
+ <menu_item_check label="座標" name="Coordinates"/>
+ <menu_item_check label="地段屬性" name="Parcel Properties"/>
+ <menu_item_check label="進階選單" name="Show Advanced Menu"/>
+ </menu>
+ <menu_item_call label="瞬間傳送回家" name="Teleport Home"/>
+ <menu_item_call label="設定家在此處" name="Set Home to Here"/>
+ <menu label="太陽" name="Environment Settings">
+ <menu_item_call label="日出" name="Sunrise"/>
+ <menu_item_call label="中午" name="Noon"/>
+ <menu_item_call label="日落" name="Sunset"/>
+ <menu_item_call label="午夜" name="Midnight"/>
+ <menu_item_call label="領地時間" name="Revert to Region Default"/>
+ <menu_item_call label="環境編輯器" name="Environment Editor"/>
+ </menu>
+ </menu>
+ <menu label="建造" name="BuildTools">
+ <menu_item_check label="建造" name="Show Build Tools"/>
+ <menu label="選擇建造工具" name="Select Tool">
+ <menu_item_call label="聚焦工具" name="Focus"/>
+ <menu_item_call label="移動工具" name="Move"/>
+ <menu_item_call label="編輯工具" name="Edit"/>
+ <menu_item_call label="創造工具" name="Create"/>
+ <menu_item_call label="土地工具" name="Land"/>
+ </menu>
+ <menu_item_call label="聯結" name="Link"/>
+ <menu_item_call label="取銷聯結" name="Unlink"/>
+ <menu_item_check label="編輯聯結部位" name="Edit Linked Parts"/>
+ <menu label="選擇聯結部位" name="Select Linked Parts">
+ <menu_item_call label="選擇下一部位" name="Select Next Part"/>
+ <menu_item_call label="選擇上一部位" name="Select Previous Part"/>
+ <menu_item_call label="包括下一部位" name="Include Next Part"/>
+ <menu_item_call label="包括上一部位" name="Include Previous Part"/>
+ </menu>
+ <menu_item_call label="聚焦於所選部位" name="Focus on Selection"/>
+ <menu_item_call label="Zoom to Selection" name="Zoom to Selection"/>
+ <menu label="Object" name="Object">
+ <menu_item_call label="購買" name="Menu Object Buy"/>
+ <menu_item_call label="Take" name="Menu Object Take"/>
+ <menu_item_call label="取得副本" name="Take Copy"/>
+ <menu_item_call label="Save Back to My Inventory" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Save Back to Object Contents" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="退回物件" name="Return Object back to Owner"/>
+ </menu>
+ <menu label="Scripts" name="Scripts">
+ <menu_item_call label="Recompile Scripts (Mono)" name="Mono"/>
+ <menu_item_call label="Recompile Scripts (LSL)" name="LSL"/>
+ <menu_item_call label="Reset Scripts" name="Reset Scripts"/>
+ <menu_item_call label="Set Scripts to Running" name="Set Scripts to Running"/>
+ <menu_item_call label="Set Scripts to Not Running" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Options" name="Options">
+ <menu_item_check label="Show Advanced Permissions" name="DebugPermissions"/>
+ <menu_item_check label="Select Only My Objects" name="Select Only My Objects"/>
+ <menu_item_check label="Select Only Movable Objects" name="Select Only Movable Objects"/>
+ <menu_item_check label="Select By Surrounding" name="Select By Surrounding"/>
+ <menu_item_check label="Show Selection Outlines" name="Show Selection Outlines"/>
+ <menu_item_check label="Show Hidden Selection" name="Show Hidden Selection"/>
+ <menu_item_check label="Show Light Radius for Selection" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Show Selection Beam" name="Show Selection Beam"/>
+ <menu_item_check label="貼齊格線" name="Snap to Grid"/>
+ <menu_item_call label="Snap Object XY to Grid" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Use Selection for Grid" name="Use Selection for Grid"/>
+ <menu_item_call label="Grid Options" name="Grid Options"/>
+ </menu>
+ <menu label="Upload" name="Upload">
+ <menu_item_call label="Image (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Sound (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Bulk (L$[COST] per file)..." name="Bulk Upload"/>
+ <menu_item_call label="Set Default Upload Permissions" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="復原" name="Undo"/>
+ <menu_item_call label="Redo" name="Redo"/>
+ </menu>
+ <menu label="Help" name="Help">
+ <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
+ <menu_item_check label="Enable Hints" name="Enable Hints"/>
+ <menu_item_call label="Report Abuse" name="Report Abuse"/>
+ <menu_item_call label="Report Bug" name="Report Bug"/>
+ <menu_item_call label="About [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Advanced" name="Advanced">
+ <menu_item_call label="Rebake Textures" name="Rebake Texture"/>
+ <menu_item_call label="Set UI Size to Default" name="Set UI Size to Default"/>
+ <menu_item_call label="Set Window Size..." name="Set Window Size..."/>
+ <menu_item_check label="Limit Select Distance" name="Limit Select Distance"/>
+ <menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/>
+ <menu_item_check label="High-res Snapshot" name="HighResSnapshot"/>
+ <menu_item_check label="Quiet Snapshots to Disk" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Compress Snapshots to Disk" name="CompressSnapshotsToDisk"/>
+ <menu label="Performance Tools" name="Performance Tools">
+ <menu_item_call label="Lag Meter" name="Lag Meter"/>
+ <menu_item_check label="Statistics Bar" name="Statistics Bar"/>
+ <menu_item_check label="Show Avatar Rendering Cost" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Highlighting and Visibility" name="Highlighting and Visibility">
+ <menu_item_check label="Cheesy Beacon" name="Cheesy Beacon"/>
+ <menu_item_check label="Hide Particles" name="Hide Particles"/>
+ <menu_item_check label="Hide Selected" name="Hide Selected"/>
+ <menu_item_check label="Highlight Transparent" name="Highlight Transparent"/>
+ <menu_item_check label="Show HUD Attachments" name="Show HUD Attachments"/>
+ <menu_item_check label="Show Mouselook Crosshairs" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="Rendering Types" name="Rendering Types">
+ <menu_item_check label="Simple" name="Simple"/>
+ <menu_item_check label="Alpha" name="Alpha"/>
+ <menu_item_check label="Tree" name="Tree"/>
+ <menu_item_check label="Avatars" name="Character"/>
+ <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Sky" name="Sky"/>
+ <menu_item_check label="Water" name="Water"/>
+ <menu_item_check label="Ground" name="Ground"/>
+ <menu_item_check label="Volume" name="Volume"/>
+ <menu_item_check label="Grass" name="Grass"/>
+ <menu_item_check label="Clouds" name="Clouds"/>
+ <menu_item_check label="Particles" name="Particles"/>
+ <menu_item_check label="Bump" name="Bump"/>
+ </menu>
+ <menu label="Rendering Features" name="Rendering Features">
+ <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="Selected" name="Selected"/>
+ <menu_item_check label="Highlighted" name="Highlighted"/>
+ <menu_item_check label="Dynamic Textures" name="Dynamic Textures"/>
+ <menu_item_check label="Foot Shadows" name="Foot Shadows"/>
+ <menu_item_check label="Fog" name="Fog"/>
+ <menu_item_check label="Test FRInfo" name="Test FRInfo"/>
+ <menu_item_check label="Flexible Objects" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/>
+ <menu_item_call label="Clear Group Cache" name="ClearGroupCache"/>
+ <menu_item_check label="Mouse Smoothing" name="Mouse Smoothing"/>
+ <menu label="Shortcuts" name="Shortcuts">
+ <menu_item_call label="Image (L$[COST])..." name="Upload Image"/>
+ <menu_item_check label="Search" name="Search"/>
+ <menu_item_call label="Release Keys" name="Release Keys"/>
+ <menu_item_call label="Set UI Size to Default" name="Set UI Size to Default"/>
+ <menu_item_check label="Show Advanced Menu - legacy shortcut" name="Show Advanced Menu - legacy shortcut"/>
+ <menu_item_call label="關閉視窗" name="Close Window"/>
+ <menu_item_call label="關閉全部視窗" name="Close All Windows"/>
+ <menu_item_call label="Snapshot to Disk" name="Snapshot to Disk"/>
+ <menu_item_call label="Mouselook" name="Mouselook"/>
+ <menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
+ <menu_item_call label="Reset View" name="Reset View"/>
+ <menu_item_call label="Look at Last Chatter" name="Look at Last Chatter"/>
+ <menu label="選擇建造工具" name="Select Tool">
+ <menu_item_call label="聚焦工具" name="Focus"/>
+ <menu_item_call label="移動工具" name="Move"/>
+ <menu_item_call label="編輯工具" name="Edit"/>
+ <menu_item_call label="創造工具" name="Create"/>
+ <menu_item_call label="土地工具" name="Land"/>
+ </menu>
+ <menu_item_call label="Zoom In" name="Zoom In"/>
+ <menu_item_call label="Zoom Default" name="Zoom Default"/>
+ <menu_item_call label="Zoom Out" name="Zoom Out"/>
+ </menu>
+ <menu_item_call label="顯示除錯設定" name="Debug Settings"/>
+ <menu_item_check label="顯示開發選單" name="Debug Mode"/>
+ </menu>
+ <menu label="開發" name="Develop">
+ <menu label="Consoles" name="Consoles">
+ <menu_item_check label="Texture Console" name="Texture Console"/>
+ <menu_item_check label="Debug Console" name="Debug Console"/>
+ <menu_item_call label="Notifications Console" name="Notifications"/>
+ <menu_item_check label="Texture Size Console" name="Texture Size"/>
+ <menu_item_check label="Texture Category Console" name="Texture Category"/>
+ <menu_item_check label="Fast Timers" name="Fast Timers"/>
+ <menu_item_check label="記憶體" name="Memory"/>
+ <menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
+ <menu_item_call label="Group Info to Debug Console" name="Group Info to Debug Console"/>
+ <menu_item_call label="Capabilities Info to Debug Console" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="Camera" name="Camera"/>
+ <menu_item_check label="Wind" name="Wind"/>
+ <menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="Badge" name="Badge"/>
+ </menu>
+ <menu label="顯示資訊" name="Display Info">
+ <menu_item_check label="Show Time" name="Show Time"/>
+ <menu_item_check label="Show Render Info" name="Show Render Info"/>
+ <menu_item_check label="Show Texture Info" name="Show Texture Info"/>
+ <menu_item_check label="Show Matrices" name="Show Matrices"/>
+ <menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="顯示記憶體" name="Show Memory"/>
+ <menu_item_check label="Show Updates to Objects" name="Show Updates"/>
+ </menu>
+ <menu label="Force an Error" name="Force Errors">
+ <menu_item_call label="Force Breakpoint" name="Force Breakpoint"/>
+ <menu_item_call label="Force LLError And Crash" name="Force LLError And Crash"/>
+ <menu_item_call label="Force Bad Memory Access" name="Force Bad Memory Access"/>
+ <menu_item_call label="Force Infinite Loop" name="Force Infinite Loop"/>
+ <menu_item_call label="Force Driver Crash" name="Force Driver Carsh"/>
+ <menu_item_call label="Force Software Exception" name="Force Software Exception"/>
+ <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simulate a Memory Leak" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Render Tests" name="Render Tests">
+ <menu_item_check label="Camera Offset" name="Camera Offset"/>
+ <menu_item_check label="Randomize Framerate" name="Randomize Framerate"/>
+ <menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/>
+ <menu_item_check label="Frame Test" name="Frame Test"/>
+ </menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Bounding Boxes" name="Bounding Boxes"/>
+ <menu_item_check label="Octree" name="Octree"/>
+ <menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Occlusion" name="Occlusion"/>
+ <menu_item_check label="Render Batches" name="Render Batches"/>
+ <menu_item_check label="Update Type" name="Update Type"/>
+ <menu_item_check label="Texture Anim" name="Texture Anim"/>
+ <menu_item_check label="Texture Priority" name="Texture Priority"/>
+ <menu_item_check label="Texture Area" name="Texture Area"/>
+ <menu_item_check label="Face Area" name="Face Area"/>
+ <menu_item_check label="Lights" name="Lights"/>
+ <menu_item_check label="Collision Skeleton" name="Collision Skeleton"/>
+ <menu_item_check label="Raycast" name="Raycast"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Axes" name="Axes"/>
+ <menu_item_check label="Tangent Basis" name="Tangent Basis"/>
+ <menu_item_call label="Selected Texture Info Basis" name="Selected Texture Info Basis"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Object-Object Occlusion" name="Object-Object Occlusion"/>
+ <menu_item_check label="Framebuffer Objects" name="Framebuffer Objects"/>
+ <menu_item_check label="Lighting and Shadows" name="Lighting and Shadows"/>
+ <menu_item_check label="Shadows from Sun/Moon/Projectors" name="Shadows from Sun/Moon/Projectors"/>
+ <menu_item_check label="SSAO and Shadow Smoothing" name="SSAO and Shadow Smoothing"/>
+ <menu_item_check label="Global Illumination (experimental)" name="Global Illumination"/>
+ <menu_item_check label="Debug GL" name="Debug GL"/>
+ <menu_item_check label="Debug Pipeline" name="Debug Pipeline"/>
+ <menu_item_check label="Automatic Alpha Masks (deferred)" name="Automatic Alpha Masks (deferred)"/>
+ <menu_item_check label="Automatic Alpha Masks (non-deferred)" name="Automatic Alpha Masks (non-deferred)"/>
+ <menu_item_check label="Animation Textures" name="Animation Textures"/>
+ <menu_item_check label="Disable Textures" name="Disable Textures"/>
+ <menu_item_check label="Full Res Textures" name="Rull Res Textures"/>
+ <menu_item_check label="Audit Textures" name="Audit Textures"/>
+ <menu_item_check label="Texture Atlas (experimental)" name="Texture Atlas"/>
+ <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/>
+ <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/>
+ <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="網路" name="Network">
+ <menu_item_check label="Pause Agent" name="AgentPause"/>
+ <menu_item_call label="Enable Message Log" name="Enable Message Log"/>
+ <menu_item_call label="Disable Message Log" name="Disable Message Log"/>
+ <menu_item_check label="Velocity Interpolate Objects" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Ping Interpolate Object Positions" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="Drop a Packet" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Dump Scripted Camera" name="Dump Scripted Camera"/>
+ <menu_item_call label="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Recorder" name="Recorder">
+ <menu_item_call label="Start Playback" name="Start Playback"/>
+ <menu_item_call label="Stop Playback" name="Stop Playback"/>
+ <menu_item_check label="Loop Playback" name="Loop Playback"/>
+ <menu_item_call label="Start Record" name="Start Record"/>
+ <menu_item_call label="Stop Record" name="Stop Record"/>
+ </menu>
+ <menu label="World" name="World">
+ <menu_item_check label="Sim Sun Override" name="Sim Sun Override"/>
+ <menu_item_check label="Cheesy Beacon" name="Cheesy Beacon"/>
+ <menu_item_check label="Fixed Weather" name="Fixed Weather"/>
+ <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="UI" name="UI">
+ <menu_item_call label="Media Browser Test" name="Web Browser Test"/>
+ <menu_item_call label="Web Content Browser" name="Web Content Browser"/>
+ <menu_item_call label="Dump SelectMgr" name="Dump SelectMgr"/>
+ <menu_item_call label="Dump Inventory" name="Dump Inventory"/>
+ <menu_item_call label="Dump Timers" name="Dump Timers"/>
+ <menu_item_call label="Dump Focus Holder" name="Dump Focus Holder"/>
+ <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
+ <menu_item_call label="Print Agent Info" name="Print Agent Info"/>
+ <menu_item_call label="Memory Stats" name="Memory Stats"/>
+ <menu_item_check label="Region Debug Console" name="Region Debug Console"/>
+ <menu_item_check label="Debug SelectMgr" name="Debug SelectMgr"/>
+ <menu_item_check label="Debug Clicks" name="Debug Clicks"/>
+ <menu_item_check label="Debug Views" name="Debug Views"/>
+ <menu_item_check label="Debug Name Tooltips" name="Debug Name Tooltips"/>
+ <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
+ <menu_item_check label="Debug Keys" name="Debug Keys"/>
+ <menu_item_check label="Debug WindowProc" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Reload Color Settings" name="Reload Color Settings"/>
+ <menu_item_call label="Show Font Test" name="Show Font Test"/>
+ <menu_item_check label="Show XUI Names" name="Show XUI Names"/>
+ <menu_item_call label="Send Test IMs" name="Send Test IMs"/>
+ <menu_item_call label="Flush Names Caches" name="Flush Names Caches"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Iris" name="Iris"/>
+ <menu_item_call label="Head" name="Head"/>
+ <menu_item_call label="Upper Body" name="Upper Body"/>
+ <menu_item_call label="Lower Body" name="Lower Body"/>
+ <menu_item_call label="裙子" name="Skirt"/>
+ </menu>
+ <menu label="Character Tests" name="Character Tests">
+ <menu_item_call label="Appearance To XML" name="Appearance To XML"/>
+ <menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
+ <menu_item_call label="Test Male" name="Test Male"/>
+ <menu_item_call label="Test Female" name="Test Female"/>
+ <menu_item_call label="Toggle PG" name="Toggle PG"/>
+ <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Force Params to Default" name="Force Params to Default"/>
+ <menu_item_check label="Animation Info" name="Animation Info"/>
+ <menu_item_check label="Slow Motion Animations" name="Slow Motion Animations"/>
+ <menu_item_check label="Show Look At" name="Show Look At"/>
+ <menu_item_check label="Show Point At" name="Show Point At"/>
+ <menu_item_check label="Debug Joint Updates" name="Debug Joint Updates"/>
+ <menu_item_check label="Disable LOD" name="Disable LOD"/>
+ <menu_item_check label="Debug Character Vis" name="Debug Character Vis"/>
+ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/>
+ <menu_item_check label="Display Agent Target" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Dump Attachments" name="Dump Attachments"/>
+ <menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/>
+ <menu_item_call label="Dump Local Textures" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="HTTP Textures" name="HTTP Textures"/>
+ <menu_item_call label="Compress Images" name="Compress Images"/>
+ <menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/>
+ <menu_item_check label="Console Window on next Run" name="Console Window"/>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Leave Admin Status" name="Leave Admin Options"/>
+ <menu_item_check label="Show Admin Menu" name="View Admin Options"/>
+ </menu>
+ <menu label="Admin" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="取得副本" name="Take Copy"/>
+ <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/>
+ <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="Lock" name="Lock"/>
+ <menu_item_call label="Get Assets IDs" name="Get Assets IDs"/>
+ </menu>
+ <menu label="地段" name="Parcel">
+ <menu_item_call label="Force Owner To Me" name="Owner To Me"/>
+ <menu_item_call label="Set to Linden Content" name="Set to Linden Content"/>
+ <menu_item_call label="Claim Public Land" name="Claim Public Land"/>
+ </menu>
+ <menu label="地區" name="Region">
+ <menu_item_call label="Dump Temp Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Save Region State" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="God Tools" name="God Tools"/>
+ </menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Attach Object" name="Attach Object"/>
+ <menu label="Detach Object" name="Detach Object"/>
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="襯衫" name="Shirt"/>
+ <menu_item_call label="褲子" name="Pants"/>
+ <menu_item_call label="鞋子" name="Shoes"/>
+ <menu_item_call label="襪子" name="Socks"/>
+ <menu_item_call label="夾克" name="Jacket"/>
+ <menu_item_call label="手套" name="Gloves"/>
+ <menu_item_call label="內衣" name="Menu Undershirt"/>
+ <menu_item_call label="內褲" name="Menu Underpants"/>
+ <menu_item_call label="裙子" name="Skirt"/>
+ <menu_item_call label="Alpha" name="Alpha"/>
+ <menu_item_call label="Tattoo" name="Tattoo"/>
+ <menu_item_call label="Physics" name="Physics"/>
+ <menu_item_call label="All Clothes" name="All Clothes"/>
+ </menu>
+ <menu label="Help" name="Help">
+ <menu_item_call label="Official Linden Blog" name="Official Linden Blog"/>
+ <menu_item_call label="Scripting Portal" name="Scripting Portal"/>
+ <menu label="Bug Reporting" name="Bug Reporting">
+ <menu_item_call label="Public Issue Tracker" name="Public Issue Tracker"/>
+ <menu_item_call label="Public Issue Tracker Help" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Bug Reporting 101" name="Bug Reporing 101"/>
+ <menu_item_call label="Security Issues" name="Security Issues"/>
+ <menu_item_call label="QA Wiki" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..97f18f0936
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="取代" name="wear_replace"/>
+ <menu_item_call label="Wear" name="wear_wear"/>
+ <menu_item_call label="Add" name="wear_add"/>
+ <menu_item_call label="Take Off / Detach" name="take_off_or_detach"/>
+ <menu_item_call label="卸下" name="detach"/>
+ <context_menu label="Attach to" name="wearable_attach_to"/>
+ <context_menu label="Attach to HUD" name="wearable_attach_to_hud"/>
+ <menu_item_call label="脫下" name="take_off"/>
+ <menu_item_call label="編輯" name="edit"/>
+ <menu_item_call label="Item Profile" name="object_profile"/>
+ <menu_item_call label="Show Original" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml b/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
new file mode 100644
index 0000000000..ebf9b80d27
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Wearing">
+ <menu_item_call label="Edit Outfit" name="edit"/>
+ <menu_item_call label="脫下" name="takeoff"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml b/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml
new file mode 100644
index 0000000000..5e82cb087f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="脫下" name="take_off"/>
+ <menu_item_call label="卸下" name="detach"/>
+ <menu_item_call label="Edit Outfit" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/mime_types.xml b/indra/newview/skins/default/xui/zh/mime_types.xml
new file mode 100644
index 0000000000..1c9b68da1a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/mime_types.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ 網頁內容
+ </label>
+ <tooltip name="web_tooltip">
+ This location has Web content
+ </tooltip>
+ <playtip name="web_playtip">
+ 顯示網頁內容
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Movie
+ </label>
+ <tooltip name="movie_tooltip">
+ There is a movie to play here
+ </tooltip>
+ <playtip name="movie_playtip">
+ Play movie
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Image
+ </label>
+ <tooltip name="image_tooltip">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ View this location&apos;s image
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ There is audio at this location
+ </tooltip>
+ <playtip name="audio_playtip">
+ Play this location&apos;s audio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ 即時串流
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - 無 -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - 無 -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Image
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Movie (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Document
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Document
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Page (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Image (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Image (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Image (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Image (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Image (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Image (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web Page
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Text
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Movie (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Movie (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Movie (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Movie (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Movie (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Movie (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/zh/mime_types_linux.xml b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
new file mode 100644
index 0000000000..1c9b68da1a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ 網頁內容
+ </label>
+ <tooltip name="web_tooltip">
+ This location has Web content
+ </tooltip>
+ <playtip name="web_playtip">
+ 顯示網頁內容
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Movie
+ </label>
+ <tooltip name="movie_tooltip">
+ There is a movie to play here
+ </tooltip>
+ <playtip name="movie_playtip">
+ Play movie
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Image
+ </label>
+ <tooltip name="image_tooltip">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ View this location&apos;s image
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ There is audio at this location
+ </tooltip>
+ <playtip name="audio_playtip">
+ Play this location&apos;s audio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ 即時串流
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - 無 -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - 無 -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Image
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Movie (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Document
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Document
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Page (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Image (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Image (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Image (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Image (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Image (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Image (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web Page
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Text
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Movie (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Movie (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Movie (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Movie (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Movie (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Movie (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/zh/mime_types_mac.xml b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
new file mode 100644
index 0000000000..b6c8784759
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ 網頁內容
+ </label>
+ <tooltip name="web_tooltip">
+ This location has Web content
+ </tooltip>
+ <playtip name="web_playtip">
+ 顯示網頁內容
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Movie
+ </label>
+ <tooltip name="movie_tooltip">
+ There is a movie to play here
+ </tooltip>
+ <playtip name="movie_playtip">
+ Play movie
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Image
+ </label>
+ <tooltip name="image_tooltip">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ View this location&apos;s image
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ There is audio at this location
+ </tooltip>
+ <playtip name="audio_playtip">
+ Play this location&apos;s audio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ 即時串流
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - 無 -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - 無 -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Image
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Movie (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Document
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Document
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Page (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Image (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Image (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Image (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Image (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Image (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Image (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ 網頁
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ 文字
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Movie (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Movie (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Movie (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Movie (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Movie (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Movie (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
new file mode 100644
index 0000000000..8b26c70430
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -0,0 +1,2952 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ Don&apos;t show me this again
+ </global>
+ <global name="alwayschoose">
+ Always choose this option
+ </global>
+ <global name="implicitclosebutton">
+ 關閉
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification label="Unknown Notification Message" name="MissingAlert">
+ Your version of [APP_NAME] does not know how to display the notification it just received. Please verify that you have the latest Viewer installed.
+
+Error details: The notification called &apos;[_NAME]&apos; was not found in notifications.xml.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Floater error: Could not find the following controls:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ No tutorial is currently available.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="是"/>
+ </notification>
+ <notification name="BadInstallation">
+ An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ Could not connect to the [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Make sure your Internet connection is working properly.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ Message Template [PATH] not found.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="WearableSave">
+ Save changes to current clothing/body part?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="不要儲存" yestext="儲存"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ There was a problem uploading the text for a script due to the following reason: [REASON]. Please try again later.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ There was a problem uploading the compiled script due to the following reason: [REASON]. Please try again later.
+ </notification>
+ <notification name="WriteAnimationFail">
+ There was a problem writing animation data. Please try again later.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ There was a problem uploading the auction snapshot due to the following reason: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Unable to view the contents of more than one item at a time.
+Please select only one object and try again.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ Save all changes to clothing/body parts?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="不要儲存" yestext="全部儲存"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Non-friends won&apos;t know that you&apos;ve choosen to ignore their calls and instant messages.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Note: When you turn on this option, anyone who uses this computer can see your list of favorite locations.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission.
+Do you want to grant modify rights for [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="是"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Granting modify rights to another Resident allows them to change ANY objects you may have in-world. Be VERY careful when handing out this permission.
+Do you want to grant modify rights for the selected Residents?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ Do you want to revoke modify rights for [NAME]?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Do you want to revoke modify rights for the selected Residents?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ Unable to create group.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="忽視變更" yestext="套用變更"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ You must specify a subject to send a group notice.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ You are about to add group members to the role of [ROLE_NAME].
+Members cannot be removed from that role.
+The members must resign from the role themselves.
+Are you sure you want to continue?
+ <usetemplate ignoretext="Confirm before I add a new group Owner" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ You are about to add the Ability &apos;[ACTION_NAME]&apos; to the Role &apos;[ROLE_NAME]&apos;.
+
+ *WARNING*
+ Any Member in a Role with this Ability can assign themselves -- and any other member -- to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability.
+
+Add this Ability to &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ You are about to add the Ability &apos;[ACTION_NAME]&apos; to the Role &apos;[ROLE_NAME]&apos;.
+
+ *WARNING*
+ Any Member in a Role with this Ability can assign themselves -- and any other member -- all Abilities, elevating themselves to near-Owner power.
+
+Add this Ability to &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ You are about to drop your attachment.
+ Are you sure you want to continue?
+ <usetemplate ignoretext="Confirm before dropping attachments" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Joining this group costs L$[COST].
+Do you wish to proceed?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="Join"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ You are joining group [NAME].
+Do you wish to proceed?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="Join"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Joining this group costs L$[COST].
+You do not have enough L$ to join this group.
+ </notification>
+ <notification name="CreateGroupCost">
+ Creating this group will cost L$100.
+Groups need more than one member, or they are deleted forever.
+Please invite members within 48 hours.
+ <usetemplate canceltext="取銷" name="okcancelbuttons" notext="取銷" yestext="Create group for L$100"/>
+ </notification>
+ <notification name="LandBuyPass">
+ For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hours. Buy a pass?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ Sale price must be set to more than L$0 if selling to anyone.
+Please select an individual to sell to if selling for L$0.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ The selected [LAND_SIZE] m² land is being set for sale.
+Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ ATTENTION: Clicking &apos;sell to anyone&apos; makes your land available to the entire [SECOND_LIFE] community, even those not in this region.
+
+The selected [LAND_SIZE] m² land is being set for sale.
+Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ Are you sure you want to return all objects shared with the group &apos;[NAME]&apos; on this parcel of land back to their previous owner&apos;s inventory?
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ Are you sure you want to return all objects owned by the Resident &apos;[NAME]&apos; on this parcel of land back to their inventory?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Are you sure you want to return all objects owned by you on this parcel of land back to your inventory?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Are you sure you want to return all objects NOT owned by you on this parcel of land back to their owner&apos;s inventory?
+Transferable objects deeded to a group will be returned to their previous owners.
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Are you sure you want to return all objects NOT owned by [NAME] on this parcel of land back to their owner&apos;s inventory?
+Transferable objects deeded to a group will be returned to their previous owners.
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Are you sure you want to return all listed objects back to their owner&apos;s inventory?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Are you sure you want to disable all objects in this region?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Return the objects on this parcel of land that are NOT shared with the group [NAME] back to their owners?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ Can not disable scripts.
+This entire region is damage enabled.
+Scripts must be allowed to run for weapons to work.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Multiple faces are currently selected.
+If you continue this action, separate instances of media will be set on multiple faces of the object.
+To place the media on only one face, choose Select Face and click on the desired face of that object then click Add.
+ <usetemplate ignoretext="Media will be set on multiple selected faces" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ You must be standing inside the land parcel to set its Landing Point.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Please enter a valid email address for the recipient(s).
+ </notification>
+ <notification name="PromptSelfEmail">
+ Please enter your email address.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Email snapshot with the default subject or message?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Error processing snapshot data
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Error encoding snapshot.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ There was a problem sending a snapshot due to the following reason: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ There was a problem uploading a report screenshot due to the following reason: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ You must agree to the Terms of Service to continue logging into [SECOND_LIFE].
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Could not put on outfit.
+The outfit folder contains no clothing, body parts, or attachments.
+ </notification>
+ <notification name="CannotWearTrash">
+ You can not wear clothes or body parts that are in the trash
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Could not attach object.
+Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach another object first.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ You can not wear that item because it has not yet loaded. Please try again in a minute.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Oops! Something was left blank.
+You need to enter the Username name of your avatar.
+
+You need an account to enter [SECOND_LIFE]. Would you like to create one now?
+ <url name="url">
+ http://join.secondlife.com/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Try again" yestext="Create a new account"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ You need to enter either the Username or both the First and Last name of your avatar into the Username field, then login again.
+ </notification>
+ <notification name="DeleteClassified">
+ Delete classified &apos;[NAME]&apos;?
+There is no reimbursement for fees paid.
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="DeleteMedia">
+ You have selected to delete the media associated with this face.
+Are you sure you want to continue?
+ <usetemplate ignoretext="Confirm before I delete media from an object" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ Save changes to classified [NAME]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="不要儲存" yestext="儲存"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Insufficient funds to create classified.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ Delete the selected outfit?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ Go to the [SECOND_LIFE] events web page?
+ <url name="url">
+ http://secondlife.com/events/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Please select a proposal to view.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Please select a history item to view.
+ </notification>
+ <notification name="CacheWillClear">
+ Cache will be cleared after you restart [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ Cache will be moved after you restart [APP_NAME].
+Note: This will clear the cache.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ Port settings take effect after you restart [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ The new skin will appear after you restart [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ Changing language will take effect after you restart [APP_NAME].
+ </notification>
+ <notification name="GoToAuctionPage">
+ Go to the [SECOND_LIFE] web page to see auction details or make a bid?
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="SaveChanges">
+ Save Changes?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="不要儲存" yestext="儲存"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Gesture save failed.
+This gesture has too many steps.
+Try removing some steps, then save again.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Gesture save failed. Please try again in a minute.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Could not save gesture because the object or the associated object inventory could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ There was a problem saving a gesture due to the following reason: [REASON]. Please try resaving the gesture later.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Could not save notecard because the object or the associated object inventory could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ There was a problem saving a notecard due to the following reason: [REASON]. Please try re-saving the notecard later.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Could not undo all changes in your version of the script.
+Would you like to load the server&apos;s last saved version?
+(**Warning** This operation cannot be undone.)
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ There was a problem saving a script due to the following reason: [REASON]. Please try re-saving the script later.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ Could not save the script because the object it is in could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ There was a problem saving a compiled script due to the following reason: [REASON]. Please try re-saving the script later.
+ </notification>
+ <notification name="StartRegionEmpty">
+ Oops, Your Start Region is not defined.
+Please type the Region name in Start Location box or choose My Last Location or My Home as your Start Location.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Could not start or stop the script because the object it is on could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Unable to download file
+ </notification>
+ <notification name="CannotWriteFile">
+ Unable to write file [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ Just so you know, your computer does not meet [APP_NAME]&apos;s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can&apos;t provide technical support for unsupported system configurations.
+
+Visit [_URL] for more information?
+ <url name="url">
+ http://www.secondlife.com/corporate/sysreqs.php
+ </url>
+ <usetemplate ignoretext="My computer hardware is not supported" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Your system contains a graphics card that [APP_NAME] doesn&apos;t recognize.
+This is often the case with new hardware that hasn&apos;t been tested yet with [APP_NAME]. It will probably be ok, but you may need to adjust your graphics settings.
+(Me &gt; Preferences &gt; Graphics).
+ <form name="form">
+ <ignore name="ignore" text="My graphics card could not be identified"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ [APP_NAME] crashed while initializing graphics drivers.
+Graphics Quality will be set to Low to avoid some common driver errors. This will disable some graphics features.
+We recommend updating your graphics card drivers.
+Graphics Quality can be raised in Preferences &gt; Graphics.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ The region [REGION] does not allow terraforming.
+ </notification>
+ <notification name="CannotCopyWarning">
+ You do not have permission to copy the following items:
+[ITEMS]
+and will lose it from your inventory if you give it away. Do you really want to offer these items?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ Unable to give inventory item.
+ </notification>
+ <notification name="TransactionCancelled">
+ Transaction cancelled.
+ </notification>
+ <notification name="TooManyItems">
+ Cannot give more than 42 items in a single inventory transfer.
+ </notification>
+ <notification name="NoItems">
+ You do not have permission to transfer the selected items.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ You do not have permission to copy [COUNT] of the selected items. You will lose these items from your inventory.
+Do you really want to give these items?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ You do not have permission to transfer the selected folder.
+ </notification>
+ <notification name="FreezeAvatar">
+ Freeze this avatar?
+He or she will temporarily be unable to move, chat, or interact with the world.
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="Unfreeze" yestext="Freeze"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ Freeze [AVATAR_NAME]?
+He or she will temporarily be unable to move, chat, or interact with the world.
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="Unfreeze" yestext="Freeze"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ Eject [AVATAR_NAME] from your land?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="Eject and Ban" yestext="Eject"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ Eject this avatar from your land?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="Eject"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ Eject [AVATAR_NAME] from your land?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="Eject"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ You ejected [AVATAR_NAME] from group [GROUP_NAME]
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ ACQUIRE ERROR: Too many objects selected.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ACQUIRE ERROR: Objects span more than one region.
+Please move all objects to be acquired onto the same region.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+Go to [_URL] for information on purchasing L$?
+ <url name="url">
+ http://secondlife.com/app/currency/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Unable to link these [COUNT] objects.
+You can link a maximum of [MAX] objects.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ You can only link complete sets of objects, and must select more than one object.
+ </notification>
+ <notification name="CannotLinkModify">
+ Unable to link because you don&apos;t have modify permission on all the objects.
+
+Please make sure none are locked, and that you own all of them.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Unable to link because not all of the objects have the same owner.
+
+Please make sure you own all of the selected objects.
+ </notification>
+ <notification name="NoFileExtension">
+ No file extension for the file: &apos;[FILE]&apos;
+
+Please make sure the file has a correct file extension.
+ </notification>
+ <notification name="InvalidFileExtension">
+ Invalid file extension [EXTENSION]
+Expected [VALIDS]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Couldn&apos;t open uploaded sound file for reading:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ File does not appear to be a RIFF WAVE file:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ File does not appear to be a PCM WAVE audio file:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ File has invalid number of channels (must be mono or stereo):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ File does not appear to be a supported sample rate (must be 44.1k):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ File does not appear to be a supported word size (must be 8 or 16 bit):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ Could not find &apos;data&apos; chunk in WAV header:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Wrong chunk size in WAV file:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ Audio file is too long (10 second maximum):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ Problem with file [FILE]:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Couldn&apos;t open temporary compressed sound file for writing: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Unknown Vorbis encode failure on: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Unable to encode file: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ We can&apos;t fill in your username and password. This may happen when you change network setup
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Corrupt resource file: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Unknown Linden resource file version in file: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Unable to create output file: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] does not currently support bulk upload of animation files.
+ </notification>
+ <notification name="CannotUploadReason">
+ Unable to upload [FILE] due to the following reason: [REASON]
+Please try again later.
+ </notification>
+ <notification name="LandmarkCreated">
+ You have added &quot;[LANDMARK_NAME]&quot; to your [FOLDER_NAME] folder.
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ You already have a landmark for this location.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ You cannot create a landmark here because the owner of the land doesn&apos;t allow it.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ Not able to perform &apos;recompilation&apos;.
+Select an object with a script.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ Not able to perform &apos;recompilation&apos;.
+
+Select objects with scripts that you have permission to modify.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ Not able to perform &apos;reset&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ Not able to perform &apos;reset&apos;.
+
+Select objects with scripts that you have permission to modify.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Unable to open script in object without modify permissions.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ Not able to set any scripts to &apos;running&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ Unable to set any scripts to &apos;not running&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ No frontmost floater to save.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Your search query was modified and the words that were too short were removed.
+
+Searched for: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Your search terms were too short so no search was performed.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Teleport failed.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ Problem encountered processing your teleport request. You may need to log back in before you can teleport.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Problem encountered processing your region crossing. You may need to log back in before you can cross regions.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem.
+ </notification>
+ <notification name="nolandmark_tport">
+ Sorry, but system was unable to locate landmark destination.
+ </notification>
+ <notification name="timeout_tport">
+ Sorry, but system was unable to complete the teleport connection. Try again in a moment.
+ </notification>
+ <notification name="noaccess_tport">
+ Sorry, you do not have access to that teleport destination.
+ </notification>
+ <notification name="missing_attach_tport">
+ Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area.
+ </notification>
+ <notification name="expired_tport">
+ Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes.
+ </notification>
+ <notification name="expired_region_handoff">
+ Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes.
+ </notification>
+ <notification name="no_host">
+ Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes.
+ </notification>
+ <notification name="no_inventory_host">
+ The inventory system is currently unavailable.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ Unable to set land owner:
+No parcel selected.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Unable to force land ownership because selection spans multiple regions. Please select a smaller area and try again.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some Residents unhappy if bidding has begun.
+Force ownership?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ Unable to contentify:
+No parcel selected.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ Unable to contentify:
+No region selected.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ Unable to abandon land:
+No parcel selected.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ Unable to abandon land:
+Cannot find region.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Unable to buy land:
+No parcel selected.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Unable to buy land:
+Cannot find the region this land is in.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ Unable to deed land:
+No parcel selected.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ Unable to deed land:
+No Group selected.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ Unable to deed land:
+Cannot find the region this land is in.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ Unable to deed land:
+Multiple parcels selected.
+
+Try selecting a single parcel.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ Unable to deed land:
+Waiting for server to report ownership.
+
+Please try again.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ Unable to deed land:
+The region [REGION] does not allow transfer of land.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ Unable to abandon land:
+Waiting for server to update parcel information.
+
+Try again in a few seconds.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ Unable to abandon land:
+You do not own all the parcels selected.
+
+Please select a single parcel.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ Unable to abandon land:
+You don&apos;t have permission to release this parcel.
+Parcels you own appear in green.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ Unable to abandon land:
+Cannot find the region this land is in.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ Unable to abandon land:
+The region [REGION] does not allow transfer of land.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ Unable to abandon land:
+You must select an entire parcel to release it.
+
+Select an entire parcel, or divide your parcel first.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ You are about to release [AREA] m² of land.
+Releasing this parcel will remove it from your land holdings, but will not grant any L$.
+
+Release this land?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ Unable to divide land:
+
+No parcels selected.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ Unable to divide land:
+
+You have an entire parcel selected.
+Try selecting a part of the parcel.
+ </notification>
+ <notification name="LandDivideWarning">
+ Dividing this land will split this parcel into two and each parcel can have its own settings. Some settings will be reset to defaults after the operation.
+
+Divide land?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ Unable to divide land:
+Cannot find the region this land is in.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ Unable to join land:
+Cannot find the region this land is in.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ Unable to join land:
+No parcels selected.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ Unable to join land:
+You only have one parcel selected.
+
+Select land across both parcels.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ Unable to join land:
+You must select more than one parcel.
+
+Select land across both parcels.
+ </notification>
+ <notification name="JoinLandWarning">
+ Joining this land will create one large parcel out of all parcels intersecting the selected rectangle.
+You will need to reset the name and options of the new parcel.
+
+Join land?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ This notecard needs to be saved before the item can be copied or viewed. Save notecard?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ Copy this item to your inventory?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="Copy"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Failed to switch resolution to [RESX] by [RESY]
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Error: Undefined grasses: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Error: Undefined trees: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ Unable to save &apos;[NAME]&apos; to wearable file. You will need to free up some space on your computer and save the wearable again.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ Unable to save [NAME] to central asset store.
+This is usually a temporary failure. Please customize and save the wearable again in a few minutes.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Darn. You have been logged out of [SECOND_LIFE]
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Quit" yestext="View IM &amp; Chat"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Unable to buy land for the group:
+You do not have permission to buy land for your active group.
+ </notification>
+ <notification label="加為朋友" name="AddFriendWithMessage">
+ Friends can give permissions to track each other on the map and receive online status updates.
+
+Offer friendship to [NAME]?
+ <form name="form">
+ <input name="message">
+ Would you be my friend?
+ </input>
+ <button name="Offer" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification label="Save Outfit" name="SaveOutfitAs">
+ Save what I&apos;m wearing as a new Outfit:
+ <form name="form">
+ <input name="message">
+ [DESC] (new)
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification label="Save Wearable" name="SaveWearableAs">
+ Save item to my inventory as:
+ <form name="form">
+ <input name="message">
+ [DESC] (新)
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification label="Rename Outfit" name="RenameOutfit">
+ New outfit name:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ Do you want to remove [NAME] from your Friends List?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ Do you want to remove multiple friends from your Friends list?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Are you sure you want to delete all scripted objects owned by
+** [AVATAR_NAME] **
+on all others land in this sim?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Are you sure you want to DELETE ALL scripted objects owned by
+** [AVATAR_NAME] **
+on ALL LAND in this sim?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Are you sure you want to DELETE ALL objects (scripted or not) owned by
+** [AVATAR_NAME] **
+on ALL LAND in this sim?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ You must specify a name for your classified.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ Price to pay for listing must be at least L$[MIN_PRICE].
+
+Please enter a higher price.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ At least one of the items you have selected is locked.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ At least one of the items you have selected is not copyable.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ You do not own least one of the items you have selected.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ At least one object is locked.
+At least one object is not copyable.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ At least one object is locked.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ At least one object is not copyable.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ At least one object is locked.
+At least one object is not copyable.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ At least one object is locked.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ You do not own all of the objects you are taking.
+If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ At least one object is locked.
+You do not own all of the objects you are taking.
+If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them.
+However, you can take the current selection.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Unable to buy land because selection spans multiple regions.
+
+Please select a smaller area and try again.
+ </notification>
+ <notification name="DeedLandToGroup">
+ By deeding this parcel, the group will be required to have and maintain sufficient land use credits.
+The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
+
+Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ By deeding this parcel, the group will be required to have and maintain sufficient land use credits.
+The deed will include a simultaneous land contribution to the group from &apos;[NAME]&apos;.
+The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
+
+Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Display settings have been set to safe levels because you have specified the -safe option.
+ </notification>
+ <notification name="DisplaySetToRecommended">
+ Display settings have been set to recommended levels based on your system configuration.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ Your desired location is not currently available.
+You have been moved into a nearby region.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Your last location is not currently available.
+You have been moved into a nearby region.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Your home location is not currently available.
+You have been moved into a nearby region.
+You may want to set a new home location.
+ </notification>
+ <notification name="ClothingLoading">
+ Your clothing is still downloading.
+You can use [SECOND_LIFE] normally and other people will see you correctly.
+ <form name="form">
+ <ignore name="ignore" text="Clothing is taking a long time to download"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ [APP_NAME] installation is complete.
+
+If this is your first time using [SECOND_LIFE], you will need to create an account before you can log in.
+Return to [http://join.secondlife.com secondlife.com] to create a new account?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="New Account..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ We&apos;re having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID].
+
+You can either check your Internet connection and try again in a few minutes, click Help to view the [SUPPORT_SITE], or click Teleport to attempt to teleport home.
+ <url name="url">
+ http://secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Help" text="Help"/>
+ <button name="Teleport" text="Teleport"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Your character will appear in a moment.
+
+Use arrow keys to walk.
+Press the F1 key at any time for help or to learn more about [SECOND_LIFE].
+Please choose the male or female avatar. You can change your mind later.
+ <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Could not teleport to [SLURL] as it&apos;s on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ 無法連接到伺服器。
+[REASON]
+
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Valid From: [VALID_FROM]
+Valid To: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ The certification authority for this server is not known.
+
+Certificate Information:
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Valid From: [VALID_FROM]
+Valid To: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+
+Would you like to trust this authority?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="Trust"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] L$ [PRICE] You don&apos;t have enough L$ to do that.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] has given you permission to edit their objects.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Your privilege to modify [NAME]&apos;s objects has been revoked
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ This will flush the map caches on this region.
+This is really only useful for debugging.
+(In production, wait 5 minutes, then everyone&apos;s map will update after they relog.)
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ Unable to buy more than one object at a time. Please select only one object and try again.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ Unable to copy the contents of more than one item at a time.
+Please select only one object and try again.
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ Teleport all Residents in this region home?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ Are you sure you want to return objects owned by [USER_NAME]?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Couldn&apos;t set region textures:
+Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
+
+Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Couldn&apos;t set region textures:
+Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+ </notification>
+ <notification name="RawUploadStarted">
+ Upload started. It may take up to two minutes, depending on your connection speed.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Do you really want to bake the current terrain, make it the center for terrain raise/lower limits and the default for the &apos;Revert&apos; tool?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ You can only have [MAX_AGENTS] Allowed Residents.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ You can only have [MAX_BANNED] Banned Residents.
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ Failure while attempting to add [NUM_ADDED] agents:
+Exceeds the [MAX_AGENTS] [LIST_TYPE] limit by [NUM_EXCESS].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ You can only have [MAX_GROUPS] Allowed Groups.
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="Bake"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ You can only have [MAX_MANAGER] Estate Managers.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ Can&apos;t add estate owner to estate &apos;Banned Resident&apos; list.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ Can&apos;t change appearance until clothing and shape are loaded.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ The name of your classified must start with a letter from A to Z or a number. No punctuation is allowed.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Can&apos;t set Buy Object, because the object is not for sale.
+Please set the object for sale and try again.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Finished download of raw terrain file to:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ A new version of [APP_NAME] is available.
+[MESSAGE]
+You must download this update to use [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Quit" yestext="下載"/>
+ </notification>
+ <notification name="DownloadWindows">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ A new version of [APP_NAME] is available.
+[MESSAGE]
+You must download this update to use [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Quit" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinux">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ A new version of [APP_NAME] is available.
+[MESSAGE]
+You must download this update to use [APP_NAME].
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="Quit" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMac">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ An error occurred installing the viewer update.
+Please download and install the latest viewer from
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ We were unable to install a required update.
+You will be unable to log in until [APP_NAME] has been updated.
+
+Please download and install the latest viewer from
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Quit"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ There is a required update for your Second Life Installation.
+
+You may download this update from http://www.secondlife.com/downloads
+or you can install it now.
+ <usetemplate name="okcancelbuttons" notext="Quit Second Life" yestext="Download and install now"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ We have downloaded an update to your [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <usetemplate name="okcancelbuttons" notext="Later..." yestext="Install now and restart [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ We have downloaded an update to your [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <usetemplate name="okcancelbuttons" notext="Later..." yestext="Install now and restart [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ We have downloaded a required software update.
+Version [VERSION]
+
+We must restart [APP_NAME] to install the update.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ We must restart [APP_NAME] to install the update.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Deeding this object will cause the group to:
+* Receive L$ paid into the object
+ <usetemplate ignoretext="Confirm before I deed an object to a group" name="okcancelignore" notext="取銷" yestext="Deed"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Do you want to open your Web browser to view this content?
+ <usetemplate ignoretext="Launch my browser to view a web page" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ Go to your [http://secondlife.com/account/ Dashboard] to manage your account?
+ <usetemplate ignoretext="Launch my browser to manage my account" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Visit the [SECOND_LIFE] Wiki for details of how to report a security issue.
+ <usetemplate ignoretext="Launch my browser to learn how to report a Security Issue" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ Visit the [SECOND_LIFE] QA Wiki.
+ <usetemplate ignoretext="Launch my browser to view the QA Wiki" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and other issues.
+ <usetemplate ignoretext="Launch my browser to use the Public Issue Tracker" name="okcancelignore" notext="取銷" yestext="Go to page"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ Go to the Official Linden Blog, for the latest news and information.
+ <usetemplate ignoretext="Launch my browser to view the blog" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Do you want to open the Scripting Guide for help with scripting?
+ <usetemplate ignoretext="Launch my browser to view the Scripting Guide" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ Do you want to visit the LSL Portal for help with scripting?
+ <usetemplate ignoretext="Launch my browser to view the LSL Portal" name="okcancelignore" notext="取銷" yestext="Go to page"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ Are you sure you want to return the selected objects to their owners? Transferable deeded objects will be returned to their previous owners.
+
+*WARNING* No-transfer deeded objects will be deleted!
+ <usetemplate ignoretext="Confirm before I return objects to their owners" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ You are currently a member of the group [GROUP].
+Leave Group?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmKick">
+ Do you REALLY want to kick all Residents off the grid?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="Kick All Residents"/>
+ </notification>
+ <notification name="MuteLinden">
+ Sorry, you cannot block a Linden.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction.
+ </notification>
+ <notification label="Block object by name failed" name="MuteByNameFailed">
+ You already have blocked this name.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Though permitted, deleting contents may damage the object. Do you want to delete that item?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Cannot offer a calling card at this time. Please try again in a moment.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Cannot offer friendship at this time. Please try again in a moment.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="BusyModeSet">
+ Busy mode is set.
+Chat and instant messages will be hidden. Instant messages will get your Busy mode response. All teleportation offers will be declined. All inventory offers will go to your Trash.
+ <usetemplate ignoretext="I change my status to Busy mode" name="okignore" yestext="確定"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer.
+[NAME] has invited you to join a group as a member.
+ <usetemplate name="okcancelbuttons" notext="Decline" yestext="Join"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="KickUser">
+ Kick this Resident with what message?
+ <form name="form">
+ <input name="message">
+ An administrator has logged you off.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ Kick everyone currently on the grid with what message?
+ <form name="form">
+ <input name="message">
+ An administrator has logged you off.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ Freeze this Resident with what message?
+ <form name="form">
+ <input name="message">
+ You have been frozen. You cannot move or chat. An administrator will contact you via instant message (IM).
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ Unfreeze this Resident with what message?
+ <form name="form">
+ <input name="message">
+ You are no longer frozen.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Hi [DISPLAY_NAME]!
+
+Just like in real life, it takes a while for everyone to learn about a new name. Please allow several days for [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] in objects, scripts, search, etc.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Sorry, you cannot change your display name. If you feel this is in error, please contact support.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters.
+
+Please try a shorter name.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Sorry, we could not set your display name. Please try again later.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ The display names you entered do not match. Please re-enter.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Sorry, you have to wait longer before you can change your display name.
+
+See http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Please try again later.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Sorry, we could not set your requested name because it contains a banned word.
+
+ Please try a different name.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ The display name you wish to set contains invalid characters.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Your display name must contain letters other than punctuation.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) is now known as [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ Offer a teleport to your location with the following message?
+ <form name="form">
+ <input name="message">
+ Join me in [REGION]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ God summon Resident to your location?
+ <form name="form">
+ <input name="message">
+ Join me in [REGION]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Confirm that I want to teleport to a landmark" name="okcancelignore" notext="取銷" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Teleport to [PICK]?
+ <usetemplate ignoretext="Confirm that I want to teleport to a location in Picks" name="okcancelignore" notext="取銷" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Teleport to [CLASSIFIED]?
+ <usetemplate ignoretext="Confirm that I want to teleport to a location in Classifieds" name="okcancelignore" notext="取銷" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ Teleport to [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Confirm that I want to teleport to a history location" name="okcancelignore" notext="取銷" yestext="Teleport"/>
+ </notification>
+ <notification label="Message everyone in your Estate" name="MessageEstate">
+ Type a short announcement which will be sent to everyone currently in your estate.
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification label="Change Linden Estate" name="ChangeLindenEstate">
+ You are about to change a Linden owned estate (mainland, teen grid, orientation, etc.).
+
+This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup.
+
+Proceed?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification label="Change Linden Estate Access" name="ChangeLindenAccess">
+ You are about to change the access list for a Linden owned estate (mainland, teen grid, orientation, etc.).
+
+This is DANGEROUS and should only be done to invoke the hack allowing objects/L$ to be transfered in/out of a grid.
+It will change thousands of regions and make the spaceserver hiccup.
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification label="選擇領地" name="EstateAllowedAgentAdd">
+ Add to allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateAllowedAgentRemove">
+ Remove from allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateAllowedGroupAdd">
+ Add to group allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateAllowedGroupRemove">
+ Remove from group allowed list for this estate only or [ALL_ESTATES]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateBannedAgentAdd">
+ Deny access for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateBannedAgentRemove">
+ Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateManagerAdd">
+ Add estate manager for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="選擇領地" name="EstateManagerRemove">
+ Remove estate manager for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="Confirm Kick" name="EstateKickUser">
+ Kick [EVIL_USER] from this estate?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Are you sure you want to change the Estate Covenant?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ You are not allowed in that region due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t enter this Region, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ You are not allowed in that region due to your maturity Rating.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ You are not allowed in that Region due to your maturity Rating preference.
+
+To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me &gt; Preferences &gt; General.
+ <form name="form">
+ <button name="OK" text="Change Preference"/>
+ <button name="Cancel" text="Close"/>
+ <ignore name="ignore" text="My chosen Rating preference prevents me from entering a Region"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Your maturity Rating preference is now [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ You cannot claim this land due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ You cannot claim this land due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t claim this Land, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ You cannot claim this land due to your maturity Rating.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ You cannot claim this land due to your maturity Rating preference.
+
+You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <usetemplate ignoretext="My chosen Rating preference prevents me from claiming Land" name="okcancelignore" notext="關閉" yestext="Change Preference"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ You cannot buy this land due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ You cannot buy this land due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t buy this Land, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ You cannot buy this land due to your maturity Rating.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ You cannot buy this land due to your maturity Rating preference.
+
+You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <usetemplate ignoretext="My chosen Rating preference prevents me from buying Land" name="okcancelignore" notext="關閉" yestext="變更偏好設定"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prims and try again
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Problem importing estate covenant.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Problems adding a new estate manager. One or more estates may have a full manager list.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Problems adding to this estate list. One or more estates may have a full list.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Unable to load notecard&apos;s asset at this time.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ Insufficient permissions to view notecard associated with asset ID requested.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Asset ID for notecard is missing from database.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="PublishClassified">
+ Remember: Classified ad fees are non-refundable.
+
+Publish this classified now for L$[AMOUNT]?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Does this classified contain Moderate content?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="SetGroupMature">
+ Does this group contain Moderate content?
+ <usetemplate canceltext="取銷" name="yesnocancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification label="Confirm restart" name="ConfirmRestart">
+ Do you really want to restart this region in 2 minutes?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification label="Message everyone in this region" name="MessageRegion">
+ Type a short announcement which will be sent to everyone in this region.
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification label="Changed Region Maturity" name="RegionMaturityChange">
+ The maturity rating for this region has been updated.
+It may take some time for the change to be reflected on the map.
+
+To enter Adult regions, Residents must be Account Verified, either by age-verification or payment-verification.
+ </notification>
+ <notification label="Voice Version Mismatch" name="VoiceVersionMismatch">
+ This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME].
+ </notification>
+ <notification label="Can&apos;t Buy Objects" name="BuyObjectOneOwner">
+ Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
+ </notification>
+ <notification label="Can&apos;t Buy Contents" name="BuyContentsOneOnly">
+ Unable to buy the contents of more than one object at a time.
+Please select only one object and try again.
+ </notification>
+ <notification label="Can&apos;t Buy Contents" name="BuyContentsOneOwner">
+ Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
+ </notification>
+ <notification name="BuyOriginal">
+ Buy original object from [OWNER] for L$[PRICE]?
+You will become the owner of this object.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Buy original object for L$[PRICE]?
+You will become the owner of this object.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="BuyCopy">
+ Buy a copy from [OWNER] for L$[PRICE]?
+The object will be copied to your inventory.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Buy a copy for L$[PRICE]?
+The object will be copied to your inventory.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="BuyContents">
+ Buy contents from [OWNER] for L$[PRICE]?
+They will be copied to your inventory.
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ Buy contents for L$[PRICE]?
+They will be copied to your inventory.
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ This transaction will:
+[ACTION]
+
+Are you sure you want to proceed with this purchase?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ This transaction will:
+[ACTION]
+
+Are you sure you want to proceed with this purchase?
+Please re-enter your password and click OK.
+ <form name="form">
+ <button name="ConfirmPurchase" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Note:
+You have updated the location of this pick but the other details will retain their original values.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ You have selected &apos;no copy&apos; inventory items.
+These items will be moved to your inventory, not copied.
+
+Move the inventory item(s)?
+ <usetemplate ignoretext="Warn me before I move &apos;no-copy&apos; items from an object" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ You have selected &apos;no copy&apos; inventory items. These items will be moved to your inventory, not copied.
+Because this object is scripted, moving these items to your inventory may cause the script to malfunction.
+
+Move the inventory item(s)?
+ <usetemplate ignoretext="Warn me before I move &apos;no-copy&apos; items which might break a scripted object" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Warning: The &apos;Pay object&apos; click action has been set, but it will only work if a script is added with a money() event.
+ <form name="form">
+ <ignore name="ignore" text="I set the action &apos;Pay object&apos; when building an object without a money() script"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ There are no items in this object that you are allowed to copy.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ Go to your [http://secondlife.com/account/ Dashboard] to see your account history?
+ <usetemplate ignoretext="Launch my browser to see my account history" name="okcancelignore" notext="取銷" yestext="Go to page"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ Are you sure you want to quit?
+ <usetemplate ignoretext="Confirm before I quit" name="okcancelignore" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Confirm before deleting items" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
+
+All reported abuses are investigated and resolved.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Please select a category for this abuse report.
+Selecting a category helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Please enter the name of the abuser.
+Entering an accurate value helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Please enter the location where the abuse took place.
+Entering an accurate value helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Please enter a summary of the abuse that took place.
+Entering an accurate summary helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Please enter a detailed description of the abuse that took place.
+Be as specific as you can, including names and the details of the incident you are reporting.
+Entering an accurate description helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Dear Resident,
+
+You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
+
+(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the [SECOND_LIFE] permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] or [http://secondlife.com/corporate/cs.php Community Standards]. However, the Abuse Team does not handle and will not respond to requests to remove content from the [SECOND_LIFE] world.
+
+(2) The DMCA or Content Removal Process. To request removal of content from [SECOND_LIFE], you MUST submit a valid notification of infringement as provided in our [http://secondlife.com/corporate/dmca.php DMCA Policy].
+
+If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category &apos;CopyBot or Permissions Exploit&apos;.
+
+Thank you,
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ The following required components are missing from [FLOATER]:
+[COMPONENTS]
+ </notification>
+ <notification label="Replace Existing Attachment" name="ReplaceAttachment">
+ There is already an object attached to this point on your body.
+Do you want to replace it with the selected object?
+ <form name="form">
+ <ignore name="ignore" text="Replace an existing attachment with the selected item"/>
+ <button ignore="Replace Automatically" name="Yes" text="確定"/>
+ <button ignore="Never Replace" name="No" text="取銷"/>
+ </form>
+ </notification>
+ <notification label="Busy Mode Warning" name="BusyModePay">
+ You are in Busy Mode, which means you will not receive any items offered in exchange for this payment.
+
+Would you like to leave Busy Mode before completing this transaction?
+ <form name="form">
+ <ignore name="ignore" text="I am about to pay a person or object while I am in Busy mode"/>
+ <button ignore="Always leave Busy Mode" name="Yes" text="確定"/>
+ <button ignore="Never leave Busy Mode" name="No" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ The folder &apos;[FOLDERNAME]&apos; is a system folder. Deleting system folders can cause instability. Are you sure you want to delete it?
+ <usetemplate ignoretext="Confirm before I delete a system folder" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Are you sure you want to permanently delete the contents of your Trash?
+ <usetemplate ignoretext="Confirm before I empty the inventory Trash folder" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Are you sure you want to delete your travel, web, and search history?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ Are you sure you want to clear your cookies?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="是"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ Are you sure you want to clear your list of saved URLs?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="是"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Are you sure you want to permanently delete the contents of your Lost And Found?
+ <usetemplate ignoretext="Confirm before I empty the inventory Lost And Found folder" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="CopySLURL">
+ The following SLurl has been copied to your clipboard:
+ [SLURL]
+
+Link to this from a web page to give others easy access to this location, or try it out yourself by pasting it into the address bar of any web browser.
+ <form name="form">
+ <ignore name="ignore" text="SLurl is copied to my clipboard"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ Do you wish to overwrite the saved preset?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="是"/>
+ </notification>
+ <notification name="WLDeletePresetAlert">
+ Do you wish to delete [SKY]?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ You cannot edit or delete a default preset.
+ </notification>
+ <notification name="WLMissingSky">
+ This day cycle file references a missing sky file: [SKY].
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ PostProcess Effect exists. Do you still wish overwrite it?
+ <usetemplate name="okcancelbuttons" notext="否" yestext="是"/>
+ </notification>
+ <notification name="NewSkyPreset">
+ Give me a name for the new sky.
+ <form name="form">
+ <input name="message">
+ New Preset
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="ExistsSkyPresetAlert">
+ Preset already exists!
+ </notification>
+ <notification name="NewWaterPreset">
+ Give me a name for the new water preset.
+ <form name="form">
+ <input name="message">
+ New Preset
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="ExistsWaterPresetAlert">
+ Preset already exists!
+ </notification>
+ <notification name="WaterNoEditDefault">
+ You cannot edit or delete a default preset.
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ Unable to start a new chat session with [RECIPIENT].
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ Your chat session with [NAME] must close.
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ You can&apos;t buy an object while it is attached.
+ </notification>
+ <notification label="About Requests for the Debit Permission" name="DebitPermissionDetails">
+ Granting this request gives a script ongoing permission to take Linden dollars (L$) from your account. To revoke this permission, the object owner must delete the object or reset the scripts in the object.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ Would you like to automatically wear the clothing you are about to create?
+ <usetemplate ignoretext="Wear the clothing I create while editing My Appearance" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/verification.php
+ </url>
+ <usetemplate ignoretext="I have not verified my age" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ You must have payment information on file to visit this area. Do you want to go to the [SECOND_LIFE] website and set this up?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/
+ </url>
+ <usetemplate ignoretext="I lack payment information on file" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="MissingString">
+ The string [STRING_NAME] is missing from strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Cancelled
+ </notification>
+ <notification name="CancelledSit">
+ Cancelled Sit
+ </notification>
+ <notification name="CancelledAttach">
+ Cancelled Attach
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Replaced missing clothing/body part with default.
+ </notification>
+ <notification name="GroupNotice">
+ Topic: [SUBJECT], Message: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ [NAME] is Online
+ </notification>
+ <notification name="FriendOffline">
+ [NAME] is Offline
+ </notification>
+ <notification name="AddSelfFriend">
+ Although you&apos;re very nice, you can&apos;t add yourself as a friend.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Uploading in-world and web site snapshots...
+(Takes about 5 minutes.)
+ </notification>
+ <notification name="UploadPayment">
+ You paid L$[AMOUNT] to upload.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Web site snapshot upload done.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ In-world snapshot upload done
+ </notification>
+ <notification name="TerrainDownloaded">
+ Terrain.raw downloaded
+ </notification>
+ <notification name="GestureMissing">
+ Hmm. Gesture [NAME] is missing from the database.
+ </notification>
+ <notification name="UnableToLoadGesture">
+ Unable to load gesture [NAME].
+ </notification>
+ <notification name="LandmarkMissing">
+ Landmark is missing from database.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ Unable to load landmark. Please try again.
+ </notification>
+ <notification name="CapsKeyOn">
+ Your Caps Lock key is on.
+This might affect your password.
+ </notification>
+ <notification name="NotecardMissing">
+ Notecard is missing from database.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ You don&apos;t have permission to view this notecard.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ Insufficient permissions to rez object.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ Unable to load notecard.
+Please try again.
+ </notification>
+ <notification name="ScriptMissing">
+ Script is missing from database.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ Insufficient permissions to view script.
+ </notification>
+ <notification name="UnableToLoadScript">
+ Unable to load script. Please try again.
+ </notification>
+ <notification name="IncompleteInventory">
+ The complete contents you are offering are not yet locally available. Please try offering those items again in a minute.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ You cannot modify protected categories.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ You cannot remove protected categories.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Unable to buy while downloading object data.
+Please try again.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Unable to link while downloading object data.
+Please try again.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ You can only buy objects from one owner at a time.
+Please select a single object.
+ </notification>
+ <notification name="ObjectNotForSale">
+ This object is not for sale.
+ </notification>
+ <notification name="EnteringGodMode">
+ Entering god mode, level [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Now leaving god mode, level [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ You don&apos;t have permission to copy this.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] received your inventory offer.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] declined your inventory offer.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Your calling card was accepted.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Your calling card was declined.
+ </notification>
+ <notification name="TeleportToLandmark">
+ You can teleport to locations like &apos;[NAME]&apos; by opening the Places panel on the right side of your screen, and then select the Landmarks tab.
+Click on any landmark to select it, then click &apos;Teleport&apos; at the bottom of the panel.
+(You can also double-click on the landmark, or right-click it and choose &apos;Teleport&apos;.)
+ </notification>
+ <notification name="TeleportToPerson">
+ You can contact Residents like &apos;[NAME]&apos; by opening the People panel on the right side of your screen.
+Select the Resident from the list, then click &apos;IM&apos; at the bottom of the panel.
+(You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ Can&apos;t select land across server boundaries.
+Try selecting a smaller piece of land.
+ </notification>
+ <notification name="SearchWordBanned">
+ Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards.
+ </notification>
+ <notification name="NoContentToSearch">
+ Please select at least one type of content to search (General, Moderate, or Adult).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Event Notification:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="Details"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ All objects on this parcel that will transfer to the purchaser of this parcel are now highlighted.
+
+* Trees and grasses that will transfer are not highlighted.
+ <form name="form">
+ <button name="Done" text="Done"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Deactivated gestures with same trigger:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Apple&apos;s QuickTime software does not appear to be installed on your system.
+If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ No Media Plugin was found to handle the &quot;[MIME_TYPE]&quot; mime type. Media of this type will be unavailable.
+ </notification>
+ <notification name="MediaPluginFailed">
+ The following Media Plugin has failed:
+ [PLUGIN]
+
+Please re-install the plugin or contact the vendor if you continue to experience problems.
+ <form name="form">
+ <ignore name="ignore" text="A Media Plugin fails to run"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ The objects you own on the selected parcel of land have been returned back to your inventory.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ The objects on the selected parcel of land that is owned by [NAME] have been returned to his or her inventory.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ The objects on the selected parcel of land owned by the Resident &apos;[NAME]&apos; have been returned to their owner.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
+Transferable deeded objects have been returned to their previous owners.
+Non-transferable objects that are deeded to the group have been deleted.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ The objects on the selected parcel that are NOT owned by you have been returned to their owners.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Message from [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ This land has damage enabled.
+You can be hurt here. If you die, you will be teleported to your home location.
+ </notification>
+ <notification name="NoFly">
+ This area has flying disabled.
+You can&apos;t fly here.
+ </notification>
+ <notification name="PushRestricted">
+ This area does not allow pushing. You can&apos;t push others here unless you own the land.
+ </notification>
+ <notification name="NoVoice">
+ This area has voice chat disabled. You won&apos;t be able to hear anyone talking.
+ </notification>
+ <notification name="NoBuild">
+ This area has building disabled. You can&apos;t build or rez objects here.
+ </notification>
+ <notification name="ScriptsStopped">
+ An administrator has temporarily stopped scripts in this region.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ This region is not running any scripts.
+ </notification>
+ <notification name="NoOutsideScripts">
+ This land has outside scripts disabled.
+
+No scripts will work here except those belonging to the land owner.
+ </notification>
+ <notification name="ClaimPublicLand">
+ You can only claim public land in the Region you&apos;re in.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ You aren&apos;t allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer.
+
+Please go to the Knowledge Base for details on accessing areas with this maturity Rating.
+ </notification>
+ <notification name="URBannedFromRegion">
+ You are banned from the region.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Your account cannot connect to this teen grid region.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ You do not have proper payment status to enter this region.
+ </notification>
+ <notification name="MustGetAgeRgion">
+ You must be age-verified to enter this region.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ You must be age-verified to enter this parcel.
+ </notification>
+ <notification name="NoDestRegion">
+ No destination region found.
+ </notification>
+ <notification name="NotAllowedInDest">
+ You are not allowed into the destination.
+ </notification>
+ <notification name="RegionParcelBan">
+ Cannot region cross into banned parcel. Try another way.
+ </notification>
+ <notification name="TelehubRedirect">
+ You have been redirected to a telehub.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Could not teleport closer to destination.
+ </notification>
+ <notification name="TPCancelled">
+ Teleport cancelled.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ The region you are attempting to enter is currently full.
+Please try again in a few moments.
+ </notification>
+ <notification name="GeneralFailure">
+ General failure.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Routed to wrong region. Please try again.
+ </notification>
+ <notification name="NoValidAgentID">
+ No valid agent id.
+ </notification>
+ <notification name="NoValidSession">
+ No valid session id.
+ </notification>
+ <notification name="NoValidCircuit">
+ No valid circuit code.
+ </notification>
+ <notification name="NoValidTimestamp">
+ No valid timestamp.
+ </notification>
+ <notification name="NoPendingConnection">
+ Unable to create pending connection.
+ </notification>
+ <notification name="InternalUsherError">
+ Internal error attempting to connect agent usher.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Unable to find a good teleport destination in this region.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Internal error attempting to activate region resolver.
+ </notification>
+ <notification name="NoValidLanding">
+ A valid landing point could not be found.
+ </notification>
+ <notification name="NoValidParcel">
+ No valid parcel could be found.
+ </notification>
+ <notification name="ObjectGiveItem">
+ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLURL] has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Keep" text="Keep"/>
+ <button name="Discard" text="Discard"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Show"/>
+ <button name="Discard" text="Discard"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Join"/>
+ <button name="Decline" text="Decline"/>
+ <button name="Info" text="資訊"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] has offered to teleport you to their location:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="Teleport"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Teleport offer sent to [TO_NAME]
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Later"/>
+ <button name="GoNow..." text="Go Now..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] is offering friendship.
+
+[MESSAGE]
+
+(By default, you will be able to see each other&apos;s online status.)
+ <form name="form">
+ <button name="Accept" text="接受"/>
+ <button name="Decline" text="Decline"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ You have offered friendship to [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] is offering friendship.
+
+(By default, you will be able to see each other&apos;s online status.)
+ <form name="form">
+ <button name="Accept" text="接受"/>
+ <button name="Decline" text="Decline"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ [NAME] accepted your friendship offer.
+ </notification>
+ <notification name="FriendshipDeclined">
+ [NAME] declined your friendship offer.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Friendship offer accepted.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Friendship offer declined.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] is offering their calling card.
+This will add a bookmark in your inventory so you can quickly IM this Resident.
+ <form name="form">
+ <button name="Accept" text="接受"/>
+ <button name="Decline" text="Decline"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ This region will restart in [MINUTES] minutes.
+If you stay in this region you will be logged out.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ This region will restart in [SECONDS] seconds.
+If you stay in this region you will be logged out.
+ </notification>
+ <notification name="LoadWebPage">
+ Load web page [URL]?
+
+[MESSAGE]
+
+From object: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, owner: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Go to page"/>
+ <button name="Cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ Failed to find [TYPE] in database.
+ </notification>
+ <notification name="FailedToFindWearable">
+ Failed to find [TYPE] named [DESC] in database.
+ </notification>
+ <notification name="InvalidWearable">
+ The item you are trying to wear uses a feature that your Viewer can&apos;t read. Please upgrade your version of [APP_NAME] to wear this item.
+ </notification>
+ <notification name="ScriptQuestion">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, an object owned by &apos;[NAME]&apos;, would like to:
+
+[QUESTIONS]
+Is this OK?
+ <form name="form">
+ <button name="Yes" text="是"/>
+ <button name="No" text="否"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ An object named &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, owned by &apos;[NAME]&apos; would like to:
+
+[QUESTIONS]
+If you do not trust this object and its creator, you should deny the request.
+
+Grant this request?
+ <form name="form">
+ <button name="Grant" text="Grant"/>
+ <button name="Deny" text="Deny"/>
+ <button name="Details" text="Details..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ [NAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="忽視"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ [GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="忽視"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Thank you for your payment!
+
+Your L$ balance will be updated when processing completes. If processing takes more than 20 mins, your transaction may be cancelled. In that case, the purchase amount will be credited to your US$ balance.
+
+The status of your payment can be checked on your Transaction History page on your [http://secondlife.com/account/ Dashboard]
+ </notification>
+ <notification name="FirstOverrideKeys">
+ Your movement keys are now being handled by an object.
+Try the arrow keys or AWSD to see what they do.
+Some objects (like guns) require you to go into mouselook to use them.
+Press &apos;M&apos; to do this.
+ </notification>
+ <notification name="FirstSandbox">
+ This is a sandbox area, and is meant to help Residents learn how to build.
+
+Things you build here will be deleted after you leave, so don&apos;t forget to right-click and choose &apos;Take&apos; to move your creation to your Inventory.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ You may only select up to [MAX_SELECT] items from this list.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] is inviting you to a Voice Chat call.
+Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <form name="form">
+ <button name="Accept" text="接受"/>
+ <button name="Decline" text="Decline"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] was sent an instant message and has been automatically unblocked.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] was given money and has been automatically unblocked.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] was offered inventory and has been automatically unblocked.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] has joined a Voice Chat call with the group [GROUP].
+Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <form name="form">
+ <button name="Accept" text="接受"/>
+ <button name="Decline" text="Decline"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] has joined a voice chat call with a conference chat.
+Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <form name="form">
+ <button name="Accept" text="接受"/>
+ <button name="Decline" text="Decline"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] is inviting you to a conference chat.
+Click Accept to join the chat or Decline to decline the invitation. Click Block to block this caller.
+ <form name="form">
+ <button name="Accept" text="接受"/>
+ <button name="Decline" text="Decline"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum capacity. Please try again later.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ We are creating a voice channel for you. This may take up to one minute.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ One or more of your subscribed Voice Morphs has expired.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ The active Voice Morph has expired, your normal voice settings have been applied.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ One or more of your Voice Morphs will expire in less than [INTERVAL] days.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ New Voice Morphs are available!
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Only members of a certain group can visit this area.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ Cannot enter parcel, you have been banned.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ Cannot enter parcel, you are not on the access list.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_NAME]. Please try again later.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ The SLurl you clicked on is not supported.
+ </notification>
+ <notification name="BlockedSLURL">
+ A SLurl was received from an untrusted browser and has been blocked for your security.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Multiple SLurls were received from an untrusted browser within a short period.
+They will be blocked for a few seconds for your security.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Respond"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Are you sure you want to close all IMs?
+ <usetemplate ignoretext="Confirm before I close all IMs" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Attachment has been saved.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Unable to find the help topic for this element.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Server Error: Media update or get failed.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Your text chat has been muted by moderator.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Your voice has been muted by moderator.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Are you sure you want to delete your teleport history?
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Selected button can not be shown right now.
+The button will be shown when there is enough space for it.
+ </notification>
+ <notification name="ShareNotification">
+ Select residents to share with.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Are you sure you want to share the following items:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+With the following Residents:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification name="ItemsShared">
+ Items successfully shared.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Deed to group failed.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; declouded after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] seconds alive )
+You finished baking your outfit after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] seconds alive )
+You sent out an update of your appearance after [TIME] seconds.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; became cloud.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; appeared.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left after [TIME] seconds as cloud.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; entered appearance mode.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left appearance mode.
+ </notification>
+ <notification name="NoConnect">
+ We&apos;re having trouble connecting using [PROTOCOL] [HOSTID].
+Please check your network and firewall setup.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ We&apos;re having trouble connecting to your voice server:
+
+[HOSTID]
+
+Voice communications will not be available.
+Please check your network and firewall setup.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left as fully loaded.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] seconds alive )
+You uploaded a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] seconds alive )
+You locally updated a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TIME] seconds.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Are you sure you want to leave this call?
+ <usetemplate ignoretext="Confirm before I leave call" name="okcancelignore" notext="否" yestext="是"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ You have selected to mute all participants in a group call.
+This will also cause all residents that later join the call to be
+muted, even after you have left the call.
+
+Mute everyone?
+ <usetemplate ignoretext="Confirm before I mute all participants in a group call" name="okcancelignore" notext="取銷" yestext="確定"/>
+ </notification>
+ <notification label="聊天" name="HintChat">
+ To join the conversation, type into the chat field below.
+ </notification>
+ <notification label="Stand" name="HintSit">
+ To stand up and exit the sitting position, click the Stand button.
+ </notification>
+ <notification label="Speak" name="HintSpeak">
+ Click the Speak button to turn your microphone on and off.
+
+Click on the up arrow to see the voice control panel.
+
+Hiding the Speak button will disable the voice feature.
+ </notification>
+ <notification label="Explore the World" name="HintDestinationGuide">
+ The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring.
+ </notification>
+ <notification label="側邊欄" name="HintSidePanel">
+ Get quick access to your inventory, outfits, profiles and more in the side panel.
+ </notification>
+ <notification label="移動" name="HintMove">
+ To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Click to Walk
+Click anywhere on the ground to walk to that spot.
+
+2. Click and Drag to Rotate View
+Click and drag anywhere on the world to rotate your view
+ </notification>
+ <notification label="Display Name" name="HintDisplayName">
+ Set your customizable display name here. This is in addition to your unique username, which can&apos;t be changed. You can change how you see other people&apos;s names in your preferences.
+ </notification>
+ <notification label="View" name="HintView">
+ To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking.
+ </notification>
+ <notification label="Inventory" name="HintInventory">
+ Check your inventory to find items. Newest items can be easily found in the Recent tab.
+ </notification>
+ <notification label="You&apos;ve got Linden Dollars!" name="HintLindenDollar">
+ Here&apos;s your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
+ </notification>
+ <notification name="PopupAttempt">
+ A pop-up was prevented from opening.
+ <form name="form">
+ <ignore name="ignore" text="Enable all pop-ups"/>
+ <button name="open" text="Open pop-up window"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;[REALM]&apos; requires a user name and password.
+ <form name="form">
+ <input name="username" text="User Name"/>
+ <input name="password" text="Password"/>
+ <button name="ok" text="Submit"/>
+ <button name="cancel" text="取銷"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ Changing modes requires you to quit and restart.
+ <usetemplate name="okcancelbuttons" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate name="okcancelbuttons" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate name="okcancelbuttons" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate name="okcancelbuttons" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate name="okcancelbuttons" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Voice calls are only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate name="okcancelbuttons" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Sharing is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate name="okcancelbuttons" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Paying other residents is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate name="okcancelbuttons" notext="Don&apos;t Quit" yestext="Quit"/>
+ </notification>
+ <global name="UnsupportedCPU">
+ - Your CPU speed does not meet the minimum requirements.
+ </global>
+ <global name="UnsupportedGLRequirements">
+ You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
+
+If you continue to have problems, please visit the [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - Your graphics card does not meet the minimum requirements.
+ </global>
+ <global name="UnsupportedRAM">
+ - Your system memory does not meet the minimum requirements.
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ If you own a piece of land, you can make it your home location.
+Otherwise, you can look at the Map and find places marked &quot;Infohub&quot;.
+ </global>
+ <global name="You died and have been teleported to your home location">
+ You died and have been teleported to your home location.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/zh/panel_active_object_row.xml b/indra/newview/skins/default/xui/zh/panel_active_object_row.xml
new file mode 100644
index 0000000000..0905cc30b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_active_object_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="object_name">
+ Unnamed Object
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..641d0eba93
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Call" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Leave Call" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Voice Controls" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..e7a94eafa8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]m
+ </string>
+ <string name="FormatHours">
+ [COUNT]h
+ </string>
+ <string name="FormatDays">
+ [COUNT]d
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]w
+ </string>
+ <string name="FormatMonths">
+ [COUNT]mon
+ </string>
+ <string name="FormatYears">
+ [COUNT]y
+ </string>
+ <text name="avatar_name" value="(loading)"/>
+ <text name="last_interaction" value="0s"/>
+ <icon name="permission_edit_theirs_icon" tool_tip="You can edit this friend&apos;s objects"/>
+ <icon name="permission_edit_mine_icon" tool_tip="This friend can edit, delete or take your objects"/>
+ <icon name="permission_map_icon" tool_tip="This friend can locate you on the map"/>
+ <icon name="permission_online_icon" tool_tip="This friend can see when you&apos;re online"/>
+ <button name="profile_btn" tool_tip="View profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_avatar_tag.xml b/indra/newview/skins/default/xui/zh/panel_avatar_tag.xml
new file mode 100644
index 0000000000..fd91ea97d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ Angela Tester
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ The quick brown fox jumps over the lazy dog.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..d8327683dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Block List
+ </text>
+ <scroll_list name="blocked" tool_tip="List of currently blocked Residents"/>
+ <button label="Block person" name="Block resident..." tool_tip="Pick a Resident to block"/>
+ <button label="Block object by name" name="Block object by name..." tool_tip="Pick an object to block by name"/>
+ <button label="Unblock" name="Unblock" tool_tip="Remove Resident or object from blocked list"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..1fb0f210fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="You don&apos;t have permission to edit"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Edit this shape"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..5e269fcd09
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Switch" name="switch_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_bottomtray.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml
new file mode 100644
index 0000000000..4e7f261e63
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Turns microphone on/off"/>
+ <string name="VoiceControlBtnToolTip" value="顯示 / 隱藏 語音控制板"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Speak" label_selected="Speak" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesture" name="Gesture" tool_tip="顯示 / 隱藏 姿勢"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <bottomtray_button label="移動" name="movement_btn" tool_tip="顯示 / 隱藏 移動控制"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="View" name="camera_btn" tool_tip="顯示 / 隱藏 攝影機控制"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <bottomtray_button name="snapshots" tool_tip="拍攝快照"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <bottomtray_button label="建造" name="build_btn" tool_tip="顯示 / 隱藏 建造工具"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <bottomtray_button label="搜尋" name="search_btn" tool_tip="顯示 / 隱藏 搜尋"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <bottomtray_button label="地圖" name="world_map_btn" tool_tip="顯示 / 隱藏 世界地圖"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <bottomtray_button label="迷你地圖" name="mini_map_btn" tool_tip="顯示 / 隱藏 迷你地圖"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversations"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifications"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..22f3731a6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesture" name="Gesture" tool_tip="顯示 / 隱藏 姿勢"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_chat_header.xml b/indra/newview/skins/default/xui/zh/panel_chat_header.xml
new file mode 100644
index 0000000000..7916bf5155
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_chat_header.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_classified_info.xml b/indra/newview/skins/default/xui/zh/panel_classified_info.xml
new file mode 100644
index 0000000000..6ddfbdaf4f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_classified_info.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ Moderate
+ </panel.string>
+ <panel.string name="type_pg">
+ General Content
+ </panel.string>
+ <panel.string name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] teleport, [MAP] map, [PROFILE] profile
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Enabled
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Disabled
+ </panel.string>
+ <text name="title" value="Classified Info"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="位置:"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Content Type:"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Category:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Creation date:"/>
+ <text_editor name="creation_date" tool_tip="Creation date" value="[date]"/>
+ <text name="price_for_listing_label" value="Price for listing:"/>
+ <text_editor name="price_for_listing" tool_tip="Price for listing." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Clicks:"/>
+ <text_editor name="click_through_text" tool_tip="Click through data" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Auto renew:"/>
+ <text name="auto_renew" value="Enabled"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="描述:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Teleport" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="地圖" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="編輯" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..7a74f07743
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Add +" name="add_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..eba6fa7c29
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <button name="btn_delete" tool_tip="Remove from outfit"/>
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="You don&apos;t have permission to edit"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Edit this wearable"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_cof_wearables.xml b/indra/newview/skins/default/xui/zh/panel_cof_wearables.xml
new file mode 100644
index 0000000000..9e63b9a3a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_clothing" title="Clothing"/>
+ <accordion_tab name="tab_attachments" title="Attachments"/>
+ <accordion_tab name="tab_body_parts" title="Body Parts"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..59bff5f3e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <button name="btn_delete" tool_tip="Remove from outfit"/>
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6558eda253
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_add_panel">
+ <button name="btn_add" tool_tip="Add more items of this type"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml b/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml
new file mode 100644
index 0000000000..73c59d9ae3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Lower Alpha" name="Lower Alpha" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Upper Alpha" name="Upper Alpha" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Head Alpha" name="Head Alpha" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Eye Alpha" name="Eye Alpha" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Hair Alpha" name="Hair Alpha" tool_tip="點擊以挑選圖片"/>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_classified.xml b/indra/newview/skins/default/xui/zh/panel_edit_classified.xml
new file mode 100644
index 0000000000..9478ec49a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_classified.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Edit Classified" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (will update after save)
+ </panel.string>
+ <string name="publish_label">
+ Publish
+ </string>
+ <string name="save_label">
+ 儲存
+ </string>
+ <text name="title">
+ Edit Classified
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Click to select an image"/>
+ </panel>
+ <text name="Name:">
+ Title:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <text name="location_label">
+ 位置:
+ </text>
+ <text name="classified_location">
+ 載入中...
+ </text>
+ <button label="Set to Current Location" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Category:"/>
+ <text name="content_type_label" value="Content type:"/>
+ <icons_combo_box label="General Content" name="content_type">
+ <icons_combo_box.item label="Moderate Content" name="mature_ci" value="Mature"/>
+ <icons_combo_box.item label="General Content" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <check_box label="Auto renew each week" name="auto_renew"/>
+ <text name="price_for_listing_label" value="Price for listing:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Price for listing." value="50"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="取銷" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml b/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml
new file mode 100644
index 0000000000..99e2874319
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iris" name="Iris" tool_tip="點擊以挑選圖片"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="眼睛"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml b/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml
new file mode 100644
index 0000000000..c664880898
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Texture" name="Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="手套"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_hair.xml b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml
new file mode 100644
index 0000000000..0709ad4e67
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Texture" name="Texture" tool_tip="點擊以挑選圖片"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Color"/>
+ <accordion_tab name="hair_style_tab" title="Style"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Eyebrows"/>
+ <accordion_tab name="hair_facial_tab" title="Facial"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml b/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml
new file mode 100644
index 0000000000..388fee9eb3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Upper Texture" name="Upper Fabric" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Lower Texture" name="Lower Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="夾克"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pants.xml b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml
new file mode 100644
index 0000000000..d21c118195
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Texture" name="Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="褲子"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_physics.xml b/indra/newview/skins/default/xui/zh/panel_edit_physics.xml
new file mode 100644
index 0000000000..77ee4fd36d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Breasts Bounce"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Breasts Cleavage"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Breasts Sway"/>
+ <accordion_tab name="physics_belly_tab" title="Belly Bounce"/>
+ <accordion_tab name="physics_butt_tab" title="Butt Bounce"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Butt Sway"/>
+ <accordion_tab name="physics_advanced_tab" title="進階參數"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pick.xml b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
new file mode 100644
index 0000000000..2dd0ed2015
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Edit Pick" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (will update after save)
+ </panel.string>
+ <text name="title">
+ Edit Pick
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Click to select an image"/>
+ <text name="Name:">
+ Title:
+ </text>
+ <text name="description_label">
+ 描述:
+ </text>
+ <text name="location_label">
+ 位置:
+ </text>
+ <text name="pick_location">
+ 載入中...
+ </text>
+ <button label="Set to Current Location" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Save Pick" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="layout_panel1">
+ <button label="取銷" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_profile.xml b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml
new file mode 100644
index 0000000000..24ed9b9acb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profile Edit" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Resident"/>
+ <string name="AcctTypeTrial" value="Trial"/>
+ <string name="AcctTypeCharterMember" value="Charter Member"/>
+ <string name="AcctTypeEmployee" value="Linden Lab Employee"/>
+ <string name="PaymentInfoUsed" value="Payment Info Used"/>
+ <string name="PaymentInfoOnFile" value="Payment Info On File"/>
+ <string name="NoPaymentInfoOnFile" value="No Payment Info On File"/>
+ <string name="AgeVerified" value="Age-verified"/>
+ <string name="NotAgeVerified" value="Not Age-verified"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url">
+ http://secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="無"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <text name="display_name_label" value="Display Name:"/>
+ <text name="solo_username_label" value="Username:"/>
+ <button name="set_name" tool_tip="Set Display Name"/>
+ <text name="user_label" value="Username:"/>
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Click to select an image"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Real World:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Click to select an image"/>
+ <text name="title_homepage_text">
+ Homepage:
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <text name="title_acc_status_text" value="My Account:"/>
+ <text_editor name="acc_status_text" value="Resident. No payment info on file."/>
+ <text name="my_account_link" value="[[URL] Go to My Dashboard]"/>
+ <text name="title_partner_text" value="My Partner:"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(retrieving)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Edit]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="Save Changes" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="取銷" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shape.xml b/indra/newview/skins/default/xui/zh/panel_edit_shape.xml
new file mode 100644
index 0000000000..da6049ea75
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_shape.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <string name="meters">
+ Meters
+ </string>
+ <string name="feet">
+ Feet
+ </string>
+ <string name="height">
+ Height:
+ </string>
+ <panel label="襯衫" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Body"/>
+ <accordion_tab name="shape_head_tab" title="Head"/>
+ <accordion_tab name="shape_eyes_tab" title="眼睛"/>
+ <accordion_tab name="shape_ears_tab" title="Ears"/>
+ <accordion_tab name="shape_nose_tab" title="Nose"/>
+ <accordion_tab name="shape_mouth_tab" title="Mouth"/>
+ <accordion_tab name="shape_chin_tab" title="Chin"/>
+ <accordion_tab name="shape_torso_tab" title="Torso"/>
+ <accordion_tab name="shape_legs_tab" title="Legs"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml
new file mode 100644
index 0000000000..44b93504d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Texture" name="Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="襯衫"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml b/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml
new file mode 100644
index 0000000000..d1ba9625f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Texture" name="Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="鞋子"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skin.xml b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
new file mode 100644
index 0000000000..22f0279060
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Head Tattoos" name="Head Tattoos" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Upper Tattoos" name="Upper Tattoos" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Lower Tattoos" name="Lower Tattoos" tool_tip="點擊以挑選圖片"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Skin Color"/>
+ <accordion_tab name="skin_face_tab" title="Face Detail"/>
+ <accordion_tab name="skin_makeup_tab" title="Makeup"/>
+ <accordion_tab name="skin_body_tab" title="Body Detail"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml
new file mode 100644
index 0000000000..303aa80e11
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Texture" name="Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="裙子"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_socks.xml b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml
new file mode 100644
index 0000000000..1e61a65788
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Texture" name="Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="襪子"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..d183e6897d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Head Tattoo" name="Head Tattoo" tool_tip="點擊以挑選圖片"/>
+ <texture_picker label="Upper Tattoo" name="Upper Tattoo" tool_tip="Click to choose a picture"/>
+ <texture_picker label="Lower Tattoo" name="Lower Tattoo" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml b/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml
new file mode 100644
index 0000000000..47d5db4fca
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Texture" name="Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="內褲"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..cbfdcaae8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Texture" name="Fabric" tool_tip="點擊以挑選圖片"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open Color Picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="內衣"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml b/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml
new file mode 100644
index 0000000000..d68767d4d2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Wearable" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Editing Shape
+ </string>
+ <string name="edit_skin_title">
+ Editing Skin
+ </string>
+ <string name="edit_hair_title">
+ Editing Hair
+ </string>
+ <string name="edit_eyes_title">
+ Editing Eyes
+ </string>
+ <string name="edit_shirt_title">
+ Editing Shirt
+ </string>
+ <string name="edit_pants_title">
+ Editing Pants
+ </string>
+ <string name="edit_shoes_title">
+ Editing Shoes
+ </string>
+ <string name="edit_socks_title">
+ Editing Socks
+ </string>
+ <string name="edit_jacket_title">
+ Editing Jacket
+ </string>
+ <string name="edit_skirt_title">
+ Editing Skirt
+ </string>
+ <string name="edit_gloves_title">
+ Editing Gloves
+ </string>
+ <string name="edit_undershirt_title">
+ Editing Undershirt
+ </string>
+ <string name="edit_underpants_title">
+ Editing Underpants
+ </string>
+ <string name="edit_alpha_title">
+ Editing Alpha Mask
+ </string>
+ <string name="edit_tattoo_title">
+ Editing Tattoo
+ </string>
+ <string name="edit_physics_title">
+ Editing Physics
+ </string>
+ <string name="shape_desc_text">
+ Shape:
+ </string>
+ <string name="skin_desc_text">
+ Skin:
+ </string>
+ <string name="hair_desc_text">
+ Hair:
+ </string>
+ <string name="eyes_desc_text">
+ Eyes:
+ </string>
+ <string name="shirt_desc_text">
+ 襯衫:
+ </string>
+ <string name="pants_desc_text">
+ 褲子:
+ </string>
+ <string name="shoes_desc_text">
+ 鞋子:
+ </string>
+ <string name="socks_desc_text">
+ 襪子:
+ </string>
+ <string name="jacket_desc_text">
+ 夾克:
+ </string>
+ <string name="skirt_desc_text">
+ 裙子:
+ </string>
+ <string name="gloves_desc_text">
+ 手套:
+ </string>
+ <string name="undershirt_desc_text">
+ 內衣:
+ </string>
+ <string name="underpants_desc_text">
+ 內褲:
+ </string>
+ <string name="alpha_desc_text">
+ Alpha Mask:
+ </string>
+ <string name="tattoo_desc_text">
+ 刺青:
+ </string>
+ <string name="physics_desc_text">
+ Physics:
+ </string>
+ <labeled_back_button label="儲存" name="back_btn" tool_tip="Return to Edit Outfit"/>
+ <text name="edit_wearable_title" value="Editing Shape"/>
+ <panel label="襯衫" name="wearable_type_panel">
+ <text name="description_text" value="Shape:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="男性" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Female" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="男性"/>
+ <icon name="female_icon" tool_tip="Female"/>
+ </panel>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="save_as_btn_lp">
+ <button label="另存" name="save_as_button"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="復原變更" name="revert_button"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_group_control_panel.xml
new file mode 100644
index 0000000000..9ba578c1a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Group Profile" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Call Group" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Leave Call" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Open Voice Controls" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_general.xml b/indra/newview/skins/default/xui/zh/panel_group_general.xml
new file mode 100644
index 0000000000..c65b139cb5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_general.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="一般" name="general_tab">
+ <panel.string name="help_text">
+ The General tab contains general information about this group, a list of members, general Group Preferences and member options.
+
+Hover your mouse over the options for more help.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ General group information has changed
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Retrieving member data
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="點擊以挑選圖片"/>
+ <text name="prepend_founded_by">
+ 創辦人:
+ </text>
+ <text name="join_cost_text">
+ Free
+ </text>
+ <button label="現在就加入!!" name="btn_join"/>
+ </panel>
+ <text_editor name="charter">
+ Group Charter
+ </text_editor>
+ <name_list name="visible_members">
+ <name_list.columns label="Member" name="name"/>
+ <name_list.columns label="Title" name="title"/>
+ <name_list.columns label="Status" name="status"/>
+ </name_list>
+ <text name="my_group_settngs_label">
+ 自己
+ </text>
+ <text name="active_title_label">
+ My title:
+ </text>
+ <combo_box name="active_title" tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active."/>
+ <check_box label="Receive group notices" name="receive_notices" tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you."/>
+ <check_box label="Show in my profile" name="list_groups_in_profile" tool_tip="Sets whether you want to show this group in your profile"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ Group
+ </text>
+ <check_box label="Anyone can join" name="open_enrollement" tool_tip="Sets whether this group allows new members to join without being invited."/>
+ <check_box label="Cost to join" name="check_enrollment_fee" tool_tip="Sets whether to require an enrollment fee to join the group"/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."/>
+ <combo_box name="group_mature_check" tool_tip="Sets whether your group contains information rated as Moderate">
+ <combo_item name="select_mature">
+ - Select maturity rating -
+ </combo_item>
+ <combo_box.item label="Moderate Content" name="mature"/>
+ <combo_box.item label="General Content" name="pg"/>
+ </combo_box>
+ <check_box initial_value="true" label="Show in search" name="show_in_group_list" tool_tip="Let people see this group in search results"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..90797e1473
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Group Profile" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ There are unsaved changes
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Do you want to save these changes?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Join (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Free
+ </panel.string>
+ <panel name="group_info_top">
+ <text_editor name="group_name" value="(載入中...)"/>
+ <line_editor label="Type your new group name here" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="一般"/>
+ <accordion_tab name="group_roles_tab" title="Roles"/>
+ <accordion_tab name="group_notices_tab" title="Notices"/>
+ <accordion_tab name="group_land_tab" title="Land/Assets"/>
+ </accordion>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="button_row_ls">
+ <layout_panel name="btn_chat_lp">
+ <button label="聊天" name="btn_chat"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Group Call" name="btn_call" tool_tip="Call this group"/>
+ </layout_panel>
+ <layout_panel name="btn_apply_lp">
+ <button label="儲存" label_selected="儲存" name="btn_apply"/>
+ <button label="Create Group" name="btn_create" tool_tip="Create a new Group"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_invite.xml b/indra/newview/skins/default/xui/zh/panel_group_invite.xml
new file mode 100644
index 0000000000..576760f747
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_invite.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Invite a Member" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Are you sure you want to invite new owner(s)? This action is permanent!
+ </panel.string>
+ <panel.string name="loading">
+ (載入中...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Some Residents you chose are already in the group, and so were not sent an invitation.
+ </panel.string>
+ <text name="help_text">
+ You can select multiple Residents to invite to your group. Click &apos;Open Resident Chooser&apos; to start.
+ </text>
+ <button label="Open Resident Chooser" name="add_button"/>
+ <name_list name="invitee_list" tool_tip="Hold the Ctrl key and click Resident names to multi-select"/>
+ <button label="Remove Selected from List" name="remove_button" tool_tip="Removes the Residents selected above from the invite list"/>
+ <text name="role_text">
+ Choose what Role to assign them to:
+ </text>
+ <combo_box name="role_name" tool_tip="Choose from the list of Roles you are allowed to assign members to"/>
+ <button label="Send Invitations" name="ok_button"/>
+ <button label="取銷" name="cancel_button"/>
+ <string name="GroupInvitation">
+ Group Invitation
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_land_money.xml b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
new file mode 100644
index 0000000000..08a5e711d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Land &amp; L$" name="land_money_tab">
+ <panel.string name="help_text">
+ A warning appears until the Total Land in Use is less than or = to the Total Contribution.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ You don&apos;t have permission to view group owned land
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ No entries
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ You don&apos;t have permission to view the group&apos;s accounting information.
+ </panel.string>
+ <panel.string name="loading_txt">
+ 載入中...
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Unable to set your land contribution
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="地段" name="name"/>
+ <scroll_list.columns label="地區" name="location"/>
+ <scroll_list.columns label="Type" name="type"/>
+ <scroll_list.columns label="Area" name="area"/>
+ <scroll_list.columns label="Hidden" name="hidden"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Total contribution:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="地圖" label_selected="地圖" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Total land in use:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Land available:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Your contribution:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max)
+ </text>
+ <text name="group_over_limit_text">
+ More land credits are needed to support land in use
+ </text>
+ <text name="group_money_heading">
+ Group L$
+ </text>
+ </panel>
+ <tab_container name="group_money_tab_container">
+ <panel label="PLANNING" name="group_money_planning_tab">
+ <text_editor name="group_money_planning_text">
+ 載入中...
+ </text_editor>
+ </panel>
+ <panel label="DETAILS" name="group_money_details_tab">
+ <text_editor name="group_money_details_text">
+ 載入中...
+ </text_editor>
+ <button name="earlier_details_button" tool_tip="Back"/>
+ <button name="later_details_button" tool_tip="Next"/>
+ </panel>
+ <panel label="SALES" name="group_money_sales_tab">
+ <text_editor name="group_money_sales_text">
+ 載入中...
+ </text_editor>
+ <button name="earlier_sales_button" tool_tip="Back"/>
+ <button name="later_sales_button" tool_tip="Next"/>
+ </panel>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_list_item.xml b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml
new file mode 100644
index 0000000000..147c4859c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="未知"/>
+ <button name="profile_btn" tool_tip="View profile"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_notices.xml b/indra/newview/skins/default/xui/zh/panel_group_notices.xml
new file mode 100644
index 0000000000..a007c86063
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_notices.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notices" name="notices_tab">
+ <panel.string name="help_text">
+ Notices let you send a message and an optionally attached item.
+Notices only go to group members in Roles with the ability to receive Notices.
+You can turn off Notices on the General tab.
+ </panel.string>
+ <panel.string name="no_notices_text">
+ There are no past notices
+ </panel.string>
+ <text name="lbl2">
+ Notices are kept for 14 days.
+Maximum 200 per group daily
+ </text>
+ <scroll_list name="notice_list">
+ <scroll_list.columns label="Subject" name="subject"/>
+ <scroll_list.columns label="From" name="from"/>
+ <scroll_list.columns label="Date" name="date"/>
+ </scroll_list>
+ <text name="notice_list_none_found">
+ None found
+ </text>
+ <button label="New Notice" name="create_new_notice" tool_tip="Create a new notice"/>
+ <button name="refresh_notices" tool_tip="Refresh list of notices"/>
+ <panel label="Create New Notice" name="panel_create_new_notice">
+ <text name="lbl">
+ Create a Notice
+ </text>
+ <text name="lbl3">
+ 主旨:
+ </text>
+ <text name="lbl4">
+ 訊息:
+ </text>
+ <text name="lbl5">
+ 附件:
+ </text>
+ <text name="string">
+ Drag and drop item here to attach it:
+ </text>
+ <button label="Inventory" name="open_inventory" tool_tip="Open Inventory"/>
+ <button name="remove_attachment" tool_tip="Remove attachment from your notification"/>
+ <button label="Send" label_selected="Send" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Drag an inventory item onto this target box to send it with this notice. You must have permission to copy and transfer the item in order to attach it."/>
+ </panel>
+ <panel label="View Past Notice" name="panel_view_past_notice">
+ <text name="lbl">
+ Archived Notice
+ </text>
+ <text name="lbl2">
+ To send a new notice, click the + button
+ </text>
+ <text name="lbl3">
+ Subject:
+ </text>
+ <text name="lbl4">
+ Message:
+ </text>
+ <button label="Open Attachment" name="open_attachment"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_notify.xml b/indra/newview/skins/default/xui/zh/panel_group_notify.xml
new file mode 100644
index 0000000000..803f34d5a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="header" name="header">
+ <text name="title" value="Sender Name / Group Name"/>
+ </panel>
+ <text_editor name="message" value="message"/>
+ <text name="attachment" value="Attachment"/>
+ <button label="確定" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_roles.xml b/indra/newview/skins/default/xui/zh/panel_group_roles.xml
new file mode 100644
index 0000000000..2b15f4813a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_roles.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Members &amp; Roles" name="roles_tab">
+ <panel.string name="default_needs_apply_text">
+ There are unsaved changes
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Do you want to save your changes?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="MEMBERS" name="members_sub_tab" tool_tip="Members">
+ <panel.string name="help_text">
+ You can add or remove Roles assigned to Members.
+Select multiple Members by holding the Ctrl key and
+clicking on their names.
+ </panel.string>
+ <panel.string name="donation_area">
+ [AREA] m²
+ </panel.string>
+ <filter_editor label="Filter Members" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="Member" name="name"/>
+ <name_list.columns label="Donation" name="donated"/>
+ <name_list.columns label="Status" name="online"/>
+ </name_list>
+ <button label="Invite" name="member_invite"/>
+ <button label="Eject" name="member_eject"/>
+ </panel>
+ <panel label="ROLES" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Roles have a title and an allowed list of Abilities
+that Members can perform. Members can belong to
+one or more Roles. A group can have up to 10 Roles,
+including the Everyone and Owner Roles.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can&apos;t be deleted.
+ </panel.string>
+ <filter_editor label="Filter Roles" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="Role" name="name"/>
+ <scroll_list.columns label="Title" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
+ </scroll_list>
+ <button label="New Role" name="role_create"/>
+ <button label="Delete Role" name="role_delete"/>
+ </panel>
+ <panel label="ABILITIES" name="actions_sub_tab" tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability.">
+ <panel.string name="help_text">
+ Abilities allow Members in Roles to do specific
+things in this group. There&apos;s a broad variety of Abilities.
+ </panel.string>
+ <filter_editor label="Filter Abilities" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Select an Ability to view more details"/>
+ </panel>
+ </tab_container>
+ <panel name="members_footer">
+ <text name="static">
+ Assigned Roles
+ </text>
+ <text name="static2">
+ Allowed Abilities
+ </text>
+ <scroll_list name="member_allowed_actions" tool_tip="For details of each allowed ability see the abilities tab"/>
+ </panel>
+ <panel name="roles_footer">
+ <text name="static">
+ Role Name
+ </text>
+ <text name="static3">
+ Role Title
+ </text>
+ <text name="static2">
+ Description
+ </text>
+ <text name="static4">
+ Assigned Members
+ </text>
+ <check_box label="Reveal members" name="role_visible_in_list" tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."/>
+ <text name="static5">
+ Allowed Abilities
+ </text>
+ <scroll_list name="role_allowed_actions" tool_tip="For details of each allowed ability see the abilities tab"/>
+ </panel>
+ <panel name="actions_footer">
+ <text_editor name="action_description">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
+ <text name="static2">
+ Roles with this ability
+ </text>
+ <text name="static3">
+ Members with this ability
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml
new file mode 100644
index 0000000000..8fdecad420
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profile" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="加為朋友" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleport" name="teleport_btn" tool_tip="Offer to teleport this person"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="分享" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Pay" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Call" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="End Call" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Voice Controls" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_instant_message.xml b/indra/newview/skins/default/xui/zh/panel_instant_message.xml
new file mode 100644
index 0000000000..cf9bc7fccb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_instant_message.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_inventory_item.xml b/indra/newview/skins/default/xui/zh/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_landmark_info.xml b/indra/newview/skins/default/xui/zh/panel_landmark_info.xml
new file mode 100644
index 0000000000..16119f9e2c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_landmark_info.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Create Landmark"/>
+ <string name="title_edit_landmark" value="Edit Landmark"/>
+ <string name="title_landmark" value="Landmark"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(未知)"/>
+ <string name="public" value="(公開)"/>
+ <string name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Back"/>
+ <text name="title" value="Place Profile"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="未知"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="擁有者:"/>
+ <text name="creator_label" value="創造者:"/>
+ <text name="created_label" value="Created:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Title:"/>
+ <text name="notes_label" value="My notes:"/>
+ <text name="folder_label" value="Landmark location:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_landmarks.xml b/indra/newview/skins/default/xui/zh/panel_landmarks.xml
new file mode 100644
index 0000000000..45f8edc355
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_landmarks.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Favorites bar"/>
+ <accordion_tab name="tab_landmarks" title="My Landmarks"/>
+ <accordion_tab name="tab_inventory" title="My Inventory"/>
+ <accordion_tab name="tab_library" title="Library"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="Show additional options"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Add new landmark"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Remove selected landmark"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml
index 9d094ff731..b227fbcfc8 100644
--- a/indra/newview/skins/default/xui/zh/panel_login.xml
+++ b/indra/newview/skins/default/xui/zh/panel_login.xml
@@ -1,29 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
<text name="username_text">
使用者名稱:
- </text>
+ </text>
+ <combo_box name="username_combo" tool_tip="使用者名稱是你註冊時所挑選的,像是 bobsmith12 或 Steller Sunshine"/>
<text name="password_text">
密碼:
</text>
- <check_box label="記住密碼" name="remember_check"/>
+ <check_box label="記住密碼:" name="remember_check"/>
<button label="登入" name="connect_btn"/>
<text name="mode_selection_text">
模式:
</text>
- <combo_box name="mode_combo" tool_tip="選擇一個登入模式">
- <combo_box.item label="基礎" name="Basic"/>
+ <combo_box name="mode_combo" tool_tip="請選擇你的模式。選用基本模式可以快速、簡單地探索與聊天;選用進階模式則可以使用更多功能。">
+ <combo_box.item label="基本" name="Basic"/>
<combo_box.item label="進階" name="Advanced"/>
</combo_box>
<text name="start_location_text">
開始地點:
</text>
<combo_box name="start_location_combo">
- <combo_box.item label="上一次的地點" name="MyLastLocation"/>
+ <combo_box.item label="我上一次位置" name="MyLastLocation"/>
<combo_box.item label="我的家" name="MyHome"/>
- <combo_box.item label="&lt;輸入區域名&gt;" name="Typeregionname"/>
+ <combo_box.item label="&lt; 請輸入地區名稱 &gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
<layout_panel name="links">
@@ -31,10 +38,10 @@
註冊
</text>
<text name="forgot_password_text">
- 忘記使用者名稱或密碼?
+ 忘記你的使用者名稱或密碼?
</text>
<text name="login_help">
- 如何登入?
+ 登入時需要幫助?
</text>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/zh/panel_main_inventory.xml b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
new file mode 100644
index 0000000000..2533b90203
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Things" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ Fetching [ITEM_COUNT] Items... [FILTER]
+ </panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] Items [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Items:
+ </text>
+ <filter_editor label="Filter Inventory" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="MY INVENTORY" name="All Items"/>
+ <recent_inventory_panel label="RECENT" name="Recent Items"/>
+ </tab_container>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="Show additional options"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Add new item"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Remove selected item"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_me.xml b/indra/newview/skins/default/xui/zh/panel_me.xml
new file mode 100644
index 0000000000..7a176a92c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="My Profile" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="MY PROFILE" name="panel_profile"/>
+ <panel label="MY PICKS" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml
new file mode 100644
index 0000000000..9e72dc9daf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="一般" name="Media Settings General">
+ <text name="home_label">
+ 首頁:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (This page does not pass the specified whitelist)
+ </text>
+ <line_editor name="home_url" tool_tip="The home page for this media source"/>
+ <text name="preview_label">
+ 預覽
+ </text>
+ <text name="current_url_label">
+ Current Page:
+ </text>
+ <text name="current_url" tool_tip="The current page for this media source" value=""/>
+ <button label="Reset" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Auto Loop" name="auto_loop"/>
+ <check_box initial_value="false" label="First Click Interacts" name="first_click_interact"/>
+ <check_box initial_value="false" label="Auto Zoom" name="auto_zoom"/>
+ <check_box initial_value="false" label="Auto Play Media" name="auto_play"/>
+ <text name="media_setting_note">
+ Note: Residents can override this setting
+ </text>
+ <check_box initial_value="false" label="Auto Scale Media on Face of Object" name="auto_scale"/>
+ <text name="size_label">
+ Size:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..b682ffda7d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="自訂" name="Media settings for controls">
+ <text name="controls_label">
+ Controls:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standard
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ Owner
+ </text>
+ <check_box initial_value="false" label="Allow Navigation &amp; Interactivity" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Show Control Bar" name="perms_owner_control"/>
+ <text name="group_label">
+ Group:
+ </text>
+ <check_box initial_value="false" label="Allow Navigation &amp; Interactivity" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Show Control Bar" name="perms_group_control"/>
+ <text name="anyone_label">
+ Anyone
+ </text>
+ <check_box initial_value="false" label="Allow Navigation &amp; Interactivity" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Show Control Bar" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml
new file mode 100644
index 0000000000..ef56c34b5c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Security" name="Media Settings Security">
+ <check_box initial_value="false" label="Only Allow Access to Specified URL patterns" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Entries that the home page fails against are marked:
+ </text>
+ <button label="Add" name="whitelist_add"/>
+ <button label="刪除" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Warning: the home page specified in the General tab fails to pass this whitelist. It has been disabled until a valid entry has been added.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_my_profile.xml b/indra/newview/skins/default/xui/zh/panel_my_profile.xml
new file mode 100644
index 0000000000..f36608efb5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_my_profile.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profile" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=en
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/account"/>
+ <string name="no_partner_text" value="無"/>
+ <string name="no_group_text" value="無"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="name_text_args">
+ [NAME]
+ </string>
+ <string name="display_name_text_args">
+ [DISPLAY_NAME]
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <text name="display_name_descr_text">
+ User name
+ </text>
+ <text name="name_descr_text">
+ Display Name
+ </text>
+ <button label="Profile" name="see_profile_btn" tool_tip="See profile for this avatar"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
new file mode 100644
index 0000000000..c4bcf605e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Go back to previous location"/>
+ <pull_button name="forward_btn" tool_tip="Go forward one location"/>
+ <button name="home_btn" tool_tip="Teleport to my home location"/>
+ <location_input label="Location" name="location_combo"/>
+ <search_combo_box label="Search" name="search_combo_box" tool_tip="Search">
+ <combo_editor label="Search [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!">
+ <label name="favorites_bar_label" tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!">
+ Favorites Bar
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Show more of My Favorites"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..724cd54bf1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <line_editor label="點擊此處開始聊天。" name="chat_box" tool_tip="Press Enter to say, Ctrl+Enter to shout"/>
+ <button name="show_nearby_chat" tool_tip="顯示 / 隱藏 附近聊天紀錄"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_media.xml b/indra/newview/skins/default/xui/zh/panel_nearby_media.xml
new file mode 100644
index 0000000000..0b8a7a5f42
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_nearby_media.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld media items)
+ </string>
+ <string name="empty_item_text">
+ &lt;empty&gt;
+ </string>
+ <string name="parcel_media_name">
+ 地段串流媒體
+ </string>
+ <string name="parcel_audio_name">
+ 地段串流音樂
+ </string>
+ <string name="playing_suffix">
+ (播放中)
+ </string>
+ <panel name="minimized_controls">
+ <button label="全部停止" name="all_nearby_media_disable_btn" tool_tip="關閉附近全部的媒體"/>
+ <button label="全部開始" name="all_nearby_media_enable_btn" tool_tip="開啟附近全部的媒體"/>
+ <button name="open_prefs_btn" tool_tip="Bring up media prefs"/>
+ <button label="更多 &gt;&gt;" label_selected="&lt;&lt; 更少" name="more_btn" tool_tip="進階控制"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <text name="nearby_media_title">
+ 附近媒體
+ </text>
+ <text name="show_text">
+ 顯示:
+ </text>
+ <combo_box name="show_combo">
+ <combo_box.item label="全部" name="All"/>
+ <combo_box.item label="In this Parcel" name="WithinParcel"/>
+ <combo_box.item label="Outside this Parcel" name="OutsideParcel"/>
+ <combo_box.item label="On other Avatars" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Proximity" name="media_proximity"/>
+ <scroll_list.columns label="Visible" name="media_visibility"/>
+ <scroll_list.columns label="Class" name="media_class"/>
+ <scroll_list.columns label="名稱" name="media_name"/>
+ <scroll_list.columns label="除錯" name="media_debug"/>
+ </scroll_list>
+ <panel name="media_controls_panel">
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Stop selected media"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Play selected media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pause selected media"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Audio volume for selected media"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Mute audio on selected media"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Zoom into selected media"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Zoom back from selected media"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_notes.xml b/indra/newview/skins/default/xui/zh/panel_notes.xml
new file mode 100644
index 0000000000..12182b521e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_notes.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notes &amp; Privacy" name="panel_notes">
+ <layout_stack name="layout">
+ <layout_panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="My private notes:"/>
+ <text name="status_message2" value="Allow this person to:"/>
+ <check_box label="See my online status" name="status_check"/>
+ <check_box label="See me on the map" name="map_check"/>
+ <check_box label="Edit, delete or take my objects" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="notes_buttons_panel">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="add_friend_btn_lp">
+ <button label="加為朋友" name="add_friend" tool_tip="Offer friendship to the Resident"/>
+ </layout_panel>
+ <layout_panel name="im_btn_lp">
+ <button label="IM" name="im" tool_tip="Open instant message session"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Call" name="call" tool_tip="Call this Resident"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="地圖" name="show_on_map_btn" tool_tip="Show the Resident on the map"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="Teleport" name="teleport" tool_tip="Offer teleport"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml b/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml
new file mode 100644
index 0000000000..bdbc89f71c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="message"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Submit" name="btn_submit"/>
+ <button label="忽視" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_online_status_toast.xml b/indra/newview/skins/default/xui/zh/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml b/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml
new file mode 100644
index 0000000000..97e423b8cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel name="outfit_edit">
+ <string name="No Outfit" value="No Outfit"/>
+ <string name="unsaved_changes" value="Unsaved Changes"/>
+ <string name="now_editing" value="Now Editing"/>
+ <panel.string name="not_available">
+ (N\A)
+ </panel.string>
+ <panel.string name="unknown">
+ (未知)
+ </panel.string>
+ <string name="Filter.All" value="全部"/>
+ <string name="Filter.Clothes/Body" value="Clothes/Body"/>
+ <string name="Filter.Objects" value="Objects"/>
+ <string name="Filter.Clothing" value="Clothing"/>
+ <string name="Filter.Bodyparts" value="Body parts"/>
+ <string name="replace_body_part" value="Click to replace your existing shape"/>
+ <text name="title" value="Edit Outfit"/>
+ <panel name="header_panel">
+ <panel name="outfit_name_and_status">
+ <text name="status" value="Now editing..."/>
+ <text name="curr_outfit_name" value="[Current Outfit]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Add More..." name="show_add_wearables_btn" tool_tip="Open/Close"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Filter Inventory Wearables" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <button label="Wear Item" name="plus_btn"/>
+ </layout_panel>
+ </layout_stack>
+ <panel name="no_add_wearables_button_bar">
+ <button name="shop_btn_1" tool_tip="Visit the SL Marketplace. You can also select something you are wearing, then click here to see more things like it"/>
+ </panel>
+ <panel name="add_wearables_button_bar">
+ <button name="shop_btn_2" tool_tip="Visit the SL Marketplace. You can also select something you are wearing, then click here to see more things like it"/>
+ </panel>
+ <panel name="save_revert_button_bar">
+ <layout_stack name="button_bar_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="儲存" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="復原變更" name="revert_btn" tool_tip="Revert to last saved version"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..486b81e024
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Things" name="Outfits">
+ <panel.string name="wear_outfit_tooltip">
+ Wear selected outfit
+ </panel.string>
+ <panel.string name="wear_items_tooltip">
+ Wear selected items
+ </panel.string>
+ <tab_container name="appearance_tabs">
+ <panel label="MY OUTFITS" name="outfitslist_tab"/>
+ <panel label="WEARING" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="另存" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="wear_btn_lp">
+ <button label="Wear" name="wear_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..af417a79ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Replace Current Outfit" name="wear"/>
+ <menu_item_call label="Remove From Current Outfit" name="remove"/>
+ <menu_item_call label="更名" name="rename"/>
+ <menu_item_call label="Remove Link" name="remove_link"/>
+ <menu_item_call label="Delete Outfit" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_list.xml b/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
new file mode 100644
index 0000000000..36770c52c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="Show additional options"/>
+ <button name="trash_btn" tool_tip="Delete selected outfit"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml
new file mode 100644
index 0000000000..39a9bcb848
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Wearing">
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="Show additional options"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml
new file mode 100644
index 0000000000..49c36614db
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="People" name="people_panel">
+ <string name="no_recent_people" value="No recent people. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]."/>
+ <string name="no_filtered_recent_people" value="Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_one_near" value="No one nearby. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]."/>
+ <string name="no_one_filtered_near" value="Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_friends_online" value="No friends online"/>
+ <string name="no_friends" value="No friends"/>
+ <string name="no_friends_msg">
+ Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend.
+Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string name="people_filter_label" value="Filter People"/>
+ <string name="groups_filter_label" value="Filter Groups"/>
+ <string name="no_filtered_groups_msg" value="Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
+ <string name="no_groups_msg" value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Double-click to open Map, shift-drag to pan)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Double-click to teleport, shift-drag to pan)"/>
+ <filter_editor label="Filter" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="NEARBY" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="Options"/>
+ <button name="add_friend_btn" tool_tip="Add selected Resident to your friends List"/>
+ </panel>
+ </panel>
+ <panel label="MY FRIENDS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="上線"/>
+ <accordion_tab name="tab_all" title="全部"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="Show additional options"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Offer friendship to a Resident"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Remove selected person from your Friends list"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="MY GROUPS" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="Options"/>
+ <button name="plus_btn" tool_tip="Join group/Create new group"/>
+ <button name="activate_btn" tool_tip="Activate selected group"/>
+ </panel>
+ </panel>
+ <panel label="RECENT" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="Options"/>
+ <button name="add_friend_btn" tool_tip="Add selected Resident to your friends List"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Profile" name="view_profile_btn" tool_tip="Show picture, groups, and other Residents information"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Open instant message session"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Call" name="call_btn" tool_tip="Call this Resident"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="分享" name="share_btn" tool_tip="Share an inventory item"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Teleport" name="teleport_btn" tool_tip="Offer teleport"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Group Profile" name="group_info_btn" tool_tip="Show group information"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Group Chat" name="chat_btn" tool_tip="Open chat session"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Group Call" name="group_call_btn" tool_tip="Call this group"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_pick_info.xml b/indra/newview/skins/default/xui/zh/panel_pick_info.xml
new file mode 100644
index 0000000000..75ecdb99a5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_pick_info.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Pick Info"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="pick_name" value="[name]"/>
+ <text_editor name="pick_location" value="[loading...]"/>
+ <text_editor name="pick_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Teleport" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="地圖" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="編輯" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_picks.xml b/indra/newview/skins/default/xui/zh/panel_picks.xml
new file mode 100644
index 0000000000..28a47ed003
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_picks.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Picks" name="panel_picks">
+ <string name="no_picks" value="No Picks"/>
+ <string name="no_classifieds" value="No Classifieds"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Picks"/>
+ <accordion_tab name="tab_classifieds" title="Classifieds"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <layout_stack name="edit_panel_ls">
+ <layout_panel name="gear_menu_btn">
+ <button name="new_btn" tool_tip="Create a new pick or classified at the current location"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ <panel name="buttons_cucks">
+ <layout_stack name="buttons_cucks_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="資訊" name="info_btn" tool_tip="Show pick information"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="Teleport" name="teleport_btn" tool_tip="Teleport to the corresponding area"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="地圖" name="show_on_map_btn" tool_tip="Show the corresponding area on the World Map"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_place_profile.xml b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
new file mode 100644
index 0000000000..cef56eb907
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="On"/>
+ <string name="off" value="Off"/>
+ <string name="anyone" value="Anyone"/>
+ <string name="available" value="available"/>
+ <string name="allocated" value="allocated"/>
+ <string name="title_place" value="Place Profile"/>
+ <string name="title_teleport_history" value="Teleport History"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(未知)"/>
+ <string name="public" value="(公開)"/>
+ <string name="none_text" value="(無)"/>
+ <string name="sale_pending_text" value="(Sale Pending)"/>
+ <string name="group_owned_text" value="(Group Owned)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="全部居民"/>
+ <string name="group_text" value="Group"/>
+ <string name="can_resell">
+ Purchased land in this region may be resold.
+ </string>
+ <string name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </string>
+ <string name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </string>
+ <string name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </string>
+ <string name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Back"/>
+ <text name="title" value="Place Profile"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="擁有者:"/>
+ <text name="owner_value" value="Alex Superduperlongenamenton"/>
+ <text name="maturity_value" value="未知"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="地段">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="分級:"/>
+ <text name="rating_value" value="未知"/>
+ <text name="voice_label" value="Voice:"/>
+ <text name="voice_value" value="On"/>
+ <text name="fly_label" value="Fly:"/>
+ <text name="fly_value" value="On"/>
+ <text name="push_label" value="Push:"/>
+ <text name="push_value" value="Off"/>
+ <text name="build_label" value="Build:"/>
+ <text name="build_value" value="On"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <text name="scripts_value" value="On"/>
+ <text name="damage_label" value="Damage:"/>
+ <text name="damage_value" value="Off"/>
+ <button label="關於土地" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="地區">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="地區:"/>
+ <text name="region_name" value="Mooseland"/>
+ <text name="region_type_label" value="類型:"/>
+ <text name="region_type" value="Moose"/>
+ <text name="region_rating_label" value="分級:"/>
+ <text name="region_rating" value="Adult"/>
+ <text name="region_owner_label" value="擁有者:"/>
+ <text name="region_owner" value="moose Van Moose extra long name moose"/>
+ <text name="region_group_label" value="Group:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button label="地區 / 領地" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="領地">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="領地:"/>
+ <text name="estate_rating_label" value="分級:"/>
+ <text name="estate_owner_label" value="擁有者:"/>
+ <text name="estate_owner" value="Testing owner name length with long name"/>
+ <text name="covenant_label" value="契約:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="出售">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="價格:"/>
+ <text name="area_label" value="面積:"/>
+ <text name="traffic_label" value="流量:"/>
+ <text name="primitives_label" value="Primitives:"/>
+ <text name="parcel_scripts_label" value="Scripts:"/>
+ <text name="terraform_limits_label" value="Terraform limits:"/>
+ <text name="subdivide_label" value="Subdivide/Join ability:"/>
+ <text name="resale_label" value="ReSale ability:"/>
+ <text name="sale_to_label" value="出售給:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_places.xml b/indra/newview/skins/default/xui/zh/panel_places.xml
new file mode 100644
index 0000000000..9a038c8b04
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_places.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Places" name="places panel">
+ <string name="landmarks_tab_title" value="MY LANDMARKS"/>
+ <string name="teleport_history_tab_title" value="TELEPORT HISTORY"/>
+ <filter_editor label="Filter My Places" name="Filter"/>
+ <panel name="button_panel">
+ <layout_stack name="bottom_bar_ls0">
+ <layout_panel name="lp1">
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="teleport_btn_lp">
+ <button label="Teleport" name="teleport_btn" tool_tip="Teleport to the selected area"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="地圖" name="map_btn" tool_tip="Show the corresponding area on the World Map"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="lp2">
+ <layout_stack name="bottom_bar_ls3">
+ <layout_panel name="edit_btn_lp">
+ <button label="編輯" name="edit_btn" tool_tip="Edit landmark information"/>
+ </layout_panel>
+ <layout_panel name="overflow_btn_lp">
+ <menu_button name="overflow_btn" tool_tip="Show additional options"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls3">
+ <layout_panel name="profile_btn_lp">
+ <button label="Profile" name="profile_btn" tool_tip="Show place profile"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_close_ls3">
+ <layout_panel name="close_btn_lp">
+ <button label="關閉" name="close_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls2">
+ <layout_panel name="save_btn_lp">
+ <button label="儲存" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="cancel_btn_lp">
+ <button label="取銷" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
new file mode 100644
index 0000000000..ad137e9dd4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="進階" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <text name="UI Size:">
+ 使用者界面尺寸:
+ </text>
+ <check_box label="顯示腳本錯誤訊息於:" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="附近的聊天中" name="0"/>
+ <radio_item label="分開的試窗中" name="1"/>
+ </radio_group>
+ <check_box label="允許同時執行多個瀏覽器" name="allow_multiple_viewer_check"/>
+ <check_box label="登入時顯示網格選擇" name="show_grid_selection_check"/>
+ <check_box label="顯示進階選單" name="show_advanced_menu_check"/>
+ <check_box label="顯示開發選單" name="show_develop_menu_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml
new file mode 100644
index 0000000000..94eb3c1389
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="突顯式視窗" name="popups">
+ <text name="tell_me_label">
+ 告訴我:
+ </text>
+ <check_box label="當我花費或取得 L$" name="notify_money_change_checkbox"/>
+ <check_box label="當我的朋友上線或離線" name="friends_online_notify_checkbox"/>
+ <text name="show_label">
+ 總是顯示:
+ </text>
+ <text name="dont_show_label">
+ 絕不顯示:
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
new file mode 100644
index 0000000000..cad8d75470
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="文字聊天" name="chat">
+ <text name="font_size">
+ 字型尺寸:
+ </text>
+ <radio_group name="chat_font_size">
+ <radio_item label="小" name="radio" value="0"/>
+ <radio_item label="中" name="radio2" value="1"/>
+ <radio_item label="大" name="radio3" value="2"/>
+ </radio_group>
+ <check_box initial_value="true" label="聊天時播放打字動作" name="play_typing_animation"/>
+ <check_box label="Email me IMs when I&apos;m offline" name="send_im_to_email"/>
+ <check_box label="Enable plain text IM and chat history" name="plain_text_chat_history"/>
+ <check_box label="聊天泡泡" name="bubble_text_chat"/>
+ <text name="show_ims_in_label">
+ Show IMs in:
+ </text>
+ <text name="requires_restart_label">
+ (須重新啟動)
+ </text>
+ <radio_group name="chat_window" tool_tip="Show your Instant Messages in separate floaters, or in one floater with many tabs (Requires restart)">
+ <radio_item label="分開視窗" name="radio" value="0"/>
+ <radio_item label="頁籤" name="radio2" value="1"/>
+ </radio_group>
+ <text name="disable_toast_label">
+ Enable incoming chat popups:
+ </text>
+ <check_box label="Group Chats" name="EnableGroupChatPopups" tool_tip="Check to see popups when a Group Chat message arrives"/>
+ <check_box label="IM Chats" name="EnableIMChatPopups" tool_tip="Check to see popups when an instant message arrives"/>
+ <spinner label="Nearby chat toasts life time:" name="nearby_toasts_lifetime"/>
+ <spinner label="Nearby chat toasts fading time:" name="nearby_toasts_fadingtime"/>
+ <text name="translate_chb_label">
+ Use machine translation while chatting (powered by Google)
+ </text>
+ <text name="translate_language_text">
+ Translate chat into:
+ </text>
+ <combo_box name="translate_language_combobox">
+ <combo_box.item label="系統預設" name="System Default Language"/>
+ <combo_box.item label="English" name="English"/>
+ <combo_box.item label="Dansk (Danish)" name="Danish"/>
+ <combo_box.item label="Deutsch (German)" name="German"/>
+ <combo_box.item label="Español (Spanish)" name="Spanish"/>
+ <combo_box.item label="Français (French)" name="French"/>
+ <combo_box.item label="Italiano (Italian)" name="Italian"/>
+ <combo_box.item label="Magyar (Hungarian)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Dutch)" name="Dutch"/>
+ <combo_box.item label="Polski (Polish)" name="Polish"/>
+ <combo_box.item label="Português (Portuguese)" name="Portugese"/>
+ <combo_box.item label="Русский (Russian)" name="Russian"/>
+ <combo_box.item label="Türkçe (Turkish)" name="Turkish"/>
+ <combo_box.item label="Українська (Ukrainian)" name="Ukrainian"/>
+ <combo_box.item label="中文 (简体) (Chinese)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japanese)" name="Japanese"/>
+ <combo_box.item label="한국어 (Korean)" name="Korean"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml b/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
new file mode 100644
index 0000000000..261622d136
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="顏色" name="colors_panel">
+ <text name="effects_color_textbox">
+ 我的效果(選擇指標):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="點擊以開啟顏色挑選器"/>
+ <text name="font_colors">
+ 聊天字型顏色:
+ </text>
+ <text name="text_box1">
+ 自己
+ </text>
+ <text name="text_box2">
+ 其他人
+ </text>
+ <text name="text_box3">
+ 物件
+ </text>
+ <text name="text_box4">
+ 系統
+ </text>
+ <text name="text_box5">
+ 錯誤
+ </text>
+ <text name="text_box7">
+ 擁有者
+ </text>
+ <text name="text_box9">
+ URLs
+ </text>
+ <text name="bubble_chat">
+ 名稱標籤背景色(亦會影響聊天泡泡):
+ </text>
+ <color_swatch name="background" tool_tip="挑選名稱標籤顏色"/>
+ <slider label="不透明度:" name="bubble_chat_opacity" tool_tip="挑選名稱標籤不透明度"/>
+ <text name="floater_opacity">
+ Floater Opacity:
+ </text>
+ <slider label="啟用:" name="active"/>
+ <slider label="停用:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
new file mode 100644
index 0000000000..32b3508af5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="一般" name="general_panel">
+ <text name="language_textbox">
+ 語言:
+ </text>
+ <combo_box name="language_combobox">
+ <combo_box.item label="系統預設" name="System Default Language"/>
+ <combo_box.item label="英語" name="English"/>
+ <combo_box.item label="Dansk (Danish) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (German) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (Spanish) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (French) - Beta" name="French"/>
+ <combo_box.item label="Italiano (Italian) - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Dutch) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polish) - Beta" name="Polish"/>
+ <combo_box.item label="Português (Portuguese) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japanese) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Requires restart)
+ </text>
+ <text name="maturity_desired_prompt">
+ I want to access content rated:
+ </text>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="General, Moderate, Adult" name="Desired_Adult"/>
+ <combo_box.item label="General and Moderate" name="Desired_Mature"/>
+ <combo_box.item label="一般" name="Desired_PG"/>
+ </combo_box>
+ <text name="start_location_textbox">
+ 開始位置:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="我上一次位置" name="MyLastLocation"/>
+ <combo_box.item label="我的家" name="MyHome"/>
+ </combo_box>
+ <check_box initial_value="true" label="登入時顯示" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Name tags:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Off" name="radio" value="0"/>
+ <radio_item label="On" name="radio2" value="1"/>
+ <radio_item label="Show briefly" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="My name" name="show_my_name_checkbox1"/>
+ <check_box label="Usernames" name="show_slids" tool_tip="Show username, like bobsmith123"/>
+ <check_box label="Group titles" name="show_all_title_checkbox1" tool_tip="Show group titles, like Officer or Member"/>
+ <check_box label="Highlight friends" name="show_friends" tool_tip="Highlight the name tags of your friends"/>
+ <check_box label="View Display Names" name="display_names_check" tool_tip="Check to use display names in chat, IM, name tags, etc."/>
+ <text name="inworld_typing_rg_label">
+ Pressing letter keys:
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Starts local chat" name="radio_start_chat" value="1"/>
+ <radio_item label="Affects movement (i.e. WASD)" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ Away timeout:
+ </text>
+ <combo_box label="Away timeout:" name="afk">
+ <combo_box.item label="2 minutes" name="item0"/>
+ <combo_box.item label="5 minutes" name="item1"/>
+ <combo_box.item label="10 minutes" name="item2"/>
+ <combo_box.item label="30 minutes" name="item3"/>
+ <combo_box.item label="never" name="item4"/>
+ </combo_box>
+ <text name="text_box3">
+ 忙碌模式回應:
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
new file mode 100644
index 0000000000..642edff336
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Graphics" name="Display panel">
+ <text name="QualitySpeed">
+ Quality and speed:
+ </text>
+ <text name="FasterText">
+ Faster
+ </text>
+ <text name="BetterText">
+ Better
+ </text>
+ <text name="ShadersPrefText">
+ Low
+ </text>
+ <text name="ShadersPrefText2">
+ Mid
+ </text>
+ <text name="ShadersPrefText3">
+ High
+ </text>
+ <text name="ShadersPrefText4">
+ Ultra
+ </text>
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Shaders:
+ </text>
+ <check_box initial_value="true" label="Transparent Water" name="TransparentWater"/>
+ <check_box initial_value="true" label="Bump mapping and shiny" name="BumpShiny"/>
+ <check_box initial_value="true" label="Basic shaders" name="BasicShaders" tool_tip="Disabling this option may prevent some graphics card drivers from crashing"/>
+ <check_box initial_value="true" label="Atmospheric shaders" name="WindLightUseAtmosShaders"/>
+ <text name="reflection_label">
+ Water Reflections:
+ </text>
+ <combo_box name="Reflections">
+ <combo_box.item label="Minimal" name="0"/>
+ <combo_box.item label="Terrain and trees" name="1"/>
+ <combo_box.item label="All static objects" name="2"/>
+ <combo_box.item label="All avatars and objects" name="3"/>
+ <combo_box.item label="Everything" name="4"/>
+ </combo_box>
+ <slider label="Avatar Physics:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Low
+ </text>
+ <slider label="Draw distance:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Max. particle count:" name="MaxParticleCount"/>
+ <slider label="Max. # of non-impostor avatars:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Post process quality:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Mesh detail:
+ </text>
+ <slider label="Objects:" name="ObjectMeshDetail"/>
+ <slider label="Flexiprims:" name="FlexibleMeshDetail"/>
+ <slider label="Trees:" name="TreeMeshDetail"/>
+ <slider label="Avatars:" name="AvatarMeshDetail"/>
+ <slider label="Terrain:" name="TerrainMeshDetail"/>
+ <slider label="Sky:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Low
+ </text>
+ <text name="ObjectMeshDetailText">
+ Low
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Low
+ </text>
+ <text name="TreeMeshDetailText">
+ Low
+ </text>
+ <text name="AvatarMeshDetailText">
+ Low
+ </text>
+ <text name="TerrainMeshDetailText">
+ Low
+ </text>
+ <text name="SkyMeshDetailText">
+ Low
+ </text>
+ <text name="AvatarRenderingText">
+ Avatar Rendering:
+ </text>
+ <check_box initial_value="true" label="Avatar impostors" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Hardware skinning" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Avatar cloth" name="AvatarCloth"/>
+ <text name="TerrainDetailText">
+ Terrain detail:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Low" name="0"/>
+ <radio_item label="High" name="2"/>
+ </radio_group>
+ --&gt;
+ </panel>
+ <button label="套用" label_selected="套用" name="Apply"/>
+ <button label="Reset" name="Defaults"/>
+ <button label="進階" name="Advanced"/>
+ <button label="硬體" label_selected="硬體" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
new file mode 100644
index 0000000000..acd0a54ebf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="移動" name="move_panel">
+ <slider label="視角" name="camera_fov"/>
+ <slider label="距離" name="camera_offset_scale"/>
+ <text name="heading2">
+ 自動位移:
+ </text>
+ <check_box label="建造 / 編輯" name="edit_camera_movement" tool_tip="Use automatic camera positioning when entering and exiting edit mode"/>
+ <check_box label="編輯外觀" name="appearance_camera_movement" tool_tip="Use automatic camera positioning while in edit mode"/>
+ <check_box initial_value="true" label="側邊欄" name="appearance_sidebar_positioning" tool_tip="Use automatic camera positioning for sidebar"/>
+ <check_box label="將我顯示於第一人稱視角中" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Mouselook mouse sensitivity:
+ </text>
+ <check_box label="反轉" name="invert_mouse"/>
+ <check_box label="Arrow keys always move me" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Tap-tap-hold to run" name="tap_tap_hold_to_run"/>
+ <check_box label="Double-Click to:" name="double_click_chkbox"/>
+ <radio_group name="double_click_action">
+ <radio_item label="Teleport" name="radio_teleport"/>
+ <radio_item label="Auto-pilot" name="radio_autopilot"/>
+ </radio_group>
+ <button label="其他設備" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
new file mode 100644
index 0000000000..847798e7a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="溝通" name="im">
+ <panel.string name="log_in_to_change">
+ log in to change
+ </panel.string>
+ <button label="清除歷史紀錄" name="clear_cache" tool_tip="清除登入圖像、最後位置、瞬間傳送紀錄、網頁及材質快取"/>
+ <text name="cache_size_label_l">
+ (位置、圖像、網頁、搜尋的歷使紀錄)
+ </text>
+ <check_box label="將我顯示在搜尋的結果中" name="online_searchresults"/>
+ <check_box label="只有我的朋友和社團知道我在線上" name="online_visibility"/>
+ <check_box label="Only friends and groups can call or IM me" name="voice_call_friends_only_check"/>
+ <check_box label="Switch off microphone when ending calls" name="auto_disengage_mic_check"/>
+ <check_box label="Show my Favorite Landmarks at Login (via &apos;Start At&apos; drop-down menu)" name="favorites_on_login_check"/>
+ <text name="Logs:">
+ 聊天紀錄:
+ </text>
+ <check_box label="儲存附近的聊天紀錄到我的電腦" name="log_nearby_chat"/>
+ <check_box label="Save IM logs on my computer" name="log_instant_messages"/>
+ <check_box label="添加時間戳記到聊天紀錄的每一行" name="show_timestamps_check_im"/>
+ <check_box label="添加時間戳記到紀錄檔檔名。" name="logfile_name_datestamp"/>
+ <text name="log_path_desc">
+ 位置紀錄:
+ </text>
+ <button label="瀏覽" label_selected="瀏覽" name="log_path_button"/>
+ <button label="封鎖清單" name="block_list"/>
+ <text name="block_list_label">
+ (你所封鎖的人 及/或 物件)
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
new file mode 100644
index 0000000000..e7a934c5cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="設定" name="Input panel">
+ <text name="Network:">
+ 網路:
+ </text>
+ <text name="Maximum bandwidth">
+ 最大頻寬
+ </text>
+ <text name="text_box2">
+ kbps
+ </text>
+ <check_box label="自訂埠" name="connection_port_enabled"/>
+ <spinner label="埠號:" name="connection_port"/>
+ <text name="cache_size_label_l">
+ 快取尺寸
+ </text>
+ <text name="text_box5">
+ MB
+ </text>
+ <text name="Cache location">
+ 快取位置:
+ </text>
+ <button label="瀏覽" label_selected="瀏覽" name="set_cache"/>
+ <button label="重設" label_selected="重設" name="reset_cache"/>
+ <text name="Web:">
+ 網頁:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="使用我的網頁瀏覽器(例如 IE, Firefox, Safari)" name="external" tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen." value="1"/>
+ <radio_item label="使用內建網頁瀏覽器" name="internal" tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." value=""/>
+ </radio_group>
+ <check_box initial_value="true" label="啟用外掛" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="接受 cookies" name="cookies_enabled"/>
+ <check_box initial_value="true" label="啟用 Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="啟用媒體瀏覽的突顯式視窗" name="media_popup_enabled"/>
+ <check_box initial_value="false" label="啟用網頁代理伺服器" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ 代理伺服器位置:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="The name or IP address of the proxy you would like to use"/>
+ <spinner label="埠號:" name="web_proxy_port"/>
+ <text name="Software updates:">
+ 軟體更新:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="自動安裝" name="Install_automatically"/>
+ <combo_box.item label="手動下載及安裝" name="Install_manual"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
new file mode 100644
index 0000000000..0c6d8386e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="聲音" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Middle Mouse
+ </panel.string>
+ <slider label="主音量" name="System Volume"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ 最小化時靜音
+ </text>
+ <slider label="按鍵音" name="UI Volume"/>
+ <slider label="Ambient" name="Wind Volume"/>
+ <slider label="Sound Effects" name="SFX Volume"/>
+ <slider label="Streaming music" name="Music Volume"/>
+ <check_box label="Enabled" name="enable_music"/>
+ <slider label="Media" name="Media Volume"/>
+ <check_box label="Enabled" name="enable_media"/>
+ <slider label="Voice Chat" name="Voice Volume"/>
+ <check_box label="Enabled" name="enable_voice_check"/>
+ <check_box label="Allow Media to auto-play" name="media_auto_play_btn" tool_tip="Check this to let media auto-play if it wants" value="true"/>
+ <check_box label="Play media attached to other avatars" name="media_show_on_others_btn" tool_tip="Uncheck this to hide media attached to other avatars nearby" value="true"/>
+ <text name="voice_chat_settings">
+ Voice Chat Settings
+ </text>
+ <text name="Listen from">
+ Listen from:
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="Camera position" name="0"/>
+ <radio_item label="Avatar position" name="1"/>
+ </radio_group>
+ <check_box label="Move avatar lips when speaking" name="enable_lip_sync"/>
+ <check_box label="Toggle speak on/off when I press:" name="push_to_talk_toggle_check" tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/>
+ <line_editor label="Push-to-Speak trigger" name="modifier_combo"/>
+ <button label="Set Key" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Reset to Middle Mouse Button"/>
+ <button label="輸入 / 輸出設備" name="device_settings_btn"/>
+ <panel label="設備設定" name="device_settings_panel">
+ <panel.string name="default_text">
+ 預設
+ </panel.string>
+ <panel.string name="default system device">
+ 預設系統設備
+ </panel.string>
+ <panel.string name="no device">
+ 無設備
+ </panel.string>
+ <text name="Input">
+ 輸入
+ </text>
+ <text name="My volume label">
+ My volume:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Change the volume using this slider"/>
+ <text name="wait_text">
+ Please wait
+ </text>
+ <text name="Output">
+ 輸出
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..71de9f861a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_near_padding">
+ 1.0
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="zoom_far_padding">
+ 1.5
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <layout_panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Media is Loading"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Navigate back"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Navigate forward"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Home page"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Stop media"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Reload"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Stop loading"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Play media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pause media"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="Media URL"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="White List enabled"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Movie play progress"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Step back"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Step forward"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Mute This Media"/>
+ <slider name="volume_slider" tool_tip="Media Volume"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Zoom into media"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Zoom Back"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Open URL in browser"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_profile.xml b/indra/newview/skins/default/xui/zh/panel_profile.xml
new file mode 100644
index 0000000000..88cd3a0e16
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_profile.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profile" name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=en
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/account"/>
+ <string name="no_partner_text" value="無"/>
+ <string name="no_group_text" value="無"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="name_text_args">
+ [NAME]
+ </string>
+ <string name="display_name_text_args">
+ [DISPLAY_NAME]
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Real World:"/>
+ </panel>
+ <text name="title_member_text" value="Resident Since:"/>
+ <text name="title_acc_status_text" value="Account Status:"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(retrieving)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Groups:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="layout_verb_buttons">
+ <layout_panel name="profile_buttons_panel">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="add_friend_btn_lp">
+ <button label="加為朋友" name="add_friend" tool_tip="Offer friendship to the Resident"/>
+ </layout_panel>
+ <layout_panel name="im_btn_lp">
+ <button label="IM" name="im" tool_tip="Open instant message session"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Call" name="call" tool_tip="Call this Resident"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Teleport" name="teleport" tool_tip="Offer teleport"/>
+ </layout_panel>
+ <layout_panel name="overflow_btn_lp">
+ <menu_button label="▼" name="overflow_btn" tool_tip="Pay money to or share inventory with the Resident"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_profile_view.xml b/indra/newview/skins/default/xui/zh/panel_profile_view.xml
new file mode 100644
index 0000000000..0f30d5dcbe
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_profile_view.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Online
+ </string>
+ <string name="status_offline">
+ Offline
+ </string>
+ <text name="display_name_label" value="Display Name:"/>
+ <text name="solo_username_label" value="Username:"/>
+ <text name="status" value="Online"/>
+ <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
+ <button name="copy_to_clipboard" tool_tip="覆製到剪貼簿"/>
+ <text name="user_label" value="Username:"/>
+ <tab_container name="tabs">
+ <panel label="PROFILE" name="panel_profile"/>
+ <panel label="PICKS" name="panel_picks"/>
+ <panel label="NOTES &amp; PRIVACY" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_covenant.xml b/indra/newview/skins/default/xui/zh/panel_region_covenant.xml
new file mode 100644
index 0000000000..2e52efb804
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_covenant.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="契約" name="Covenant">
+ <panel.string name="can_resell">
+ Purchased land in this region may be resold.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </panel.string>
+ <panel.string name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </panel.string>
+ <text name="estate_section_lbl">
+ 領地
+ </text>
+ <text name="estate_name_lbl">
+ 名稱:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ 擁有者:
+ </text>
+ <text name="estate_owner_text">
+ (無)
+ </text>
+ <text name="estate_cov_lbl">
+ 契約:
+ </text>
+ <text name="covenant_timestamp_text">
+ Last Modified Wed Dec 31 16:00:00 1969
+ </text>
+ <text_editor name="covenant_editor">
+ There is no Covenant provided for this Estate.
+ </text_editor>
+ <button label="Reset" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Changes to the covenant will show on all parcels in the estate.
+ </text>
+ <text name="covenant_instructions">
+ Drag and drop a notecard to change the Covenant for this estate.
+ </text>
+ <text name="region_section_lbl">
+ 地區
+ </text>
+ <text name="region_name_lbl">
+ 名稱:
+ </text>
+ <text name="region_name_text">
+ Erica
+ </text>
+ <text name="region_landtype_lbl">
+ 類型:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ 分級:
+ </text>
+ <text name="region_maturity_text">
+ Adult
+ </text>
+ <text name="resellable_lbl">
+ Resale:
+ </text>
+ <text name="resellable_clause">
+ Land in this region may not be resold.
+ </text>
+ <text name="changeable_lbl">
+ Subdivide:
+ </text>
+ <text name="changeable_clause">
+ Land in this region may not be joined/subdivided.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_debug.xml b/indra/newview/skins/default/xui/zh/panel_region_debug.xml
new file mode 100644
index 0000000000..892b743f57
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_debug.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="除錯" name="Debug">
+ <text name="region_text_lbl">
+ 地區:
+ </text>
+ <text name="region_text">
+ 未知
+ </text>
+ <check_box label="Disable Scripts" name="disable_scripts_check" tool_tip="Disable all scripts in this region"/>
+ <check_box label="Disable Collisions" name="disable_collisions_check" tool_tip="Disable non-avatar collisions in this region"/>
+ <check_box label="Disable Physics" name="disable_physics_check" tool_tip="Disable all physics in this region"/>
+ <button label="套用" name="apply_btn"/>
+ <text name="objret_text_lbl">
+ Object Return
+ </text>
+ <text name="resident_text_lbl">
+ Resident:
+ </text>
+ <line_editor name="target_avatar_name">
+ (無)
+ </line_editor>
+ <button label="Choose" name="choose_avatar_btn"/>
+ <text name="options_text_lbl">
+ Options:
+ </text>
+ <check_box label="With scripts" name="return_scripts" tool_tip="Return only objects which have scripts"/>
+ <check_box label="On someone else&apos;s land" name="return_other_land" tool_tip="Return only objects which are on land belonging to someone else"/>
+ <check_box label="In every region of this estate" name="return_estate_wide" tool_tip="Return objects in all of the regions that make up this estate"/>
+ <button label="Return" name="return_btn"/>
+ <button label="Get Top Colliders..." name="top_colliders_btn" tool_tip="List of objects experiencing the most potential collisions"/>
+ <button label="Get Top Scripts..." name="top_scripts_btn" tool_tip="List of objects spending the most time running scripts"/>
+ <button label="Restart Region" name="restart_btn" tool_tip="Give 2 minute countdown and restart region"/>
+ <button label="Delay Restart" name="cancel_restart_btn" tool_tip="Delay region restart by one hour"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_estate.xml b/indra/newview/skins/default/xui/zh/panel_region_estate.xml
new file mode 100644
index 0000000000..687135bf65
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_estate.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="領地" name="Estate">
+ <text name="estate_help_text">
+ Changes to settings on this tab will affect all regions in the estate.
+ </text>
+ <text name="estate_text">
+ 領地:
+ </text>
+ <text name="estate_name">
+ (未知)
+ </text>
+ <text name="owner_text">
+ 領地擁有者:
+ </text>
+ <text name="estate_owner">
+ (未知)
+ </text>
+ <check_box label="Use Global Time" name="use_global_time_check"/>
+ <check_box label="Fixed Sun" name="fixed_sun_check"/>
+ <slider label="Phase" name="sun_hour_slider"/>
+ <check_box label="Allow Public Access" name="externally_visible_check"/>
+ <text name="Only Allow">
+ Restrict Access to accounts verified by:
+ </text>
+ <check_box label="Payment Information on File" name="limit_payment" tool_tip="Ban unidentified Residents"/>
+ <check_box label="年齡驗證" name="limit_age_verified" tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."/>
+ <check_box label="Allow Voice Chat" name="voice_chat_check"/>
+ <check_box label="Allow Direct Teleport" name="allow_direct_teleport"/>
+ <button label="套用" name="apply_btn"/>
+ <button label="Send Message To Estate..." name="message_estate_btn"/>
+ <button label="Kick Resident from Estate..." name="kick_user_from_estate_btn"/>
+ <text name="estate_manager_label">
+ 領地管理員:
+ </text>
+ <button label="Remove..." name="remove_estate_manager_btn"/>
+ <button label="Add..." name="add_estate_manager_btn"/>
+ <text name="allow_resident_label">
+ Allowed Residents:
+ </text>
+ <button label="Remove..." name="remove_allowed_avatar_btn"/>
+ <button label="Add..." name="add_allowed_avatar_btn"/>
+ <text name="allow_group_label">
+ Allowed Groups:
+ </text>
+ <button label="Remove..." name="remove_allowed_group_btn"/>
+ <button label="Add..." name="add_allowed_group_btn"/>
+ <text name="ban_resident_label">
+ Banned Residents:
+ </text>
+ <button label="Remove..." name="remove_banned_avatar_btn"/>
+ <button label="Add..." name="add_banned_avatar_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_general.xml b/indra/newview/skins/default/xui/zh/panel_region_general.xml
new file mode 100644
index 0000000000..ce69ec59c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_general.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="地區" name="General">
+ <text name="region_text_lbl">
+ 地區:
+ </text>
+ <text name="region_text">
+ 未知
+ </text>
+ <text name="version_channel_text_lbl">
+ Version:
+ </text>
+ <text name="version_channel_text">
+ 未知
+ </text>
+ <text name="region_type_lbl">
+ 類型:
+ </text>
+ <text name="region_type">
+ 未知
+ </text>
+ <check_box label="Block Terraform" name="block_terraform_check"/>
+ <check_box label="Block Fly" name="block_fly_check"/>
+ <check_box label="Allow Damage" name="allow_damage_check"/>
+ <check_box label="Restrict Pushing" name="restrict_pushobject"/>
+ <check_box label="Allow Land Resell" name="allow_land_resell_check"/>
+ <check_box label="Allow Land Join/Divide" name="allow_parcel_changes_check"/>
+ <check_box label="Block Land Show in Search" name="block_parcel_search_check" tool_tip="Let people see this region and its parcels in search results"/>
+ <spinner label="Agent Limit" name="agent_limit_spin"/>
+ <spinner label="Object Bonus" name="object_bonus_spin"/>
+ <text label="Maturity" name="access_text">
+ 分級:
+ </text>
+ <icons_combo_box label="Moderate" name="access_combo">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderate" name="Mature" value="21"/>
+ <icons_combo_box.item label="一般" name="PG" value="13"/>
+ </icons_combo_box>
+ <button label="套用" name="apply_btn"/>
+ <button label="Teleport Home One Resident..." name="kick_btn"/>
+ <button label="Teleport Home All Residents..." name="kick_all_btn"/>
+ <button label="Send Message To Region..." name="im_btn"/>
+ <button label="Manage Telehub..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
new file mode 100644
index 0000000000..0269c8f734
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Terrain" name="Terrain">
+ <text name="region_text_lbl">
+ 地區:
+ </text>
+ <text name="region_text">
+ 未知
+ </text>
+ <spinner label="Water Height" name="water_height_spin"/>
+ <spinner label="Terrain Raise Limit" name="terrain_raise_spin"/>
+ <spinner label="Terrain Lower Limit" name="terrain_lower_spin"/>
+ <check_box label="Use Estate Sun" name="use_estate_sun_check"/>
+ <check_box label="Fixed Sun" name="fixed_sun_check"/>
+ <slider label="Phase" name="sun_hour_slider"/>
+ <button label="套用" name="apply_btn"/>
+ <button label="Download RAW terrain..." name="download_raw_btn" tool_tip="Available only to estate owners, not managers"/>
+ <button label="Upload RAW terrain..." name="upload_raw_btn" tool_tip="Available only to estate owners, not managers"/>
+ <button label="Bake Terrain" name="bake_terrain_btn" tool_tip="Set current terrain as mid-point for raise/lower limits"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_texture.xml b/indra/newview/skins/default/xui/zh/panel_region_texture.xml
new file mode 100644
index 0000000000..42d70fddb8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_texture.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ground Textures" name="Textures">
+ <text name="region_text_lbl">
+ 地區:
+ </text>
+ <text name="region_text">
+ 未知
+ </text>
+ <text name="detail_texture_text">
+ Terrain Textures (requires 512x512, 24 bit .tga files)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Low)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (High)
+ </text>
+ <text name="height_text_lbl5">
+ Texture Elevation Ranges
+ </text>
+ <text name="height_text_lbl6">
+ Northwest
+ </text>
+ <text name="height_text_lbl7">
+ Northeast
+ </text>
+ <spinner label="Low" name="height_start_spin_1"/>
+ <spinner label="Low" name="height_start_spin_3"/>
+ <spinner label="High" name="height_range_spin_1"/>
+ <spinner label="High" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Southwest
+ </text>
+ <text name="height_text_lbl9">
+ Southeast
+ </text>
+ <spinner label="Low" name="height_start_spin_0"/>
+ <spinner label="Low" name="height_start_spin_2"/>
+ <spinner label="High" name="height_range_spin_0"/>
+ <spinner label="High" name="height_range_spin_2"/>
+ <text name="height_text_lbl10">
+ These values represent the blend range for the textures above.
+ </text>
+ <text name="height_text_lbl11">
+ Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
+ </text>
+ <button label="套用" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_ed.xml b/indra/newview/skins/default/xui/zh/panel_script_ed.xml
new file mode 100644
index 0000000000..b0f1bdb337
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_script_ed.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ 載入中...
+ </panel.string>
+ <panel.string name="can_not_view">
+ You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Public Objects cannot run scripts
+ </panel.string>
+ <panel.string name="script_running">
+ Running
+ </panel.string>
+ <panel.string name="Title">
+ Script: [NAME]
+ </panel.string>
+ <panel.string name="external_editor_not_set">
+ Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.
+ </panel.string>
+ <menu_bar name="script_menu">
+ <menu label="File" name="File">
+ <menu_item_call label="儲存" name="Save"/>
+ <menu_item_call label="Revert All Changes" name="Revert All Changes"/>
+ </menu>
+ <menu label="編輯" name="Edit">
+ <menu_item_call label="復原" name="Undo"/>
+ <menu_item_call label="Redo" name="Redo"/>
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="全選" name="Select All"/>
+ <menu_item_call label="Deselect" name="Deselect"/>
+ <menu_item_call label="搜尋 / 取代..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Help" name="Help">
+ <menu_item_call label="Help..." name="Help..."/>
+ <menu_item_call label="Keyword Help..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+ <text_editor name="Script Editor">
+ 載入中...
+ </text_editor>
+ <combo_box label="Insert..." name="Insert..."/>
+ <button label="儲存" label_selected="儲存" name="Save_btn"/>
+ <button label="編輯..." name="Edit_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..5276466117
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MY AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Avatar Script Usage
+ </text>
+ <text name="loading_text">
+ 載入中...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Size (kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="物件名稱" name="name"/>
+ <scroll_list.columns label="Location" name="location"/>
+ </scroll_list>
+ <button label="Refresh List" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..1dc8278db1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="REGION MEMORY" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Parcel Script Memory
+ </text>
+ <text name="loading_text">
+ 載入中...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Size (kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="物件名稱" name="name"/>
+ <scroll_list.columns label="Object Owner" name="owner"/>
+ <scroll_list.columns label="地段" name="parcel"/>
+ <scroll_list.columns label="Location" name="location"/>
+ </scroll_list>
+ <button label="Refresh List" name="refresh_list_btn"/>
+ <button label="Highlight" name="highlight_btn"/>
+ <button label="Return" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_scrolling_param.xml b/indra/newview/skins/default/xui/zh/panel_scrolling_param.xml
new file mode 100644
index 0000000000..bc29058f77
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_scrolling_param.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParam">
+ <text name="Loading...">
+ 載入中...
+ </text>
+ <text name="Loading...2">
+ 載入中...
+ </text>
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_side_tray.xml b/indra/newview/skins/default/xui/zh/panel_side_tray.xml
new file mode 100644
index 0000000000..d99450b5be
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Toggle Sidebar." name="sidebar_openclose" tab_title="Toggle Sidebar"/>
+ <sidetray_tab description="首頁。" name="sidebar_home" tab_title="首頁">
+ <panel label="首頁" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Edit your public profile and Picks." name="sidebar_me" tab_title="My Profile">
+ <panel_container name="panel_container">
+ <panel label="自己" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Find your friends, contacts and people nearby." name="sidebar_people" tab_title="People">
+ <panel_container name="panel_container">
+ <panel label="Group Profile" name="panel_group_info_sidetray"/>
+ <panel label="Blocked Residents &amp; Objects" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Find places to go and places you&apos;ve visited before." label="Places" name="sidebar_places" tab_title="Places">
+ <panel label="Places" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Browse your inventory." name="sidebar_inventory" tab_title="My Inventory">
+ <panel label="Edit Inventory" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Change your appearance and current look." name="sidebar_appearance" tab_title="My Appearance">
+ <panel label="Edit Appearance" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..822b2b5894
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="側邊欄"/>
+ <button name="undock" tool_tip="Undock"/>
+ <button name="dock" tool_tip="Dock"/>
+ <button name="show_help" tool_tip="Show Help"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..279a9869a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Stand" name="stand_btn" tool_tip="Click here to stand up."/>
+ <button label="Stop Flying" name="stop_fly_btn" tool_tip="Stop flying"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_status_bar.xml b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
new file mode 100644
index 0000000000..65740f1b6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="packet_loss_tooltip">
+ 封包損失
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ 頻寬
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Click to refresh your L$ balance" value="L$20"/>
+ <button label="購買 L$" name="buyL" tool_tip="Click to buy more L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Current time (Pacific)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Start/Stop All Media (Music, Video, Web pages)"/>
+ <button name="volume_btn" tool_tip="Global Volume Control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_teleport_history.xml b/indra/newview/skins/default/xui/zh/panel_teleport_history.xml
new file mode 100644
index 0000000000..872a4584bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_teleport_history.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <no_matched_tabs_text name="no_matched_teleports_msg" value="Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search]."/>
+ <no_visible_tabs_text name="no_teleports_msg" value="Teleport history is empty. Try [secondlife:///app/search/places/ Search]."/>
+ <accordion_tab name="today" title="今天"/>
+ <accordion_tab name="yesterday" title="昨天"/>
+ <accordion_tab name="2_days_ago" title="前天"/>
+ <accordion_tab name="3_days_ago" title="三天前"/>
+ <accordion_tab name="4_days_ago" title="四天前"/>
+ <accordion_tab name="5_days_ago" title="五天前"/>
+ <accordion_tab name="6_days_and_older" title="六天前或更久"/>
+ <accordion_tab name="1_month_and_older" title="一個月或更久"/>
+ <accordion_tab name="6_months_and_older" title="半年前或更久"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Show additional options"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..c251994906
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="顯示物品資訊"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_voice_effect.xml b/indra/newview/skins/default/xui/zh/panel_voice_effect.xml
new file mode 100644
index 0000000000..6c8a452014
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ 關閉變聲效果
+ </string>
+ <string name="preview_voice_effects">
+ 預覽變聲效果 ▶
+ </string>
+ <string name="get_voice_effects">
+ 取得變聲效果 ▶
+ </string>
+ <combo_box name="voice_effect" tool_tip="選取一個變聲效果來改變你的聲音">
+ <combo_box.item label="關閉變聲效果" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_world_map.xml b/indra/newview/skins/default/xui/zh/panel_world_map.xml
new file mode 100644
index 0000000000..ad28361a7f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_world_map.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+ <panel.string name="Loading">
+ 載入中...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Invalid Location
+ </panel.string>
+ <panel.string name="world_map_north">
+ N
+ </panel.string>
+ <panel.string name="world_map_east">
+ E
+ </panel.string>
+ <panel.string name="world_map_west">
+ W
+ </panel.string>
+ <panel.string name="world_map_south">
+ S
+ </panel.string>
+ <panel.string name="world_map_southeast">
+ SE
+ </panel.string>
+ <panel.string name="world_map_northeast">
+ NE
+ </panel.string>
+ <panel.string name="world_map_southwest">
+ SW
+ </panel.string>
+ <panel.string name="world_map_northwest">
+ NW
+ </panel.string>
+ <panel.string name="world_map_person">
+ 1 person
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] people
+ </panel.string>
+ <text label="N" name="floater_map_north">
+ N
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="W" name="floater_map_west">
+ W
+ </text>
+ <text label="S" name="floater_map_south">
+ S
+ </text>
+ <text label="SE" name="floater_map_southeast">
+ SE
+ </text>
+ <text label="NE" name="floater_map_northeast">
+ NE
+ </text>
+ <text label="SW" name="floater_map_southwest">
+ SW
+ </text>
+ <text label="NW" name="floater_map_northwest">
+ NW
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/role_actions.xml b/indra/newview/skins/default/xui/zh/role_actions.xml
new file mode 100644
index 0000000000..196f8c7a6a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/role_actions.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<role_actions>
+ <action_set description="These Abilities include powers to add and remove group Members, and allow new Members to join without an invitation." name="Membership">
+ <action description="Invite People to this Group" longdescription="Invite People to this Group using the &apos;Invite&apos; button in the Roles section &gt; Members tab." name="member invite" value="1"/>
+ <action description="Eject Members from this Group" longdescription="Eject Members from this Group using the &apos;Eject&apos; button in the Roles section &gt; Members tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability." name="member eject" value="2"/>
+ <action description="Toggle &apos;Open Enrollment&apos; and change &apos;Enrollment fee&apos;" longdescription="Toggle &apos;Open Enrollment&apos; to let new Members join without an invitation, and change the &apos;Enrollment fee&apos; in the General section." name="member options" value="3"/>
+ </action_set>
+ <action_set description="These Abilities include powers to add, remove, and change group Roles, add and remove Members in Roles, and assign Abilities to Roles." name="Roles">
+ <action description="Create new Roles" longdescription="Create new Roles in the Roles section &gt; Roles tab." name="role create" value="4"/>
+ <action description="Delete Roles" longdescription="Delete Roles in the Roles section &gt; Roles tab." name="role delete" value="5"/>
+ <action description="Change Role names, titles, descriptions, and whether Role members are publicly revealed" longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles section &gt; Roles tab after selecting a Role." name="role properties" value="6"/>
+ <action description="Assign Members to Assigner&apos;s Roles" longdescription="Assign Members to Roles in the list of Assigned Roles (Roles section &gt; Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in." name="role assign member limited" value="7"/>
+ <action description="Assign Members to Any Role" longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles section &gt; Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability." name="role assign member" value="8"/>
+ <action description="Remove Members from Roles" longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section &gt; Members tab). Owners can&apos;t be removed." name="role remove member" value="9"/>
+ <action description="Assign and Remove Abilities in Roles" longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles section &gt; Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability." name="role change actions" value="10"/>
+ </action_set>
+ <action_set description="These Abilities include powers to modify this group&apos;s identity, such as changing public visibility, charter, and insignia." name="Group Identity">
+ <action description="Change Charter, Insignia, and &apos;Show in search&apos;" longdescription="Change Charter, Insignia, and &apos;Show in search&apos;. This is done in the General section." name="group change identity" value="11"/>
+ </action_set>
+ <action_set description="These Abilities include powers to deed, modify, and sell land in this group&apos;s land holdings. To get to the About Land window, right-click the ground and select &apos;About Land&apos;, or click the &apos;i&apos; icon in the Navigation Bar." name="Parcel Management">
+ <action description="Deed land and buy land for group" longdescription="Deed land and buy land for group. This is done in About Land &gt; General tab." name="land deed" value="12"/>
+ <action description="Abandon land to Governor Linden" longdescription="Abandon land to Governor Linden. *WARNING* Any Member in a Role with this Ability can abandon group-owned land in About Land &gt; General tab, reverting it to Linden ownership without a sale! Be sure you know what you&apos;re doing before assigning this Ability." name="land release" value="13"/>
+ <action description="Set land for sale info" longdescription="Set land for sale info. *WARNING* Any Member in a Role with this Ability can sell group-owned land in About Land &gt; General tab as they wish! Be sure you know what you&apos;re doing before assigning this Ability." name="land set sale info" value="14"/>
+ <action description="Subdivide and join parcels" longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide&apos;. To join, select two or more contiguous parcels and click &apos;Join&apos;." name="land divide join" value="15"/>
+ </action_set>
+ <action_set description="These Abilities include powers to change the parcel name and publish settings, Find directory visibility, and landing point &amp; TP routing options." name="Parcel Identity">
+ <action description="Toggle &apos;Show Place in Search&apos; and set category" longdescription="Toggle &apos;Show Place in Search&apos; and setting a parcel&apos;s category in About Land &gt; Options tab." name="land find places" value="17"/>
+ <action description="Change parcel name, description, and &apos;Show Place in Search&apos; settings" longdescription="Change parcel name, description, and &apos;Show Place in Search&apos; settings. This is done in About Land &gt; Options tab." name="land change identity" value="18"/>
+ <action description="Set landing point and set teleport routing" longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land &gt; Options tab." name="land set landing point" value="19"/>
+ </action_set>
+ <action_set description="These Abilities include powers which affect parcel options, such as &apos;Create Objects&apos;, &apos;Edit Terrain&apos;, and music &amp; media settings." name="Parcel Settings">
+ <action description="Change music &amp; media settings" longdescription="Change streaming music and movie settings in About Land &gt; Media tab." name="land change media" value="20"/>
+ <action description="Toggle &apos;Edit Terrain&apos;" longdescription="Toggle &apos;Edit Terrain&apos;. *WARNING* About Land &gt; Options tab &gt; Edit Terrain allows anyone to terraform your land&apos;s shape, and place and move Linden plants. Be sure you know what you&apos;re doing before assigning this Ability. Editing terrain is toggled in About Land &gt; Options tab." name="land edit" value="21"/>
+ <action description="Toggle various About Land &gt; Options settings" longdescription="Toggle &apos;Safe (no damage)&apos;, &apos;Fly&apos;, and allow other Residents to: &apos;Edit Terrain&apos;, &apos;Build&apos;, &apos;Create Landmarks&apos;, and &apos;Run Scripts&apos; on group-owned land in About Land &gt; Options tab." name="land options" value="22"/>
+ </action_set>
+ <action_set description="These Abilities include powers which allow Members to bypass restrictions on group-owned parcels." name="Parcel Powers">
+ <action description="Always allow &apos;Edit Terrain&apos;" longdescription="Members in a Role with this Ability can edit terrain on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow edit land" value="23"/>
+ <action description="Always allow &apos;Fly&apos;" longdescription="Members in a Role with this Ability can fly on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow fly" value="24"/>
+ <action description="Always allow &apos;Create Objects&apos;" longdescription="Members in a Role with this Ability can create objects on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow create" value="25"/>
+ <action description="Always allow &apos;Create Landmark&apos;" longdescription="Members in a Role with this Ability can landmark a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow landmark" value="26"/>
+ <action description="Allow &apos;Set Home to Here&apos; on group land" longdescription="Members in a Role with this Ability can use World menu &gt; Landmarks &gt; Set Home to Here on a parcel deeded to this group." name="land allow set home" value="28"/>
+ <action description="Allow &apos;Event Hosting&apos; on group land" longdescription="Members in a Role with this Ability can select group owned parcels as venus when hosting an event." name="land allow host event" value="41"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow or restrict access to group-owned parcels, including freezing and ejecting Residents." name="Parcel Access">
+ <action description="Manage parcel Access lists" longdescription="Manage parcel Access lists in About Land &gt; Access tab." name="land manage allowed" value="29"/>
+ <action description="Manage parcel Ban lists" longdescription="Manage parcel Ban lists in About Land &gt; Access tab." name="land manage banned" value="30"/>
+ <action description="Change parcel &apos;Sell passes to&apos; settings" longdescription="Change parcel &apos;Sell passes to&apos; settings in About Land &gt; Access tab." name="land manage passes" value="31"/>
+ <action description="Eject and freeze Residents on parcels" longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, then selecting &apos;Eject&apos; or &apos;Freeze&apos;." name="land admin" value="32"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow members to return objects and place and move Linden plants. This is useful for Members to clean up litter and do landscaping, but it should also be used with care, because there&apos;s no undo for returning objects." name="Parcel Content">
+ <action description="Return objects owned by group" longdescription="Return objects on group-owned parcels that are owned by the group in About Land &gt; Objects tab." name="land return group owned" value="48"/>
+ <action description="Return objects set to group" longdescription="Return objects on group-owned parcels that are set to the group in About Land &gt; Objects tab." name="land return group set" value="33"/>
+ <action description="Return non-group objects" longdescription="Return objects on group-owned parcels that are non-group in About Land &gt; Objects tab." name="land return non group" value="34"/>
+ <action description="Landscaping using Linden plants" longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory&apos;s Library &gt; Objects folder, or they can be created via the Build menu." name="land gardening" value="35"/>
+ </action_set>
+ <action_set description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Build Tools &gt; General tab. Right-click an object and Edit to see its settings." name="Object Management">
+ <action description="Deed objects to group" longdescription="Deed objects to group in the Build Tools &gt; General tab." name="object deed" value="36"/>
+ <action description="Manipulate (move, copy, modify) group-owned objects" longdescription="Manipulate (move, copy, modify) group-owned objects in the Build Tools &gt; General tab." name="object manipulate" value="38"/>
+ <action description="Set group-owned objects for sale" longdescription="Set group-owned objects for sale in the Build Tools &gt; General tab." name="object set sale" value="39"/>
+ </action_set>
+ <action_set description="These Abilities include powers which require Members to pay group liabilities and receive group dividends, and restrict access to group account history." name="Accounting">
+ <action description="Pay group liabilities and receive group dividends" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees." name="accounting accountable" value="40"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow Members to send, receive, and view group Notices." name="Notices">
+ <action description="Send Notices" longdescription="Members in a Role with this Ability can send Notices via the Group &gt; Notices section." name="notices send" value="42"/>
+ <action description="Receive Notices and view past Notices" longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group &gt; Notices section." name="notices receive" value="43"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow or restrict access to group chat sessions and group voice chat." name="Chat">
+ <action description="Join Group Chat" longdescription="Members in a Role with this Ability can join group chat sessions, for text and voice." name="join group chat" value="16"/>
+ <action description="Join Group Voice Chat" longdescription="Members in a Role with this Ability can join group voice chat sessions. NOTE: The Join Group Chat ability is required to access the voice chat session." name="join voice chat" value="27"/>
+ <action description="Moderate Group Chat" longdescription="Members in a Role with this Ability can control access and participation in group voice and text chat sessions." name="moderate group chat" value="37"/>
+ </action_set>
+</role_actions>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml b/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml
new file mode 100644
index 0000000000..1832886135
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Outfits" name="appearance panel">
+ <string name="No Outfit" value="No Outfit"/>
+ <string name="Unsaved Changes" value="Unsaved changes"/>
+ <string name="Now Wearing" value="Now wearing..."/>
+ <string name="Changing outfits" value="Changing outfits"/>
+ <panel name="panel_currentlook">
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (Status)
+ </text>
+ <text name="currentlook_name">
+ MyOutfit With a really Long Name like MOOSE
+ </text>
+ <button label="" name="edit_outfit_btn" tool_tip="Edit this outfit"/>
+ </panel>
+ <filter_editor label="Filter Outfits" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
new file mode 100644
index 0000000000..4230d60c45
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Things" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Profile" name="info_btn" tool_tip="Show object profile"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="分享" name="share_btn" tool_tip="Share an inventory item"/>
+ </layout_panel>
+ <layout_panel name="shop_btn_lp">
+ <button label="Shop" name="shop_btn" tool_tip="Open Marketplace webpage"/>
+ <button label="Wear" name="wear_btn" tool_tip="Wear seleceted outfit"/>
+ <button label="Play" name="play_btn"/>
+ <button label="Teleport" name="teleport_btn" tool_tip="Teleport to the selected area"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
new file mode 100644
index 0000000000..d1332ddb7c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Item Profile">
+ <panel.string name="unknown">
+ (未知)
+ </panel.string>
+ <panel.string name="public">
+ (公開)
+ </panel.string>
+ <panel.string name="you_can">
+ 你可以:
+ </panel.string>
+ <panel.string name="owner_can">
+ 擁有者可以:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <panel.string name="origin_inventory">
+ (Inventory)
+ </panel.string>
+ <panel.string name="origin_inworld">
+ (Inworld)
+ </panel.string>
+ <text name="title" value="Item Profile"/>
+ <text name="origin" value="(Inventory)"/>
+ <scroll_container name="item_profile_scroll">
+ <panel label="" name="item_profile">
+ <text name="LabelItemNameTitle">
+ 名稱:
+ </text>
+ <text name="LabelItemDescTitle">
+ 描述:
+ </text>
+ <text name="LabelCreatorTitle">
+ 創造者:
+ </text>
+ <text name="LabelOwnerTitle">
+ 擁有者:
+ </text>
+ <text name="LabelAcquiredTitle">
+ Acquired:
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ 你可以:
+ </text>
+ <check_box label="修改" name="CheckOwnerModify"/>
+ <check_box label="覆製" name="CheckOwnerCopy"/>
+ <check_box label="轉移" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ 任何人:
+ </text>
+ <check_box label="覆製" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Group:
+ </text>
+ <check_box label="分享" name="CheckShareWithGroup" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
+ <text name="NextOwnerLabel">
+ 下一個擁有者:
+ </text>
+ <check_box label="修改" name="CheckNextOwnerModify"/>
+ <check_box label="覆製" name="CheckNextOwnerCopy"/>
+ <check_box label="轉移" name="CheckNextOwnerTransfer" tool_tip="Next owner can give away or resell this object"/>
+ </panel>
+ <check_box label="出售" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copy" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="價格: L$" name="Edit Cost"/>
+ </panel>
+ </scroll_container>
+ <panel name="button_panel">
+ <button label="取銷" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
new file mode 100644
index 0000000000..14d67d52b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Object Profile">
+ <panel.string name="text deed continued">
+ Deed
+ </panel.string>
+ <panel.string name="text deed">
+ Deed
+ </panel.string>
+ <panel.string name="text modify info 1">
+ You can modify this object
+ </panel.string>
+ <panel.string name="text modify info 2">
+ You can modify these objects
+ </panel.string>
+ <panel.string name="text modify info 3">
+ You can&apos;t modify this object
+ </panel.string>
+ <panel.string name="text modify info 4">
+ You can&apos;t modify these objects
+ </panel.string>
+ <panel.string name="text modify warning">
+ This object has linked parts
+ </panel.string>
+ <panel.string name="Cost Default">
+ 價格: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ 總價: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <text name="title" value="Object Profile"/>
+ <text name="where" value="(Inworld)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ 名稱:
+ </text>
+ <text name="Description:">
+ 描述:
+ </text>
+ <text name="CreatorNameLabel">
+ 創造者:
+ </text>
+ <text name="Owner:">
+ 擁有者:
+ </text>
+ <text name="Group_label">
+ Group:
+ </text>
+ <button name="button set group" tool_tip="Choose a group to share this object&apos;s permissions"/>
+ <name_box initial_value="載入中..." name="Group Name Proxy"/>
+ <button label="Deed" label_selected="Deed" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
+ <text name="label click action">
+ Click to:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Touch (default)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sit on object" name="Sitonobject"/>
+ <combo_box.item label="Buy object" name="Buyobject"/>
+ <combo_box.item label="Pay object" name="Payobject"/>
+ <combo_box.item label="Open" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ You can modify this object
+ </text>
+ <text name="Anyone can:">
+ 任何人:
+ </text>
+ <check_box label="覆製" name="checkbox allow everyone copy"/>
+ <check_box label="移動" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Group:
+ </text>
+ <check_box label="分享" name="checkbox share with group" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
+ <text name="NextOwnerLabel">
+ 下一個擁有者:
+ </text>
+ <check_box label="修改" name="checkbox next owner can modify"/>
+ <check_box label="覆製" name="checkbox next owner can copy"/>
+ <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="Next owner can give away or resell this object"/>
+ </panel>
+ <check_box label="出售" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Copy" name="Copy"/>
+ <combo_box.item label="Contents" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="價格: L$" name="Edit Cost"/>
+ <check_box label="Show in search" name="search_check" tool_tip="Let people see this object in search results"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Open" name="open_btn"/>
+ <button label="Pay" name="pay_btn"/>
+ <button label="購買" name="buy_btn"/>
+ <button label="Details" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
new file mode 100644
index 0000000000..4eb845d791
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -0,0 +1,4454 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Second Life Grid
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life Support Portal
+ </string>
+ <string name="StartupDetectingHardware">
+ Detecting hardware...
+ </string>
+ <string name="StartupLoading">
+ Loading [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Clearing cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Initializing Texture Cache...
+ </string>
+ <string name="StartupInitializingVFS">
+ Initializing VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Restoring...
+ </string>
+ <string name="ProgressChangingResolution">
+ Changing Resolution...
+ </string>
+ <string name="Fullbright">
+ Fullbright (Legacy)
+ </string>
+ <string name="LoginInProgress">
+ Logging in. [APP_NAME] may appear frozen. Please wait.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Logging in...
+ </string>
+ <string name="LoginAuthenticating">
+ Authenticating
+ </string>
+ <string name="LoginMaintenance">
+ Performing account maintenance...
+ </string>
+ <string name="LoginAttempt">
+ Previous login attempt failed. Logging in, attempt [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Loading world...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Initializing embedded web browser...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Initializing multimedia...
+ </string>
+ <string name="LoginInitializingFonts">
+ Loading fonts...
+ </string>
+ <string name="LoginVerifyingCache">
+ Verifying cache files (can take 60-90 seconds)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Processing Response...
+ </string>
+ <string name="LoginInitializingWorld">
+ Initializing World...
+ </string>
+ <string name="LoginDecodingImages">
+ Decoding images...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Initializing QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime not found - unable to initialize.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime initialized successfully.
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Waiting for region handshake...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Connecting to region...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Downloading clothing...
+ </string>
+ <string name="InvalidCertificate">
+ The server returned an invalid or corrupt certificate. Please contact the Grid administrator.
+ </string>
+ <string name="CertInvalidHostname">
+ An invalid hostname was used to access the server, please check your SLURL or Grid hostname.
+ </string>
+ <string name="CertExpired">
+ The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.
+ </string>
+ <string name="CertKeyUsage">
+ The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.
+ </string>
+ <string name="CertBasicConstraints">
+ Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.
+ </string>
+ <string name="CertInvalidSignature">
+ The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Network Error: Could not establish connection, please check your network connection.
+ </string>
+ <string name="LoginFailed">
+ Login failed.
+ </string>
+ <string name="Quit">
+ Quit
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/
+ </string>
+ <string name="AgentLostConnection">
+ This region may be experiencing trouble. Please check your connection to the Internet.
+ </string>
+ <string name="SavingSettings">
+ Saving your settings...
+ </string>
+ <string name="LoggingOut">
+ Logging out...
+ </string>
+ <string name="ShuttingDown">
+ Shutting down...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ You have been disconnected from the region you were in.
+ </string>
+ <string name="SentToInvalidRegion">
+ You were sent to an invalid region.
+ </string>
+ <string name="TestingDisconnect">
+ Testing viewer disconnect
+ </string>
+ <string name="TooltipPerson">
+ Person
+ </string>
+ <string name="TooltipNoName">
+ (no name)
+ </string>
+ <string name="TooltipOwner">
+ 擁有者:
+ </string>
+ <string name="TooltipPublic">
+ Public
+ </string>
+ <string name="TooltipIsGroup">
+ (Group)
+ </string>
+ <string name="TooltipForSaleL$">
+ 出售: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Group Build
+ </string>
+ <string name="TooltipFlagNoBuild">
+ No Build
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Group Build
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Not Safe
+ </string>
+ <string name="TooltipFlagNoFly">
+ No Fly
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Group Scripts
+ </string>
+ <string name="TooltipFlagNoScripts">
+ No Scripts
+ </string>
+ <string name="TooltipLand">
+ Land:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Only a single item can be dragged here
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipHttpUrl">
+ Click to view this web page
+ </string>
+ <string name="TooltipSLURL">
+ Click to view this location&apos;s information
+ </string>
+ <string name="TooltipAgentUrl">
+ Click to view this Resident&apos;s profile
+ </string>
+ <string name="TooltipAgentInspect">
+ Learn more about this Resident
+ </string>
+ <string name="TooltipAgentMute">
+ Click to mute this Resident
+ </string>
+ <string name="TooltipAgentUnmute">
+ Click to unmute this Resident
+ </string>
+ <string name="TooltipAgentIM">
+ Click to IM this Resident
+ </string>
+ <string name="TooltipAgentPay">
+ Click to Pay this Resident
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Click to offer a teleport request to this Resident
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Click to send a friend request to this Resident
+ </string>
+ <string name="TooltipGroupUrl">
+ Click to view this group&apos;s description
+ </string>
+ <string name="TooltipEventUrl">
+ Click to view this event&apos;s description
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Click to view this classified
+ </string>
+ <string name="TooltipParcelUrl">
+ Click to view this parcel&apos;s description
+ </string>
+ <string name="TooltipTeleportUrl">
+ Click to teleport to this location
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Click to view this object&apos;s description
+ </string>
+ <string name="TooltipMapUrl">
+ Click to view this location on a map
+ </string>
+ <string name="TooltipSLAPP">
+ Click to run the secondlife:// command
+ </string>
+ <string name="CurrentURL" value="CurrentURL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleport to
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Show Map for
+ </string>
+ <string name="SLappAgentMute">
+ Mute
+ </string>
+ <string name="SLappAgentUnmute">
+ Unmute
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Pay
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Offer Teleport to
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Friend Request
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Close (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Close (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ 關閉
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restore
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimize
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Tear Off
+ </string>
+ <string name="BUTTON_DOCK">
+ Dock
+ </string>
+ <string name="BUTTON_HELP">
+ Show Help
+ </string>
+ <string name="Searching">
+ Searching...
+ </string>
+ <string name="NoneFound">
+ None found.
+ </string>
+ <string name="RetrievingData">
+ Retrieving...
+ </string>
+ <string name="ReleaseNotes">
+ Release Notes
+ </string>
+ <string name="LoadingData">
+ 載入中...
+ </string>
+ <string name="AvatarNameNobody">
+ (nobody)
+ </string>
+ <string name="AvatarNameWaiting">
+ (waiting)
+ </string>
+ <string name="AvatarNameMultiple">
+ (multiple)
+ </string>
+ <string name="GroupNameNone">
+ (無)
+ </string>
+ <string name="AvalineCaller">
+ Avaline Caller [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ No error
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Asset request: failed
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Asset request: non-existent file
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Asset request: asset not found in database
+ </string>
+ <string name="AssetErrorEOF">
+ End of file
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Cannot open file
+ </string>
+ <string name="AssetErrorFileNotFound">
+ File not found
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ File transfer timeout
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuit gone
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Viewer and server do not agree on price
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Unknown status
+ </string>
+ <string name="texture">
+ texture
+ </string>
+ <string name="sound">
+ sound
+ </string>
+ <string name="calling card">
+ calling card
+ </string>
+ <string name="landmark">
+ landmark
+ </string>
+ <string name="legacy script">
+ legacy script
+ </string>
+ <string name="clothing">
+ clothing
+ </string>
+ <string name="object">
+ object
+ </string>
+ <string name="note card">
+ notecard
+ </string>
+ <string name="folder">
+ 資料夾
+ </string>
+ <string name="root">
+ root
+ </string>
+ <string name="lsl2 script">
+ LSL2 script
+ </string>
+ <string name="lsl bytecode">
+ LSL bytecode
+ </string>
+ <string name="tga texture">
+ tga texture
+ </string>
+ <string name="body part">
+ body part
+ </string>
+ <string name="snapshot">
+ snapshot
+ </string>
+ <string name="lost and found">
+ Lost and Found
+ </string>
+ <string name="targa image">
+ targa image
+ </string>
+ <string name="trash">
+ Trash
+ </string>
+ <string name="jpeg image">
+ jpeg image
+ </string>
+ <string name="animation">
+ animation
+ </string>
+ <string name="gesture">
+ gesture
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorite
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ folder link
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Editing Appearance)
+ </string>
+ <string name="AvatarAway">
+ Away
+ </string>
+ <string name="AvatarBusy">
+ Busy
+ </string>
+ <string name="AvatarMuted">
+ Blocked
+ </string>
+ <string name="anim_express_afraid">
+ Afraid
+ </string>
+ <string name="anim_express_anger">
+ Angry
+ </string>
+ <string name="anim_away">
+ Away
+ </string>
+ <string name="anim_backflip">
+ Backflip
+ </string>
+ <string name="anim_express_laugh">
+ Belly Laugh
+ </string>
+ <string name="anim_express_toothsmile">
+ BigSmile
+ </string>
+ <string name="anim_blowkiss">
+ Blow Kiss
+ </string>
+ <string name="anim_express_bored">
+ Bored
+ </string>
+ <string name="anim_bow">
+ Bow
+ </string>
+ <string name="anim_clap">
+ Clap
+ </string>
+ <string name="anim_courtbow">
+ Court Bow
+ </string>
+ <string name="anim_express_cry">
+ Cry
+ </string>
+ <string name="anim_dance1">
+ Dance 1
+ </string>
+ <string name="anim_dance2">
+ Dance 2
+ </string>
+ <string name="anim_dance3">
+ Dance 3
+ </string>
+ <string name="anim_dance4">
+ Dance 4
+ </string>
+ <string name="anim_dance5">
+ Dance 5
+ </string>
+ <string name="anim_dance6">
+ Dance 6
+ </string>
+ <string name="anim_dance7">
+ Dance 7
+ </string>
+ <string name="anim_dance8">
+ Dance 8
+ </string>
+ <string name="anim_express_disdain">
+ Disdain
+ </string>
+ <string name="anim_drink">
+ Drink
+ </string>
+ <string name="anim_express_embarrased">
+ Embarrassed
+ </string>
+ <string name="anim_angry_fingerwag">
+ Finger Wag
+ </string>
+ <string name="anim_fist_pump">
+ Fist Pump
+ </string>
+ <string name="anim_yoga_float">
+ Floating Yoga
+ </string>
+ <string name="anim_express_frown">
+ Frown
+ </string>
+ <string name="anim_impatient">
+ Impatient
+ </string>
+ <string name="anim_jumpforjoy">
+ Jump For Joy
+ </string>
+ <string name="anim_kissmybutt">
+ Kiss My Butt
+ </string>
+ <string name="anim_express_kiss">
+ Kiss
+ </string>
+ <string name="anim_laugh_short">
+ Laugh
+ </string>
+ <string name="anim_musclebeach">
+ Muscle Beach
+ </string>
+ <string name="anim_no_unhappy">
+ No (Unhappy)
+ </string>
+ <string name="anim_no_head">
+ No
+ </string>
+ <string name="anim_nyanya">
+ Nya-nya-nya
+ </string>
+ <string name="anim_punch_onetwo">
+ One-Two Punch
+ </string>
+ <string name="anim_express_open_mouth">
+ Open Mouth
+ </string>
+ <string name="anim_peace">
+ Peace
+ </string>
+ <string name="anim_point_you">
+ Point at Other
+ </string>
+ <string name="anim_point_me">
+ Point at Self
+ </string>
+ <string name="anim_punch_l">
+ Punch Left
+ </string>
+ <string name="anim_punch_r">
+ Punch Right
+ </string>
+ <string name="anim_rps_countdown">
+ RPS count
+ </string>
+ <string name="anim_rps_paper">
+ RPS paper
+ </string>
+ <string name="anim_rps_rock">
+ RPS rock
+ </string>
+ <string name="anim_rps_scissors">
+ RPS scissors
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsed
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Roundhouse Kick
+ </string>
+ <string name="anim_express_sad">
+ Sad
+ </string>
+ <string name="anim_salute">
+ Salute
+ </string>
+ <string name="anim_shout">
+ Shout
+ </string>
+ <string name="anim_express_shrug">
+ Shrug
+ </string>
+ <string name="anim_express_smile">
+ Smile
+ </string>
+ <string name="anim_smoke_idle">
+ Smoke Idle
+ </string>
+ <string name="anim_smoke_inhale">
+ Smoke Inhale
+ </string>
+ <string name="anim_smoke_throw_down">
+ Smoke Throw Down
+ </string>
+ <string name="anim_express_surprise">
+ Surprise
+ </string>
+ <string name="anim_sword_strike_r">
+ Sword Strike
+ </string>
+ <string name="anim_angry_tantrum">
+ Tantrum
+ </string>
+ <string name="anim_express_tongue_out">
+ TongueOut
+ </string>
+ <string name="anim_hello">
+ Wave
+ </string>
+ <string name="anim_whisper">
+ Whisper
+ </string>
+ <string name="anim_whistle">
+ Whistle
+ </string>
+ <string name="anim_express_wink">
+ Wink
+ </string>
+ <string name="anim_wink_hollywood">
+ Wink (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ Worry
+ </string>
+ <string name="anim_yes_happy">
+ Yes (Happy)
+ </string>
+ <string name="anim_yes_head">
+ 是
+ </string>
+ <string name="texture_loading">
+ 載入中...
+ </string>
+ <string name="worldmap_offline">
+ Offline
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ None found.
+ </string>
+ <string name="Ok">
+ 確定
+ </string>
+ <string name="Premature end of file">
+ Premature end of file
+ </string>
+ <string name="ST_NO_JOINT">
+ Can&apos;t find ROOT or JOINT.
+ </string>
+ <string name="whisper">
+ whispers:
+ </string>
+ <string name="shout">
+ shouts:
+ </string>
+ <string name="ringing">
+ Connecting to in-world Voice Chat...
+ </string>
+ <string name="connected">
+ Connected
+ </string>
+ <string name="unavailable">
+ Voice not available at your current location
+ </string>
+ <string name="hang_up">
+ Disconnected from in-world Voice Chat
+ </string>
+ <string name="reconnect_nearby">
+ You will now be reconnected to Nearby Voice Chat
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Take Linden dollars (L$) from you
+ </string>
+ <string name="ActOnControlInputs">
+ Act on your control inputs
+ </string>
+ <string name="RemapControlInputs">
+ Remap your control inputs
+ </string>
+ <string name="AnimateYourAvatar">
+ Animate your avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Attach to your avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Release ownership and become public
+ </string>
+ <string name="LinkAndDelink">
+ Link and delink from other objects
+ </string>
+ <string name="AddAndRemoveJoints">
+ Add and remove joints with other objects
+ </string>
+ <string name="ChangePermissions">
+ Change its permissions
+ </string>
+ <string name="TrackYourCamera">
+ Track your camera
+ </string>
+ <string name="ControlYourCamera">
+ Control your camera
+ </string>
+ <string name="NotConnected">
+ Not Connected
+ </string>
+ <string name="SIM_ACCESS_PG">
+ 一般
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderate
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adult
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Offline
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ 未知
+ </string>
+ <string name="land_type_unknown">
+ (未知)
+ </string>
+ <string name="Estate / Full Region">
+ Estate / Full Region
+ </string>
+ <string name="Estate / Homestead">
+ Estate / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Mainland / Homestead
+ </string>
+ <string name="Mainland / Full Region">
+ Mainland / Full Region
+ </string>
+ <string name="all_files">
+ All Files
+ </string>
+ <string name="sound_files">
+ Sounds
+ </string>
+ <string name="animation_files">
+ Animations
+ </string>
+ <string name="image_files">
+ Images
+ </string>
+ <string name="save_file_verb">
+ Save
+ </string>
+ <string name="load_file_verb">
+ Load
+ </string>
+ <string name="targa_image_files">
+ Targa Images
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap Images
+ </string>
+ <string name="avi_movie_file">
+ AVI Movie File
+ </string>
+ <string name="xaf_animation_file">
+ XAF Anim File
+ </string>
+ <string name="xml_file">
+ XML File
+ </string>
+ <string name="raw_file">
+ RAW File
+ </string>
+ <string name="compressed_image_files">
+ Compressed Images
+ </string>
+ <string name="load_files">
+ Load Files
+ </string>
+ <string name="choose_the_directory">
+ Choose Directory
+ </string>
+ <string name="AvatarSetNotAway">
+ Not Away
+ </string>
+ <string name="AvatarSetAway">
+ Away
+ </string>
+ <string name="AvatarSetNotBusy">
+ Not Busy
+ </string>
+ <string name="AvatarSetBusy">
+ Busy
+ </string>
+ <string name="shape">
+ Shape
+ </string>
+ <string name="skin">
+ Skin
+ </string>
+ <string name="hair">
+ Hair
+ </string>
+ <string name="eyes">
+ 眼睛
+ </string>
+ <string name="shirt">
+ 襯衫
+ </string>
+ <string name="pants">
+ 褲子
+ </string>
+ <string name="shoes">
+ 鞋子
+ </string>
+ <string name="socks">
+ 襪子
+ </string>
+ <string name="jacket">
+ 夾克
+ </string>
+ <string name="gloves">
+ 手套
+ </string>
+ <string name="undershirt">
+ 內衣
+ </string>
+ <string name="underpants">
+ 內褲
+ </string>
+ <string name="skirt">
+ 裙子
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ 刺青
+ </string>
+ <string name="physics">
+ Physics
+ </string>
+ <string name="invalid">
+ invalid
+ </string>
+ <string name="none">
+ 無
+ </string>
+ <string name="shirt_not_worn">
+ Shirt not worn
+ </string>
+ <string name="pants_not_worn">
+ Pants not worn
+ </string>
+ <string name="shoes_not_worn">
+ Shoes not worn
+ </string>
+ <string name="socks_not_worn">
+ Socks not worn
+ </string>
+ <string name="jacket_not_worn">
+ Jacket not worn
+ </string>
+ <string name="gloves_not_worn">
+ Gloves not worn
+ </string>
+ <string name="undershirt_not_worn">
+ Undershirt not worn
+ </string>
+ <string name="underpants_not_worn">
+ Underpants not worn
+ </string>
+ <string name="skirt_not_worn">
+ Skirt not worn
+ </string>
+ <string name="alpha_not_worn">
+ Alpha not worn
+ </string>
+ <string name="tattoo_not_worn">
+ Tattoo not worn
+ </string>
+ <string name="physics_not_worn">
+ Physics not worn
+ </string>
+ <string name="invalid_not_worn">
+ invalid
+ </string>
+ <string name="create_new_shape">
+ Create new shape
+ </string>
+ <string name="create_new_skin">
+ Create new skin
+ </string>
+ <string name="create_new_hair">
+ Create new hair
+ </string>
+ <string name="create_new_eyes">
+ Create new eyes
+ </string>
+ <string name="create_new_shirt">
+ Create new shirt
+ </string>
+ <string name="create_new_pants">
+ Create new pants
+ </string>
+ <string name="create_new_shoes">
+ Create new shoes
+ </string>
+ <string name="create_new_socks">
+ Create new socks
+ </string>
+ <string name="create_new_jacket">
+ Create new jacket
+ </string>
+ <string name="create_new_gloves">
+ Create new gloves
+ </string>
+ <string name="create_new_undershirt">
+ Create new undershirt
+ </string>
+ <string name="create_new_underpants">
+ Create new underpants
+ </string>
+ <string name="create_new_skirt">
+ Create new skirt
+ </string>
+ <string name="create_new_alpha">
+ Create new alpha
+ </string>
+ <string name="create_new_tattoo">
+ Create new tattoo
+ </string>
+ <string name="create_new_physics">
+ Create new physics
+ </string>
+ <string name="create_new_invalid">
+ invalid
+ </string>
+ <string name="NewWearable">
+ New [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Next
+ </string>
+ <string name="ok">
+ 確定
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Group Notice
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Group Notices
+ </string>
+ <string name="GroupNotifySentBy">
+ Sent by
+ </string>
+ <string name="GroupNotifyAttached">
+ Attached:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ View past notices or opt-out of receiving these messages here.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Open Attachment
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Save Attachment
+ </string>
+ <string name="TeleportOffer">
+ Teleport offering
+ </string>
+ <string name="StartUpNotifications">
+ New notifications arrived while you were away.
+ </string>
+ <string name="OverflowInfoChannelString">
+ You have %d more notification
+ </string>
+ <string name="BodyPartsRightArm">
+ Right Arm
+ </string>
+ <string name="BodyPartsHead">
+ Head
+ </string>
+ <string name="BodyPartsLeftArm">
+ Left Arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Left Leg
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </string>
+ <string name="BodyPartsRightLeg">
+ Right Leg
+ </string>
+ <string name="GraphicsQualityLow">
+ Low
+ </string>
+ <string name="GraphicsQualityMid">
+ Mid
+ </string>
+ <string name="GraphicsQualityHigh">
+ High
+ </string>
+ <string name="LeaveMouselook">
+ Press ESC to return to World View
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Drag a landmark here to add it to your favorites.
+ </string>
+ <string name="InventoryNoTexture">
+ You do not have a copy of this texture in your inventory
+ </string>
+ <string name="no_transfer" value="(no transfer)"/>
+ <string name="no_modify" value="(no modify)"/>
+ <string name="no_copy" value="(no copy)"/>
+ <string name="worn" value="(worn)"/>
+ <string name="link" value="(link)"/>
+ <string name="broken_link" value="(broken_link)"/>
+ <string name="LoadingContents">
+ Loading contents...
+ </string>
+ <string name="NoContents">
+ No contents
+ </string>
+ <string name="WornOnAttachmentPoint" value="(worn on [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (active)"/>
+ <string name="PermYes">
+ 是
+ </string>
+ <string name="PermNo">
+ 否
+ </string>
+ <string name="Chat Message" value="Chat :"/>
+ <string name="Sound" value="Sound :"/>
+ <string name="Wait" value="--- Wait :"/>
+ <string name="AnimFlagStop" value="Stop Animation :"/>
+ <string name="AnimFlagStart" value="Start Animation :"/>
+ <string name="Wave" value="Wave"/>
+ <string name="GestureActionNone" value="無"/>
+ <string name="HelloAvatar" value="Hello, avatar!"/>
+ <string name="ViewAllGestures" value="察看全部 &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Get More &gt;&gt;"/>
+ <string name="Animations" value="Animations,"/>
+ <string name="Calling Cards" value="Calling Cards,"/>
+ <string name="Clothing" value="Clothing,"/>
+ <string name="Gestures" value="Gestures,"/>
+ <string name="Landmarks" value="Landmarks,"/>
+ <string name="Notecards" value="Notecards,"/>
+ <string name="Objects" value="Objects,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sounds,"/>
+ <string name="Textures" value="Textures,"/>
+ <string name="Snapshots" value="Snapshots,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- Since Logoff"/>
+ <string name="InvFolder My Inventory">
+ My Inventory
+ </string>
+ <string name="InvFolder My Favorites">
+ My Favorites
+ </string>
+ <string name="InvFolder Library">
+ Library
+ </string>
+ <string name="InvFolder Textures">
+ Textures
+ </string>
+ <string name="InvFolder Sounds">
+ Sounds
+ </string>
+ <string name="InvFolder Calling Cards">
+ Calling Cards
+ </string>
+ <string name="InvFolder Landmarks">
+ Landmarks
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Clothing
+ </string>
+ <string name="InvFolder Objects">
+ Objects
+ </string>
+ <string name="InvFolder Notecards">
+ Notecards
+ </string>
+ <string name="InvFolder New Folder">
+ 新資料夾
+ </string>
+ <string name="InvFolder Inventory">
+ Inventory
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Uncompressed Images
+ </string>
+ <string name="InvFolder Body Parts">
+ Body Parts
+ </string>
+ <string name="InvFolder Trash">
+ Trash
+ </string>
+ <string name="InvFolder Photo Album">
+ Photo Album
+ </string>
+ <string name="InvFolder Lost And Found">
+ Lost And Found
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Uncompressed Sounds
+ </string>
+ <string name="InvFolder Animations">
+ Animations
+ </string>
+ <string name="InvFolder Gestures">
+ Gestures
+ </string>
+ <string name="InvFolder Favorite">
+ Favorites
+ </string>
+ <string name="InvFolder favorite">
+ Favorites
+ </string>
+ <string name="InvFolder Current Outfit">
+ Current Outfit
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Initial Outfits
+ </string>
+ <string name="InvFolder My Outfits">
+ My Outfits
+ </string>
+ <string name="InvFolder Accessories">
+ Accessories
+ </string>
+ <string name="InvFolder Friends">
+ Friends
+ </string>
+ <string name="InvFolder All">
+ 全部
+ </string>
+ <string name="Buy">
+ 購買
+ </string>
+ <string name="BuyforL$">
+ Buy for L$
+ </string>
+ <string name="Stone">
+ Stone
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Glass
+ </string>
+ <string name="Wood">
+ Wood
+ </string>
+ <string name="Flesh">
+ Flesh
+ </string>
+ <string name="Plastic">
+ Plastic
+ </string>
+ <string name="Rubber">
+ Rubber
+ </string>
+ <string name="Light">
+ Light
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Chest
+ </string>
+ <string name="Skull">
+ Skull
+ </string>
+ <string name="Left Shoulder">
+ Left Shoulder
+ </string>
+ <string name="Right Shoulder">
+ Right Shoulder
+ </string>
+ <string name="Left Hand">
+ Left Hand
+ </string>
+ <string name="Right Hand">
+ Right Hand
+ </string>
+ <string name="Left Foot">
+ Left Foot
+ </string>
+ <string name="Right Foot">
+ Right Foot
+ </string>
+ <string name="Spine">
+ Spine
+ </string>
+ <string name="Pelvis">
+ Pelvis
+ </string>
+ <string name="Mouth">
+ Mouth
+ </string>
+ <string name="Chin">
+ Chin
+ </string>
+ <string name="Left Ear">
+ Left Ear
+ </string>
+ <string name="Right Ear">
+ Right Ear
+ </string>
+ <string name="Left Eyeball">
+ Left Eyeball
+ </string>
+ <string name="Right Eyeball">
+ Right Eyeball
+ </string>
+ <string name="Nose">
+ Nose
+ </string>
+ <string name="R Upper Arm">
+ R Upper Arm
+ </string>
+ <string name="R Forearm">
+ R Forearm
+ </string>
+ <string name="L Upper Arm">
+ L Upper Arm
+ </string>
+ <string name="L Forearm">
+ L Forearm
+ </string>
+ <string name="Right Hip">
+ Right Hip
+ </string>
+ <string name="R Upper Leg">
+ R Upper Leg
+ </string>
+ <string name="R Lower Leg">
+ R Lower Leg
+ </string>
+ <string name="Left Hip">
+ Left Hip
+ </string>
+ <string name="L Upper Leg">
+ L Upper Leg
+ </string>
+ <string name="L Lower Leg">
+ L Lower Leg
+ </string>
+ <string name="Stomach">
+ Stomach
+ </string>
+ <string name="Left Pec">
+ Left Pec
+ </string>
+ <string name="Right Pec">
+ Right Pec
+ </string>
+ <string name="Invalid Attachment">
+ Invalid Attachment Point
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] old
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] old
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] old
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] old
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] old
+ </string>
+ <string name="TodayOld">
+ Joined today
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] year
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] years
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] years
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] month
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] months
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] months
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] week
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] weeks
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] weeks
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] day
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] days
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] days
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] member
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] members
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] members
+ </string>
+ <string name="AcctTypeResident">
+ Resident
+ </string>
+ <string name="AcctTypeTrial">
+ Trial
+ </string>
+ <string name="AcctTypeCharterMember">
+ Charter Member
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab Employee
+ </string>
+ <string name="PaymentInfoUsed">
+ Payment Info Used
+ </string>
+ <string name="PaymentInfoOnFile">
+ Payment Info On File
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No Payment Info On File
+ </string>
+ <string name="AgeVerified">
+ Age-verified
+ </string>
+ <string name="NotAgeVerified">
+ Not Age-verified
+ </string>
+ <string name="Center 2">
+ Center 2
+ </string>
+ <string name="Top Right">
+ Top Right
+ </string>
+ <string name="Top">
+ Top
+ </string>
+ <string name="Top Left">
+ Top Left
+ </string>
+ <string name="Center">
+ Center
+ </string>
+ <string name="Bottom Left">
+ Bottom Left
+ </string>
+ <string name="Bottom">
+ Bottom
+ </string>
+ <string name="Bottom Right">
+ Bottom Right
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Downloaded, now compiling
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script not found on server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problem downloading
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Insufficient permissions to download a script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Insufficient permissions for
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Unknown failure to download
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilation Progress
+ </string>
+ <string name="CompileQueueStart">
+ recompile
+ </string>
+ <string name="ResetQueueTitle">
+ Reset Progress
+ </string>
+ <string name="ResetQueueStart">
+ reset
+ </string>
+ <string name="RunQueueTitle">
+ Set Running Progress
+ </string>
+ <string name="RunQueueStart">
+ set running
+ </string>
+ <string name="NotRunQueueTitle">
+ Set Not Running Progress
+ </string>
+ <string name="NotRunQueueStart">
+ set not running
+ </string>
+ <string name="CompileSuccessful">
+ Compile successful!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compile successful, saving...
+ </string>
+ <string name="SaveComplete">
+ Save complete.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (object out of range)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Object [OBJECT] owned by [OWNER]
+ </string>
+ <string name="GroupsNone">
+ 無
+ </string>
+ <string name="Group" value="(group)"/>
+ <string name="Unknown">
+ (未知)
+ </string>
+ <string name="SummaryForTheWeek" value="Summary for this week, beginning on"/>
+ <string name="NextStipendDay" value="The next stipend day is"/>
+ <string name="GroupIndividualShare" value="Group Individual Share"/>
+ <string name="GroupColumn" value="Group"/>
+ <string name="Balance">
+ Balance
+ </string>
+ <string name="Credits">
+ Credits
+ </string>
+ <string name="Debits">
+ Debits
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ No group data found for group
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ mainland
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ all estates owned by [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ all estates that you own
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ all estates that you manage for [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parcel Script Memory
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcels Listed: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memory used: [COUNT] kb out of [MAX] kb; [AVAILABLE] kb available
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memory used: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parcel Script URLs
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs used: [COUNT] out of [MAX]; [AVAILABLE] available
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs used: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Error requesting information
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ No Parcel Selected
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Error: script information is only available in your current region
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Retrieving information...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ You do not have permission to examine this parcel
+ </string>
+ <string name="SITTING_ON">
+ Sitting On
+ </string>
+ <string name="ATTACH_CHEST">
+ Chest
+ </string>
+ <string name="ATTACH_HEAD">
+ Head
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Left Shoulder
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Right Shoulder
+ </string>
+ <string name="ATTACH_LHAND">
+ Left Hand
+ </string>
+ <string name="ATTACH_RHAND">
+ Right Hand
+ </string>
+ <string name="ATTACH_LFOOT">
+ Left Foot
+ </string>
+ <string name="ATTACH_RFOOT">
+ Right Foot
+ </string>
+ <string name="ATTACH_BACK">
+ Back
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Mouth
+ </string>
+ <string name="ATTACH_CHIN">
+ Chin
+ </string>
+ <string name="ATTACH_LEAR">
+ Left Ear
+ </string>
+ <string name="ATTACH_REAR">
+ Right Ear
+ </string>
+ <string name="ATTACH_LEYE">
+ Left Eye
+ </string>
+ <string name="ATTACH_REYE">
+ Right Eye
+ </string>
+ <string name="ATTACH_NOSE">
+ Nose
+ </string>
+ <string name="ATTACH_RUARM">
+ Right Upper Arm
+ </string>
+ <string name="ATTACH_RLARM">
+ Right Lower Arm
+ </string>
+ <string name="ATTACH_LUARM">
+ Left Upper Arm
+ </string>
+ <string name="ATTACH_LLARM">
+ Left Lower Arm
+ </string>
+ <string name="ATTACH_RHIP">
+ Right Hip
+ </string>
+ <string name="ATTACH_RULEG">
+ Right Upper Leg
+ </string>
+ <string name="ATTACH_RLLEG">
+ Right Lower Leg
+ </string>
+ <string name="ATTACH_LHIP">
+ Left Hip
+ </string>
+ <string name="ATTACH_LULEG">
+ Left Upper Leg
+ </string>
+ <string name="ATTACH_LLLEG">
+ Left Lower Leg
+ </string>
+ <string name="ATTACH_BELLY">
+ Belly
+ </string>
+ <string name="ATTACH_RPEC">
+ Right Pec
+ </string>
+ <string name="ATTACH_LPEC">
+ Left Pec
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Center 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD Top Right
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD Top Center
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD Top Left
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Center 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD Bottom Left
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD Bottom
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD Bottom Right
+ </string>
+ <string name="CursorPos">
+ Line [LINE], Column [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] found
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Content of object
+ </string>
+ <string name="PanelContentsNewScript">
+ New Script
+ </string>
+ <string name="BusyModeResponseDefault">
+ The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.
+ </string>
+ <string name="MuteByName">
+ (By name)
+ </string>
+ <string name="MuteAgent">
+ (Resident)
+ </string>
+ <string name="MuteObject">
+ (Object)
+ </string>
+ <string name="MuteGroup">
+ (Group)
+ </string>
+ <string name="MuteExternal">
+ (External)
+ </string>
+ <string name="RegionNoCovenant">
+ There is no Covenant provided for this Estate.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.
+ </string>
+ <string name="covenant_last_modified" value="Last Modified:"/>
+ <string name="none_text" value="(無)"/>
+ <string name="never_text" value="(never)"/>
+ <string name="GroupOwned">
+ Group Owned
+ </string>
+ <string name="Public">
+ Public
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (will update after publish)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ You haven&apos;t created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ User has no picks or classifieds
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ 載入中...
+ </string>
+ <string name="MultiPreviewTitle">
+ 預覽
+ </string>
+ <string name="MultiPropertiesTitle">
+ Properties
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ An object named
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ owned by the group
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ owned by an unknown group
+ </string>
+ <string name="InvOfferOwnedBy">
+ owned by
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ owned by an unknown user
+ </string>
+ <string name="InvOfferGaveYou">
+ gave you
+ </string>
+ <string name="InvOfferDecline">
+ You decline [DESC] from &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ bought
+ </string>
+ <string name="GroupMoneyPaidYou">
+ paid you
+ </string>
+ <string name="GroupMoneyPaidInto">
+ paid into
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ bought pass to
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ paid fee for event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ paid prize for event
+ </string>
+ <string name="GroupMoneyBalance">
+ Balance
+ </string>
+ <string name="GroupMoneyCredits">
+ Credits
+ </string>
+ <string name="GroupMoneyDebits">
+ Debits
+ </string>
+ <string name="ViewerObjectContents">
+ Contents
+ </string>
+ <string name="AcquiredItems">
+ Acquired Items
+ </string>
+ <string name="Cancel">
+ 取銷
+ </string>
+ <string name="UploadingCosts">
+ Uploading [NAME] costs L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ Buying this costs L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Unknown file extension .%s
+Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ Block
+ </string>
+ <string name="MuteAvatar">
+ Block
+ </string>
+ <string name="UnmuteObject">
+ Unblock
+ </string>
+ <string name="UnmuteAvatar">
+ Unblock
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Add to My Landmarks...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Edit my Landmark...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ File Saved
+ </string>
+ <string name="Receiving">
+ Receiving
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Forward
+ </string>
+ <string name="Direction_Left">
+ Left
+ </string>
+ <string name="Direction_Right">
+ Right
+ </string>
+ <string name="Direction_Back">
+ Back
+ </string>
+ <string name="Direction_North">
+ North
+ </string>
+ <string name="Direction_South">
+ South
+ </string>
+ <string name="Direction_West">
+ West
+ </string>
+ <string name="Direction_East">
+ East
+ </string>
+ <string name="Direction_Up">
+ Up
+ </string>
+ <string name="Direction_Down">
+ Down
+ </string>
+ <string name="Any Category">
+ Any Category
+ </string>
+ <string name="Shopping">
+ Shopping
+ </string>
+ <string name="Land Rental">
+ Land Rental
+ </string>
+ <string name="Property Rental">
+ Property Rental
+ </string>
+ <string name="Special Attraction">
+ Special Attraction
+ </string>
+ <string name="New Products">
+ New Products
+ </string>
+ <string name="Employment">
+ Employment
+ </string>
+ <string name="Wanted">
+ Wanted
+ </string>
+ <string name="Service">
+ Service
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ 無
+ </string>
+ <string name="Linden Location">
+ Linden Location
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Arts &amp; Culture
+ </string>
+ <string name="Business">
+ Business
+ </string>
+ <string name="Educational">
+ Educational
+ </string>
+ <string name="Gaming">
+ Gaming
+ </string>
+ <string name="Hangout">
+ 聚會所
+ </string>
+ <string name="Newcomer Friendly">
+ Newcomer Friendly
+ </string>
+ <string name="Parks&amp;Nature">
+ Parks &amp; Nature
+ </string>
+ <string name="Residential">
+ Residential
+ </string>
+ <string name="Stage">
+ Stage
+ </string>
+ <string name="Other">
+ Other
+ </string>
+ <string name="Rental">
+ Rental
+ </string>
+ <string name="Any">
+ Any
+ </string>
+ <string name="You">
+ You
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ Multiple Media
+ </string>
+ <string name="Play Media">
+ Play/Pause Media
+ </string>
+ <string name="MBCmdLineError">
+ An error was found parsing the command line.
+Please see: http://wiki.secondlife.com/wiki/Client_parameters
+Error:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Command line usage:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] is unable to access a file that it needs.
+
+This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open.
+If this message persists, restart your computer and try again.
+If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it.
+ </string>
+ <string name="MBFatalError">
+ Fatal Error
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requires a processor with AltiVec (G4 or later).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] is already running.
+Check your task bar for a minimized copy of the program.
+If this message persists, restart your computer.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] appears to have frozen or crashed on the previous run.
+Would you like to send a crash report?
+ </string>
+ <string name="MBAlert">
+ Notification
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] is unable to detect DirectX 9.0b or greater.
+[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b.
+
+Do you wish to continue?
+ </string>
+ <string name="MBWarning">
+ Warning
+ </string>
+ <string name="MBNoAutoUpdate">
+ Automatic updating is not yet implemented for Linux.
+Please download the latest version from www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass failed
+ </string>
+ <string name="MBError">
+ Error
+ </string>
+ <string name="MBFullScreenErr">
+ Unable to run fullscreen at [WIDTH] x [HEIGHT].
+Running in window.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Shutdown Error while destroying window (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Shutdown Error
+ </string>
+ <string name="MBDevContextErr">
+ Can&apos;t make GL device context
+ </string>
+ <string name="MBPixelFmtErr">
+ Can&apos;t find suitable pixel format
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Can&apos;t get pixel format description
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] requires True Color (32-bit) to run.
+Please go to your computer&apos;s display settings and set the color mode to 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] is unable to run because it can&apos;t get an 8 bit alpha channel. Usually this is due to video card driver issues.
+Please make sure you have the latest video card drivers installed.
+Also be sure your monitor is set to True Color (32-bit) in Control Panels &gt; Display &gt; Settings.
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Can&apos;t set pixel format
+ </string>
+ <string name="MBGLContextErr">
+ Can&apos;t create GL rendering context
+ </string>
+ <string name="MBGLContextActErr">
+ Can&apos;t activate GL rendering context
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them.
+
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ 5 O&apos;Clock Shadow
+ </string>
+ <string name="All White">
+ All White
+ </string>
+ <string name="Anime Eyes">
+ Anime Eyes
+ </string>
+ <string name="Arced">
+ Arced
+ </string>
+ <string name="Arm Length">
+ Arm Length
+ </string>
+ <string name="Attached">
+ Attached
+ </string>
+ <string name="Attached Earlobes">
+ Attached Earlobes
+ </string>
+ <string name="Back Fringe">
+ Back Fringe
+ </string>
+ <string name="Baggy">
+ Baggy
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Beady Eyes
+ </string>
+ <string name="Belly Size">
+ Belly Size
+ </string>
+ <string name="Big">
+ Big
+ </string>
+ <string name="Big Butt">
+ Big Butt
+ </string>
+ <string name="Big Hair Back">
+ Big Hair: Back
+ </string>
+ <string name="Big Hair Front">
+ Big Hair: Front
+ </string>
+ <string name="Big Hair Top">
+ Big Hair: Top
+ </string>
+ <string name="Big Head">
+ Big Head
+ </string>
+ <string name="Big Pectorals">
+ Big Pectorals
+ </string>
+ <string name="Big Spikes">
+ Big Spikes
+ </string>
+ <string name="Black">
+ Black
+ </string>
+ <string name="Blonde">
+ Blonde
+ </string>
+ <string name="Blonde Hair">
+ Blonde Hair
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Blush Color
+ </string>
+ <string name="Blush Opacity">
+ Blush Opacity
+ </string>
+ <string name="Body Definition">
+ Body Definition
+ </string>
+ <string name="Body Fat">
+ Body Fat
+ </string>
+ <string name="Body Freckles">
+ Body Freckles
+ </string>
+ <string name="Body Thick">
+ Body Thick
+ </string>
+ <string name="Body Thickness">
+ Body Thickness
+ </string>
+ <string name="Body Thin">
+ Body Thin
+ </string>
+ <string name="Bow Legged">
+ Bow Legged
+ </string>
+ <string name="Breast Buoyancy">
+ Breast Buoyancy
+ </string>
+ <string name="Breast Cleavage">
+ Breast Cleavage
+ </string>
+ <string name="Breast Size">
+ Breast Size
+ </string>
+ <string name="Bridge Width">
+ Bridge Width
+ </string>
+ <string name="Broad">
+ Broad
+ </string>
+ <string name="Brow Size">
+ Brow Size
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Bugged Eyes
+ </string>
+ <string name="Bulbous">
+ Bulbous
+ </string>
+ <string name="Bulbous Nose">
+ Bulbous Nose
+ </string>
+ <string name="Breast Physics Mass">
+ Breast Mass
+ </string>
+ <string name="Breast Physics Smoothing">
+ Breast Smoothing
+ </string>
+ <string name="Breast Physics Gravity">
+ Breast Gravity
+ </string>
+ <string name="Breast Physics Drag">
+ Breast Drag
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Spring
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Gain
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Damping
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Spring
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Gain
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Damping
+ </string>
+ <string name="Belly Physics Mass">
+ Belly Mass
+ </string>
+ <string name="Belly Physics Smoothing">
+ Belly Smoothing
+ </string>
+ <string name="Belly Physics Gravity">
+ Belly Gravity
+ </string>
+ <string name="Belly Physics Drag">
+ Belly Drag
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Butt Physics Mass">
+ Butt Mass
+ </string>
+ <string name="Butt Physics Smoothing">
+ Butt Smoothing
+ </string>
+ <string name="Butt Physics Gravity">
+ Butt Gravity
+ </string>
+ <string name="Butt Physics Drag">
+ Butt Drag
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Max Effect
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Spring
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Gain
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Damping
+ </string>
+ <string name="Bushy Eyebrows">
+ Bushy Eyebrows
+ </string>
+ <string name="Bushy Hair">
+ Bushy Hair
+ </string>
+ <string name="Butt Size">
+ Butt Size
+ </string>
+ <string name="Butt Gravity">
+ Butt Gravity
+ </string>
+ <string name="bustle skirt">
+ Bustle Skirt
+ </string>
+ <string name="no bustle">
+ No Bustle
+ </string>
+ <string name="more bustle">
+ More Bustle
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Cheek Bones
+ </string>
+ <string name="Chest Size">
+ Chest Size
+ </string>
+ <string name="Chin Angle">
+ Chin Angle
+ </string>
+ <string name="Chin Cleft">
+ Chin Cleft
+ </string>
+ <string name="Chin Curtains">
+ Chin Curtains
+ </string>
+ <string name="Chin Depth">
+ Chin Depth
+ </string>
+ <string name="Chin Heavy">
+ Chin Heavy
+ </string>
+ <string name="Chin In">
+ Chin In
+ </string>
+ <string name="Chin Out">
+ Chin Out
+ </string>
+ <string name="Chin-Neck">
+ Chin-Neck
+ </string>
+ <string name="Clear">
+ 清除
+ </string>
+ <string name="Cleft">
+ Cleft
+ </string>
+ <string name="Close Set Eyes">
+ Close Set Eyes
+ </string>
+ <string name="Closed">
+ Closed
+ </string>
+ <string name="Closed Back">
+ Closed Back
+ </string>
+ <string name="Closed Front">
+ Closed Front
+ </string>
+ <string name="Closed Left">
+ Closed Left
+ </string>
+ <string name="Closed Right">
+ Closed Right
+ </string>
+ <string name="Coin Purse">
+ Coin Purse
+ </string>
+ <string name="Collar Back">
+ Collar Back
+ </string>
+ <string name="Collar Front">
+ Collar Front
+ </string>
+ <string name="Corner Down">
+ Corner Down
+ </string>
+ <string name="Corner Up">
+ Corner Up
+ </string>
+ <string name="Creased">
+ Creased
+ </string>
+ <string name="Crooked Nose">
+ Crooked Nose
+ </string>
+ <string name="Cuff Flare">
+ Cuff Flare
+ </string>
+ <string name="Dark">
+ Dark
+ </string>
+ <string name="Dark Green">
+ Dark Green
+ </string>
+ <string name="Darker">
+ Darker
+ </string>
+ <string name="Deep">
+ Deep
+ </string>
+ <string name="Default Heels">
+ Default Heels
+ </string>
+ <string name="Dense">
+ Dense
+ </string>
+ <string name="Double Chin">
+ Double Chin
+ </string>
+ <string name="Downturned">
+ Downturned
+ </string>
+ <string name="Duffle Bag">
+ Duffle Bag
+ </string>
+ <string name="Ear Angle">
+ Ear Angle
+ </string>
+ <string name="Ear Size">
+ Ear Size
+ </string>
+ <string name="Ear Tips">
+ Ear Tips
+ </string>
+ <string name="Egg Head">
+ Egg Head
+ </string>
+ <string name="Eye Bags">
+ Eye Bags
+ </string>
+ <string name="Eye Color">
+ Eye Color
+ </string>
+ <string name="Eye Depth">
+ Eye Depth
+ </string>
+ <string name="Eye Lightness">
+ Eye Lightness
+ </string>
+ <string name="Eye Opening">
+ Eye Opening
+ </string>
+ <string name="Eye Pop">
+ Eye Pop
+ </string>
+ <string name="Eye Size">
+ Eye Size
+ </string>
+ <string name="Eye Spacing">
+ Eye Spacing
+ </string>
+ <string name="Eyebrow Arc">
+ Eyebrow Arc
+ </string>
+ <string name="Eyebrow Density">
+ Eyebrow Density
+ </string>
+ <string name="Eyebrow Height">
+ Eyebrow Height
+ </string>
+ <string name="Eyebrow Points">
+ Eyebrow Points
+ </string>
+ <string name="Eyebrow Size">
+ Eyebrow Size
+ </string>
+ <string name="Eyelash Length">
+ Eyelash Length
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Eyeliner Color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Face Shear
+ </string>
+ <string name="Facial Definition">
+ Facial Definition
+ </string>
+ <string name="Far Set Eyes">
+ Far Set Eyes
+ </string>
+ <string name="Fat Lips">
+ Fat Lips
+ </string>
+ <string name="Female">
+ Female
+ </string>
+ <string name="Fingerless">
+ Fingerless
+ </string>
+ <string name="Fingers">
+ Fingers
+ </string>
+ <string name="Flared Cuffs">
+ Flared Cuffs
+ </string>
+ <string name="Flat">
+ Flat
+ </string>
+ <string name="Flat Butt">
+ Flat Butt
+ </string>
+ <string name="Flat Head">
+ Flat Head
+ </string>
+ <string name="Flat Toe">
+ Flat Toe
+ </string>
+ <string name="Foot Size">
+ Foot Size
+ </string>
+ <string name="Forehead Angle">
+ Forehead Angle
+ </string>
+ <string name="Forehead Heavy">
+ Forehead Heavy
+ </string>
+ <string name="Freckles">
+ Freckles
+ </string>
+ <string name="Front Fringe">
+ Front Fringe
+ </string>
+ <string name="Full Back">
+ Full Back
+ </string>
+ <string name="Full Eyeliner">
+ Full Eyeliner
+ </string>
+ <string name="Full Front">
+ Full Front
+ </string>
+ <string name="Full Hair Sides">
+ Full Hair Sides
+ </string>
+ <string name="Full Sides">
+ Full Sides
+ </string>
+ <string name="Glossy">
+ Glossy
+ </string>
+ <string name="Glove Fingers">
+ Glove Fingers
+ </string>
+ <string name="Glove Length">
+ Glove Length
+ </string>
+ <string name="Hair">
+ Hair
+ </string>
+ <string name="Hair Back">
+ Hair: Back
+ </string>
+ <string name="Hair Front">
+ Hair: Front
+ </string>
+ <string name="Hair Sides">
+ Hair: Sides
+ </string>
+ <string name="Hair Sweep">
+ Hair Sweep
+ </string>
+ <string name="Hair Thickess">
+ Hair Thickness
+ </string>
+ <string name="Hair Thickness">
+ Hair Thickness
+ </string>
+ <string name="Hair Tilt">
+ Hair Tilt
+ </string>
+ <string name="Hair Tilted Left">
+ Hair Tilted Left
+ </string>
+ <string name="Hair Tilted Right">
+ Hair Tilted Right
+ </string>
+ <string name="Hair Volume">
+ Hair: Volume
+ </string>
+ <string name="Hand Size">
+ Hand Size
+ </string>
+ <string name="Handlebars">
+ Handlebars
+ </string>
+ <string name="Head Length">
+ Head Length
+ </string>
+ <string name="Head Shape">
+ Head Shape
+ </string>
+ <string name="Head Size">
+ Head Size
+ </string>
+ <string name="Head Stretch">
+ Head Stretch
+ </string>
+ <string name="Heel Height">
+ Heel Height
+ </string>
+ <string name="Heel Shape">
+ Heel Shape
+ </string>
+ <string name="Height">
+ Height
+ </string>
+ <string name="High">
+ High
+ </string>
+ <string name="High Heels">
+ High Heels
+ </string>
+ <string name="High Jaw">
+ High Jaw
+ </string>
+ <string name="High Platforms">
+ High Platforms
+ </string>
+ <string name="High and Tight">
+ High and Tight
+ </string>
+ <string name="Higher">
+ Higher
+ </string>
+ <string name="Hip Length">
+ Hip Length
+ </string>
+ <string name="Hip Width">
+ Hip Width
+ </string>
+ <string name="In">
+ In
+ </string>
+ <string name="In Shdw Color">
+ Inner Shadow Color
+ </string>
+ <string name="In Shdw Opacity">
+ Inner Shadow Opacity
+ </string>
+ <string name="Inner Eye Corner">
+ Inner Eye Corner
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Inner Shadow
+ </string>
+ <string name="Jacket Length">
+ Jacket Length
+ </string>
+ <string name="Jacket Wrinkles">
+ Jacket Wrinkles
+ </string>
+ <string name="Jaw Angle">
+ Jaw Angle
+ </string>
+ <string name="Jaw Jut">
+ Jaw Jut
+ </string>
+ <string name="Jaw Shape">
+ Jaw Shape
+ </string>
+ <string name="Join">
+ Join
+ </string>
+ <string name="Jowls">
+ Jowls
+ </string>
+ <string name="Knee Angle">
+ Knee Angle
+ </string>
+ <string name="Knock Kneed">
+ Knock Kneed
+ </string>
+ <string name="Large">
+ Large
+ </string>
+ <string name="Large Hands">
+ Large Hands
+ </string>
+ <string name="Left Part">
+ Left Part
+ </string>
+ <string name="Leg Length">
+ Leg Length
+ </string>
+ <string name="Leg Muscles">
+ Leg Muscles
+ </string>
+ <string name="Less">
+ Less
+ </string>
+ <string name="Less Body Fat">
+ Less Body Fat
+ </string>
+ <string name="Less Curtains">
+ Less Curtains
+ </string>
+ <string name="Less Freckles">
+ Less Freckles
+ </string>
+ <string name="Less Full">
+ Less Full
+ </string>
+ <string name="Less Gravity">
+ Less Gravity
+ </string>
+ <string name="Less Love">
+ Less Love
+ </string>
+ <string name="Less Muscles">
+ Less Muscles
+ </string>
+ <string name="Less Muscular">
+ Less Muscular
+ </string>
+ <string name="Less Rosy">
+ Less Rosy
+ </string>
+ <string name="Less Round">
+ Less Round
+ </string>
+ <string name="Less Saddle">
+ Less Saddle
+ </string>
+ <string name="Less Square">
+ Less Square
+ </string>
+ <string name="Less Volume">
+ Less Volume
+ </string>
+ <string name="Less soul">
+ Less soul
+ </string>
+ <string name="Lighter">
+ Lighter
+ </string>
+ <string name="Lip Cleft">
+ Lip Cleft
+ </string>
+ <string name="Lip Cleft Depth">
+ Lip Cleft Depth
+ </string>
+ <string name="Lip Fullness">
+ Lip Fullness
+ </string>
+ <string name="Lip Pinkness">
+ Lip Pinkness
+ </string>
+ <string name="Lip Ratio">
+ Lip Ratio
+ </string>
+ <string name="Lip Thickness">
+ Lip Thickness
+ </string>
+ <string name="Lip Width">
+ Lip Width
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Lipstick
+ </string>
+ <string name="Lipstick Color">
+ Lipstick Color
+ </string>
+ <string name="Long">
+ Long
+ </string>
+ <string name="Long Head">
+ Long Head
+ </string>
+ <string name="Long Hips">
+ Long Hips
+ </string>
+ <string name="Long Legs">
+ Long Legs
+ </string>
+ <string name="Long Neck">
+ Long Neck
+ </string>
+ <string name="Long Pigtails">
+ Long Pigtails
+ </string>
+ <string name="Long Ponytail">
+ Long Ponytail
+ </string>
+ <string name="Long Torso">
+ Long Torso
+ </string>
+ <string name="Long arms">
+ Long arms
+ </string>
+ <string name="Loose Pants">
+ Loose Pants
+ </string>
+ <string name="Loose Shirt">
+ Loose Shirt
+ </string>
+ <string name="Loose Sleeves">
+ Loose Sleeves
+ </string>
+ <string name="Love Handles">
+ Love Handles
+ </string>
+ <string name="Low">
+ Low
+ </string>
+ <string name="Low Heels">
+ Low Heels
+ </string>
+ <string name="Low Jaw">
+ Low Jaw
+ </string>
+ <string name="Low Platforms">
+ Low Platforms
+ </string>
+ <string name="Low and Loose">
+ Low and Loose
+ </string>
+ <string name="Lower">
+ Lower
+ </string>
+ <string name="Lower Bridge">
+ Lower Bridge
+ </string>
+ <string name="Lower Cheeks">
+ Lower Cheeks
+ </string>
+ <string name="Male">
+ 男性
+ </string>
+ <string name="Middle Part">
+ Middle Part
+ </string>
+ <string name="More">
+ More
+ </string>
+ <string name="More Blush">
+ More Blush
+ </string>
+ <string name="More Body Fat">
+ More Body Fat
+ </string>
+ <string name="More Curtains">
+ More Curtains
+ </string>
+ <string name="More Eyeshadow">
+ More Eyeshadow
+ </string>
+ <string name="More Freckles">
+ More Freckles
+ </string>
+ <string name="More Full">
+ More Full
+ </string>
+ <string name="More Gravity">
+ More Gravity
+ </string>
+ <string name="More Lipstick">
+ More Lipstick
+ </string>
+ <string name="More Love">
+ More Love
+ </string>
+ <string name="More Lower Lip">
+ More Lower Lip
+ </string>
+ <string name="More Muscles">
+ More Muscles
+ </string>
+ <string name="More Muscular">
+ More Muscular
+ </string>
+ <string name="More Rosy">
+ More Rosy
+ </string>
+ <string name="More Round">
+ More Round
+ </string>
+ <string name="More Saddle">
+ More Saddle
+ </string>
+ <string name="More Sloped">
+ More Sloped
+ </string>
+ <string name="More Square">
+ More Square
+ </string>
+ <string name="More Upper Lip">
+ More Upper Lip
+ </string>
+ <string name="More Vertical">
+ More Vertical
+ </string>
+ <string name="More Volume">
+ More Volume
+ </string>
+ <string name="More soul">
+ More soul
+ </string>
+ <string name="Moustache">
+ Moustache
+ </string>
+ <string name="Mouth Corner">
+ Mouth Corner
+ </string>
+ <string name="Mouth Position">
+ Mouth Position
+ </string>
+ <string name="Mowhawk">
+ Mowhawk
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Mutton Chops
+ </string>
+ <string name="Nail Polish">
+ Nail Polish
+ </string>
+ <string name="Nail Polish Color">
+ Nail Polish Color
+ </string>
+ <string name="Narrow">
+ Narrow
+ </string>
+ <string name="Narrow Back">
+ Narrow Back
+ </string>
+ <string name="Narrow Front">
+ Narrow Front
+ </string>
+ <string name="Narrow Lips">
+ Narrow Lips
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Neck Length
+ </string>
+ <string name="Neck Thickness">
+ Neck Thickness
+ </string>
+ <string name="No Blush">
+ No Blush
+ </string>
+ <string name="No Eyeliner">
+ No Eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ No Eyeshadow
+ </string>
+ <string name="No Lipgloss">
+ No Lipgloss
+ </string>
+ <string name="No Lipstick">
+ No Lipstick
+ </string>
+ <string name="No Part">
+ No Part
+ </string>
+ <string name="No Polish">
+ No Polish
+ </string>
+ <string name="No Red">
+ No Red
+ </string>
+ <string name="No Spikes">
+ No Spikes
+ </string>
+ <string name="No White">
+ No White
+ </string>
+ <string name="No Wrinkles">
+ No Wrinkles
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nose Left
+ </string>
+ <string name="Nose Right">
+ Nose Right
+ </string>
+ <string name="Nose Size">
+ Nose Size
+ </string>
+ <string name="Nose Thickness">
+ Nose Thickness
+ </string>
+ <string name="Nose Tip Angle">
+ Nose Tip Angle
+ </string>
+ <string name="Nose Tip Shape">
+ Nose Tip Shape
+ </string>
+ <string name="Nose Width">
+ Nose Width
+ </string>
+ <string name="Nostril Division">
+ Nostril Division
+ </string>
+ <string name="Nostril Width">
+ Nostril Width
+ </string>
+ <string name="Opaque">
+ Opaque
+ </string>
+ <string name="Open">
+ Open
+ </string>
+ <string name="Open Back">
+ Open Back
+ </string>
+ <string name="Open Front">
+ Open Front
+ </string>
+ <string name="Open Left">
+ Open Left
+ </string>
+ <string name="Open Right">
+ Open Right
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Out
+ </string>
+ <string name="Out Shdw Color">
+ Outer Shadow Color
+ </string>
+ <string name="Out Shdw Opacity">
+ Outer Shadow Opacity
+ </string>
+ <string name="Outer Eye Corner">
+ Outer Eye Corner
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Outer Shadow
+ </string>
+ <string name="Overbite">
+ Overbite
+ </string>
+ <string name="Package">
+ Package
+ </string>
+ <string name="Painted Nails">
+ Painted Nails
+ </string>
+ <string name="Pale">
+ Pale
+ </string>
+ <string name="Pants Crotch">
+ Pants Crotch
+ </string>
+ <string name="Pants Fit">
+ Pants Fit
+ </string>
+ <string name="Pants Length">
+ Pants Length
+ </string>
+ <string name="Pants Waist">
+ Pants Waist
+ </string>
+ <string name="Pants Wrinkles">
+ Pants Wrinkles
+ </string>
+ <string name="Part">
+ Part
+ </string>
+ <string name="Part Bangs">
+ Part Bangs
+ </string>
+ <string name="Pectorals">
+ Pectorals
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Pigtails
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Pinker
+ </string>
+ <string name="Platform Height">
+ Platform Height
+ </string>
+ <string name="Platform Width">
+ Platform Width
+ </string>
+ <string name="Pointy">
+ Pointy
+ </string>
+ <string name="Pointy Heels">
+ Pointy Heels
+ </string>
+ <string name="Ponytail">
+ Ponytail
+ </string>
+ <string name="Poofy Skirt">
+ Poofy Skirt
+ </string>
+ <string name="Pop Left Eye">
+ Pop Left Eye
+ </string>
+ <string name="Pop Right Eye">
+ Pop Right Eye
+ </string>
+ <string name="Puffy">
+ Puffy
+ </string>
+ <string name="Puffy Eyelids">
+ Puffy Eyelids
+ </string>
+ <string name="Rainbow Color">
+ Rainbow Color
+ </string>
+ <string name="Red Hair">
+ Red Hair
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Right Part">
+ Right Part
+ </string>
+ <string name="Rosy Complexion">
+ Rosy Complexion
+ </string>
+ <string name="Round">
+ Round
+ </string>
+ <string name="Ruddiness">
+ Ruddiness
+ </string>
+ <string name="Ruddy">
+ Ruddy
+ </string>
+ <string name="Rumpled Hair">
+ Rumpled Hair
+ </string>
+ <string name="Saddle Bags">
+ Saddle Bags
+ </string>
+ <string name="Scrawny Leg">
+ Scrawny Leg
+ </string>
+ <string name="Separate">
+ Separate
+ </string>
+ <string name="Shallow">
+ Shallow
+ </string>
+ <string name="Shear Back">
+ Shear Back
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left Up">
+ Shear Left Up
+ </string>
+ <string name="Shear Right Up">
+ Shear Right Up
+ </string>
+ <string name="Sheared Back">
+ Sheared Back
+ </string>
+ <string name="Sheared Front">
+ Sheared Front
+ </string>
+ <string name="Shift Left">
+ Shift Left
+ </string>
+ <string name="Shift Mouth">
+ Shift Mouth
+ </string>
+ <string name="Shift Right">
+ Shift Right
+ </string>
+ <string name="Shirt Bottom">
+ Shirt Bottom
+ </string>
+ <string name="Shirt Fit">
+ Shirt Fit
+ </string>
+ <string name="Shirt Wrinkles">
+ Shirt Wrinkles
+ </string>
+ <string name="Shoe Height">
+ Shoe Height
+ </string>
+ <string name="Short">
+ Short
+ </string>
+ <string name="Short Arms">
+ Short Arms
+ </string>
+ <string name="Short Legs">
+ Short Legs
+ </string>
+ <string name="Short Neck">
+ Short Neck
+ </string>
+ <string name="Short Pigtails">
+ Short Pigtails
+ </string>
+ <string name="Short Ponytail">
+ Short Ponytail
+ </string>
+ <string name="Short Sideburns">
+ Short Sideburns
+ </string>
+ <string name="Short Torso">
+ Short Torso
+ </string>
+ <string name="Short hips">
+ Short hips
+ </string>
+ <string name="Shoulders">
+ Shoulders
+ </string>
+ <string name="Side Fringe">
+ Side Fringe
+ </string>
+ <string name="Sideburns">
+ Sideburns
+ </string>
+ <string name="Sides Hair">
+ Sides Hair
+ </string>
+ <string name="Sides Hair Down">
+ Sides Hair Down
+ </string>
+ <string name="Sides Hair Up">
+ Sides Hair Up
+ </string>
+ <string name="Skinny Neck">
+ Skinny Neck
+ </string>
+ <string name="Skirt Fit">
+ Skirt Fit
+ </string>
+ <string name="Skirt Length">
+ Skirt Length
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Sleeve Length
+ </string>
+ <string name="Sleeve Looseness">
+ Sleeve Looseness
+ </string>
+ <string name="Slit Back">
+ Slit: Back
+ </string>
+ <string name="Slit Front">
+ Slit: Front
+ </string>
+ <string name="Slit Left">
+ Slit: Left
+ </string>
+ <string name="Slit Right">
+ Slit: Right
+ </string>
+ <string name="Small">
+ Small
+ </string>
+ <string name="Small Hands">
+ Small Hands
+ </string>
+ <string name="Small Head">
+ Small Head
+ </string>
+ <string name="Smooth">
+ Smooth
+ </string>
+ <string name="Smooth Hair">
+ Smooth Hair
+ </string>
+ <string name="Socks Length">
+ Socks Length
+ </string>
+ <string name="Soulpatch">
+ Soulpatch
+ </string>
+ <string name="Sparse">
+ Sparse
+ </string>
+ <string name="Spiked Hair">
+ Spiked Hair
+ </string>
+ <string name="Square">
+ Square
+ </string>
+ <string name="Square Toe">
+ Square Toe
+ </string>
+ <string name="Squash Head">
+ Squash Head
+ </string>
+ <string name="Stretch Head">
+ Stretch Head
+ </string>
+ <string name="Sunken">
+ Sunken
+ </string>
+ <string name="Sunken Chest">
+ Sunken Chest
+ </string>
+ <string name="Sunken Eyes">
+ Sunken Eyes
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Tall
+ </string>
+ <string name="Taper Back">
+ Taper Back
+ </string>
+ <string name="Taper Front">
+ Taper Front
+ </string>
+ <string name="Thick Heels">
+ Thick Heels
+ </string>
+ <string name="Thick Neck">
+ Thick Neck
+ </string>
+ <string name="Thick Toe">
+ Thick Toe
+ </string>
+ <string name="Thin">
+ Thin
+ </string>
+ <string name="Thin Eyebrows">
+ Thin Eyebrows
+ </string>
+ <string name="Thin Lips">
+ Thin Lips
+ </string>
+ <string name="Thin Nose">
+ Thin Nose
+ </string>
+ <string name="Tight Chin">
+ Tight Chin
+ </string>
+ <string name="Tight Cuffs">
+ Tight Cuffs
+ </string>
+ <string name="Tight Pants">
+ Tight Pants
+ </string>
+ <string name="Tight Shirt">
+ Tight Shirt
+ </string>
+ <string name="Tight Skirt">
+ Tight Skirt
+ </string>
+ <string name="Tight Sleeves">
+ Tight Sleeves
+ </string>
+ <string name="Toe Shape">
+ Toe Shape
+ </string>
+ <string name="Toe Thickness">
+ Toe Thickness
+ </string>
+ <string name="Torso Length">
+ Torso Length
+ </string>
+ <string name="Torso Muscles">
+ Torso Muscles
+ </string>
+ <string name="Torso Scrawny">
+ Torso Scrawny
+ </string>
+ <string name="Unattached">
+ Unattached
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Underbite
+ </string>
+ <string name="Unnatural">
+ Unnatural
+ </string>
+ <string name="Upper Bridge">
+ Upper Bridge
+ </string>
+ <string name="Upper Cheeks">
+ Upper Cheeks
+ </string>
+ <string name="Upper Chin Cleft">
+ Upper Chin Cleft
+ </string>
+ <string name="Upper Eyelid Fold">
+ Upper Eyelid Fold
+ </string>
+ <string name="Upturned">
+ Upturned
+ </string>
+ <string name="Very Red">
+ Very Red
+ </string>
+ <string name="Waist Height">
+ Waist Height
+ </string>
+ <string name="Well-Fed">
+ Well-Fed
+ </string>
+ <string name="White Hair">
+ White Hair
+ </string>
+ <string name="Wide">
+ Wide
+ </string>
+ <string name="Wide Back">
+ Wide Back
+ </string>
+ <string name="Wide Front">
+ Wide Front
+ </string>
+ <string name="Wide Lips">
+ Wide Lips
+ </string>
+ <string name="Wild">
+ Wild
+ </string>
+ <string name="Wrinkles">
+ Wrinkles
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Add to My Landmarks
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Edit my Landmark
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ See more info about the current location
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ My location history
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ 購買這塊土地
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Voice not available here
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Flying not allowed
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ No pushing
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Building/dropping objects not allowed
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Scripts not allowed
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Health
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adult Region
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate Region
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ General Region
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Update
+ </string>
+ <string name="UpdaterNowUpdating">
+ Now updating [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installing [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Downloading update...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Downloading update
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Failed to download update
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Failed to install update
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Failed to start viewer
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds
+ </string>
+ <string name="IM_logging_string">
+ -- Instant message logging enabled --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] is typing...
+ </string>
+ <string name="Unnamed">
+ (Unnamed)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderated: Voices off by default)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Text chat is not available for this call.
+ </string>
+ <string name="IM_muted_text_label">
+ Your text chat has been disabled by a Group Moderator.
+ </string>
+ <string name="IM_default_text_label">
+ Click here to instant message.
+ </string>
+ <string name="IM_to_label">
+ To
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
+ </string>
+ <string name="Saved_message">
+ (Saved [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Your call has been answered
+ </string>
+ <string name="you_started_call">
+ You started a voice call
+ </string>
+ <string name="you_joined_call">
+ You joined the voice call
+ </string>
+ <string name="name_started_call">
+ [NAME] started a voice call
+ </string>
+ <string name="ringing-im">
+ Joining voice call...
+ </string>
+ <string name="connected-im">
+ Connected, click Leave Call to hang up
+ </string>
+ <string name="hang_up-im">
+ Left voice call
+ </string>
+ <string name="answering-im">
+ Connecting...
+ </string>
+ <string name="conference-title">
+ Ad-hoc Conference
+ </string>
+ <string name="conference-title-incoming">
+ Conference with [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Inventory item offered
+ </string>
+ <string name="share_alert">
+ Drag items from inventory here
+ </string>
+ <string name="no_session_message">
+ (IM Session Doesn&apos;t Exist)
+ </string>
+ <string name="only_user_message">
+ You are the only user in this session.
+ </string>
+ <string name="offline_message">
+ [NAME] is offline.
+ </string>
+ <string name="invite_message">
+ Click the [BUTTON NAME] button to accept/connect to this voice chat.
+ </string>
+ <string name="muted_message">
+ You have blocked this Resident. Sending a message will automatically unblock them.
+ </string>
+ <string name="generic">
+ Error making request, please try again later.
+ </string>
+ <string name="generic_request_error">
+ Error making request, please try again later.
+ </string>
+ <string name="insufficient_perms_error">
+ You do not have sufficient permissions.
+ </string>
+ <string name="session_does_not_exist_error">
+ The session no longer exists
+ </string>
+ <string name="no_ability_error">
+ You do not have that ability.
+ </string>
+ <string name="no_ability">
+ You do not have that ability.
+ </string>
+ <string name="not_a_mod_error">
+ You are not a session moderator.
+ </string>
+ <string name="muted">
+ A group moderator disabled your text chat.
+ </string>
+ <string name="muted_error">
+ A group moderator disabled your text chat.
+ </string>
+ <string name="add_session_event">
+ Unable to add users to chat session with [RECIPIENT].
+ </string>
+ <string name="message">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
+ <string name="mute">
+ Error while moderating.
+ </string>
+ <string name="removed">
+ You have been removed from the group.
+ </string>
+ <string name="removed_from_group">
+ You have been removed from the group.
+ </string>
+ <string name="close_on_no_ability">
+ You no longer have the ability to be in the chat session.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] has said something new
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] have said something new
+ </string>
+ <string name="session_initialization_timed_out_error">
+ The session initialization is timed out
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] paid you L$[AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] paid you L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ You paid [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ You paid L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ You paid [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ You paid L$[AMOUNT] [REASON].
+ </string>
+ <string name="for item">
+ for [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ for a parcel of land
+ </string>
+ <string name="for a land access pass">
+ for a land access pass
+ </string>
+ <string name="for deeding land">
+ for deeding land
+ </string>
+ <string name="to create a group">
+ to create a group
+ </string>
+ <string name="to join a group">
+ to join a group
+ </string>
+ <string name="to upload">
+ to upload
+ </string>
+ <string name="to publish a classified ad">
+ to publish a classified ad
+ </string>
+ <string name="giving">
+ Giving L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Uploading costs L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ This costs L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Buying selected land for L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ This object costs L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Everyone
+ </string>
+ <string name="group_role_officers">
+ Officers
+ </string>
+ <string name="group_role_owners">
+ Owners
+ </string>
+ <string name="group_member_status_online">
+ Online
+ </string>
+ <string name="uploading_abuse_report">
+ Uploading...
+
+Abuse Report
+ </string>
+ <string name="New Shape">
+ New Shape
+ </string>
+ <string name="New Skin">
+ New Skin
+ </string>
+ <string name="New Hair">
+ New Hair
+ </string>
+ <string name="New Eyes">
+ New Eyes
+ </string>
+ <string name="New Shirt">
+ 新襯衫
+ </string>
+ <string name="New Pants">
+ 新褲子
+ </string>
+ <string name="New Shoes">
+ 新鞋子
+ </string>
+ <string name="New Socks">
+ 新襪子
+ </string>
+ <string name="New Jacket">
+ 新夾克
+ </string>
+ <string name="New Gloves">
+ 新手套
+ </string>
+ <string name="New Undershirt">
+ 新內衣
+ </string>
+ <string name="New Underpants">
+ 新內褲
+ </string>
+ <string name="New Skirt">
+ 新裙子
+ </string>
+ <string name="New Alpha">
+ New Alpha
+ </string>
+ <string name="New Tattoo">
+ New Tattoo
+ </string>
+ <string name="New Physics">
+ New Physics
+ </string>
+ <string name="Invalid Wearable">
+ Invalid Wearable
+ </string>
+ <string name="New Gesture">
+ New Gesture
+ </string>
+ <string name="New Script">
+ New Script
+ </string>
+ <string name="New Note">
+ New Note
+ </string>
+ <string name="New Folder">
+ 新資料夾
+ </string>
+ <string name="Contents">
+ Contents
+ </string>
+ <string name="Gesture">
+ Gesture
+ </string>
+ <string name="Male Gestures">
+ Male Gestures
+ </string>
+ <string name="Female Gestures">
+ Female Gestures
+ </string>
+ <string name="Other Gestures">
+ Other Gestures
+ </string>
+ <string name="Speech Gestures">
+ Speech Gestures
+ </string>
+ <string name="Common Gestures">
+ Common Gestures
+ </string>
+ <string name="Male - Excuse me">
+ Male - Excuse me
+ </string>
+ <string name="Male - Get lost">
+ Male - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ Male - Blow kiss
+ </string>
+ <string name="Male - Boo">
+ Male - Boo
+ </string>
+ <string name="Male - Bored">
+ Male - Bored
+ </string>
+ <string name="Male - Hey">
+ Male - Hey
+ </string>
+ <string name="Male - Laugh">
+ Male - Laugh
+ </string>
+ <string name="Male - Repulsed">
+ Male - Repulsed
+ </string>
+ <string name="Male - Shrug">
+ Male - Shrug
+ </string>
+ <string name="Male - Stick tougue out">
+ Male - Stick tougue out
+ </string>
+ <string name="Male - Wow">
+ Male - Wow
+ </string>
+ <string name="Female - Chuckle">
+ Female - Chuckle
+ </string>
+ <string name="Female - Cry">
+ Female - Cry
+ </string>
+ <string name="Female - Embarrassed">
+ Female - Embarrassed
+ </string>
+ <string name="Female - Excuse me">
+ Female - Excuse me
+ </string>
+ <string name="Female - Get lost">
+ Female - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Female - Blow kiss
+ </string>
+ <string name="Female - Boo">
+ Female - Boo
+ </string>
+ <string name="Female - Bored">
+ Female - Bored
+ </string>
+ <string name="Female - Hey">
+ Female - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Female - Hey baby
+ </string>
+ <string name="Female - Laugh">
+ Female - Laugh
+ </string>
+ <string name="Female - Looking good">
+ Female - Looking good
+ </string>
+ <string name="Female - Over here">
+ Female - Over here
+ </string>
+ <string name="Female - Please">
+ Female - Please
+ </string>
+ <string name="Female - Repulsed">
+ Female - Repulsed
+ </string>
+ <string name="Female - Shrug">
+ Female - Shrug
+ </string>
+ <string name="Female - Stick tougue out">
+ Female - Stick tougue out
+ </string>
+ <string name="Female - Wow">
+ Female - Wow
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ 無/無
+ </string>
+ <string name="texture_load_dimensions_error">
+ Can&apos;t load images larger than [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Despite our best efforts, something unexpected has gone wrong.
+
+ Please check status.secondlifegrid.net to see if there is a known problem with the service.
+ If you continue to experience problems, please check your network and firewall setup.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Sun:Mon:Tue:Wed:Thu:Fri:Sat
+ </string>
+ <string name="dateTimeMonthNames">
+ January:February:March:April:May:June:July:August:September:October:November:December
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Membership">
+ Membership
+ </string>
+ <string name="Roles">
+ Roles
+ </string>
+ <string name="Group Identity">
+ Group Identity
+ </string>
+ <string name="Parcel Management">
+ Parcel Management
+ </string>
+ <string name="Parcel Identity">
+ Parcel Identity
+ </string>
+ <string name="Parcel Settings">
+ Parcel Settings
+ </string>
+ <string name="Parcel Powers">
+ Parcel Powers
+ </string>
+ <string name="Parcel Access">
+ Parcel Access
+ </string>
+ <string name="Parcel Content">
+ Parcel Content
+ </string>
+ <string name="Object Management">
+ Object Management
+ </string>
+ <string name="Accounting">
+ Accounting
+ </string>
+ <string name="Notices">
+ Notices
+ </string>
+ <string name="Chat">
+ 聊天
+ </string>
+ <string name="DeleteItems">
+ Delete selected items?
+ </string>
+ <string name="DeleteItem">
+ Delete selected item?
+ </string>
+ <string name="EmptyOutfitText">
+ There are no items in this outfit
+ </string>
+ <string name="ExternalEditorNotSet">
+ Select an editor using the ExternalEditor setting.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Cannot find the external editor you specified.
+Try enclosing path to the editor with double quotes.
+(e.g. &quot;/path to my/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error parsing the external editor command.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ External editor failed to run.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Left">
+ Left
+ </string>
+ <string name="Right">
+ Right
+ </string>
+ <string name="Up">
+ Up
+ </string>
+ <string name="Down">
+ Down
+ </string>
+ <string name="Home">
+ Home
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Add
+ </string>
+ <string name="Subtract">
+ Subtract
+ </string>
+ <string name="Multiply">
+ Multiply
+ </string>
+ <string name="Divide">
+ Divide
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Viewing particle beacons (blue)
+ </string>
+ <string name="BeaconPhysical">
+ Viewing physical object beacons (green)
+ </string>
+ <string name="BeaconScripted">
+ Viewing scripted object beacons (red)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viewing scripted object with touch function beacons (red)
+ </string>
+ <string name="BeaconSound">
+ Viewing sound beacons (yellow)
+ </string>
+ <string name="BeaconMedia">
+ Viewing media beacons (white)
+ </string>
+ <string name="ParticleHiding">
+ Hiding Particles
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml
new file mode 100644
index 0000000000..33640f5fee
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages>
+ <message_set name="errors">
+ <message name="invalid_tport">
+ Problem encountered processing your teleport request. You may need to log back in before you can teleport.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ Problem encountered processing your region crossing. You may need to log back in before you can cross regions.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Sorry, teleport is currently blocked. Try again in a moment.
+If you still cannot teleport, please log out and log back in to resolve the problem.
+ </message>
+ <message name="nolandmark_tport">
+ Sorry, but system was unable to locate landmark destination.
+ </message>
+ <message name="timeout_tport">
+ Sorry, but system was unable to complete the teleport connection.
+Try again in a moment.
+ </message>
+ <message name="noaccess_tport">
+ Sorry, you do not have access to that teleport destination.
+ </message>
+ <message name="missing_attach_tport">
+ Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport.
+ </message>
+ <message name="too_many_uploads_tport">
+ The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area.
+ </message>
+ <message name="expired_tport">
+ Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes.
+ </message>
+ <message name="expired_region_handoff">
+ Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes.
+ </message>
+ <message name="no_host">
+ Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes.
+ </message>
+ <message name="no_inventory_host">
+ The inventory system is currently unavailable.
+ </message>
+ </message_set>
+ <message_set name="progress">
+ <message name="sending_dest">
+ Sending to destination.
+ </message>
+ <message name="redirecting">
+ Redirecting to different location.
+ </message>
+ <message name="relaying">
+ Relaying to destination.
+ </message>
+ <message name="sending_home">
+ Sending home location request.
+ </message>
+ <message name="sending_landmark">
+ Sending landmark location request.
+ </message>
+ <message name="completing">
+ Completing teleport.
+ </message>
+ <message name="completed_from">
+ Teleport completed from [T_SLURL]
+ </message>
+ <message name="resolving">
+ Resolving destination.
+ </message>
+ <message name="contacting">
+ Contacting new region.
+ </message>
+ <message name="arriving">
+ 抵達中...
+ </message>
+ <message name="requesting">
+ Requesting Teleport...
+ </message>
+ </message_set>
+</teleport_messages>